From a377c01f852883aeb5e852f6a1fb3986a51ef21d Mon Sep 17 00:00:00 2001 From: Shubhamshirva Date: Fri, 7 Jun 2024 15:33:21 +0530 Subject: [PATCH] chat pages completed and also resolved some issues --- assets/images/png/Ellipse 53.png | Bin 0 -> 5048 bytes assets/images/png/Photo.png | Bin 0 -> 2454 bytes assets/images/png/Tailgrey.png | Bin 0 -> 639 bytes assets/images/png/arrow-left (2).png | Bin 0 -> 189 bytes assets/images/png/blockchat.png | Bin 0 -> 371 bytes assets/images/png/camera1.png | Bin 0 -> 494 bytes assets/images/png/chat.png | Bin 0 -> 123 bytes assets/images/png/chat2.png | Bin 0 -> 123 bytes assets/images/png/chat3.png | Bin 0 -> 123 bytes assets/images/png/chat4.png | Bin 0 -> 6246 bytes assets/images/png/chat5.png | Bin 0 -> 5659 bytes assets/images/png/chat6.png | Bin 0 -> 5529 bytes assets/images/png/chatgroup.png | Bin 0 -> 626 bytes assets/images/png/deletetred.png | Bin 0 -> 498 bytes assets/images/png/editicon.png | Bin 0 -> 281 bytes assets/images/png/groupchat.png | Bin 0 -> 4238 bytes assets/images/png/groupchat2.png | Bin 0 -> 2531 bytes assets/images/png/groupchat3.png | Bin 0 -> 2431 bytes assets/images/png/groupchat4.png | Bin 0 -> 2304 bytes assets/images/png/messagedelivered.png | Bin 0 -> 197 bytes assets/images/png/messagereadcheckmark.png | Bin 0 -> 207 bytes assets/images/png/mute.png | Bin 0 -> 331 bytes assets/images/png/noto_soccer-ball.png | Bin 0 -> 705 bytes assets/images/png/pin.png | Bin 0 -> 301 bytes assets/images/png/profile.png | Bin 0 -> 487 bytes assets/images/png/vertical3dots.png | Bin 0 -> 172 bytes lib/Common/controller/MainController.dart | 3 +- lib/Common/controller/MainScreen.dart | 1 + .../Chats/View/chatsmainscreen.dart | 878 ++++++++++++++++++ .../Main_Screens/Chats/View/groupchat.dart | 713 ++++++++++++++ .../Main_Screens/Chats/View/newchatpage.dart | 300 ++++++ .../Main_Screens/Chats/View/newgroup.dart | 365 ++++++++ .../Main_Screens/Chats/View/userchat.dart | 676 ++++++++++++++ lib/Login/View/loginscreen.dart | 6 +- lib/Utils/texts.dart | 11 + lib/onboarding/Signup/View/signupendpage.dart | 4 +- lib/onboarding/Signup/View/signupscreen.dart | 2 +- lib/resources/routes/route_name.dart | 7 + lib/resources/routes/routes.dart | 24 + 39 files changed, 2985 insertions(+), 5 deletions(-) create mode 100644 assets/images/png/Ellipse 53.png create mode 100644 assets/images/png/Photo.png create mode 100644 assets/images/png/Tailgrey.png create mode 100644 assets/images/png/arrow-left (2).png create mode 100644 assets/images/png/blockchat.png create mode 100644 assets/images/png/camera1.png create mode 100644 assets/images/png/chat.png create mode 100644 assets/images/png/chat2.png create mode 100644 assets/images/png/chat3.png create mode 100644 assets/images/png/chat4.png create mode 100644 assets/images/png/chat5.png create mode 100644 assets/images/png/chat6.png create mode 100644 assets/images/png/chatgroup.png create mode 100644 assets/images/png/deletetred.png create mode 100644 assets/images/png/editicon.png create mode 100644 assets/images/png/groupchat.png create mode 100644 assets/images/png/groupchat2.png create mode 100644 assets/images/png/groupchat3.png create mode 100644 assets/images/png/groupchat4.png create mode 100644 assets/images/png/messagedelivered.png create mode 100644 assets/images/png/messagereadcheckmark.png create mode 100644 assets/images/png/mute.png create mode 100644 assets/images/png/noto_soccer-ball.png create mode 100644 assets/images/png/pin.png create mode 100644 assets/images/png/profile.png create mode 100644 assets/images/png/vertical3dots.png create mode 100644 lib/Feed Module/Main_Screens/Chats/View/chatsmainscreen.dart create mode 100644 lib/Feed Module/Main_Screens/Chats/View/groupchat.dart create mode 100644 lib/Feed Module/Main_Screens/Chats/View/newchatpage.dart create mode 100644 lib/Feed Module/Main_Screens/Chats/View/newgroup.dart create mode 100644 lib/Feed Module/Main_Screens/Chats/View/userchat.dart diff --git a/assets/images/png/Ellipse 53.png b/assets/images/png/Ellipse 53.png new file mode 100644 index 0000000000000000000000000000000000000000..03304e2ab84733d9c2e4f16da54444ce4e812a36 GIT binary patch literal 5048 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 O0000~L~=lg3l|G>b&z~~nS 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/blockchat.png b/assets/images/png/blockchat.png new file mode 100644 index 0000000000000000000000000000000000000000..1da999c21f4cd2b840d79ec2298fd676014c0154 GIT binary patch literal 371 zcmV-(0gV2MP)o+oXpR3L~*Git`f zu(XCeKa5WDDi%yC87&H>$hbm$pkllj3wWiva3iGQl(gqMQ5|x$z|mbL26G$KmHx{X zj_ye22#Ukjw@hAdvIOy0_E(Qa_Xk3*plCD-+ie1bWI^omq&ACTQj#EAWo1DTVyYlr zI!hJwoyo{lDiT+M=-GJV^_yX0VntER{CF^ifZ&rcZx&-Cbms7QPJ?GHRS=WY`AIjM zb*7;Gn@!KIB>IHi)i~_SDHjeqPqd=_eP)n%_g%ctC=~KY`b5H^4f(g}bG8a99lfC(rQP)1;arV}(9#GRnoAUrk7UE+%qxyfJi?%u^G z%X+pf>q0bRhM+9V_i`Ao+IU9egn$t~Irt4`9=8~L1RsnsmO_OgvcM+-7Y*~z$=R4Y z@^6m)_n-woTO!7!)CWEpn0wL~(E#8Rd)DUQeQPt$!o8gI4J;Z{1$Ld00=#r7vYlMCN~hn{&$0SFO3g10^M5w+j` zWWt=vr>+hrHcs;|DG?&Prs_moy$M&aFrlj2E$(`)4W<@GP!{Ft-BI=X&h$>I~%Yx0&c3+RXG;!iMi*lkV;F_f-8RKogMfQ7=zS(hQ_l2 kE*f>iA3z~5V#bBxA87AE{mE}9GXMYp07*qoM6N<$g1ZUHGynhq literal 0 HcmV?d00001 diff --git a/assets/images/png/chat.png b/assets/images/png/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..04cc712f24b2ecf0100a4c9b415783d8f8fba087 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl&H|6fVg?3oVGw3ym^DWNq@p;; z-HBn{IhmJ04okYDuOkD)#(wTUiL5}rfTxRNNChJ!E5on literal 0 HcmV?d00001 diff --git a/assets/images/png/chat2.png b/assets/images/png/chat2.png new file mode 100644 index 0000000000000000000000000000000000000000..04cc712f24b2ecf0100a4c9b415783d8f8fba087 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl&H|6fVg?3oVGw3ym^DWNq@p;; z-HBn{IhmJ04okYDuOkD)#(wTUiL5}rfTxRNNChJ!E5on literal 0 HcmV?d00001 diff --git a/assets/images/png/chat3.png b/assets/images/png/chat3.png new file mode 100644 index 0000000000000000000000000000000000000000..04cc712f24b2ecf0100a4c9b415783d8f8fba087 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl&H|6fVg?3oVGw3ym^DWNq@p;; z-HBn{IhmJ04okYDuOkD)#(wTUiL5}rfTxRNNChJ!E5on literal 0 HcmV?d00001 diff --git a/assets/images/png/chat4.png b/assets/images/png/chat4.png new file mode 100644 index 0000000000000000000000000000000000000000..b876aa916a26a8d92023e3f377094402050a031a GIT binary patch literal 6246 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 bH*ow9d~*o6t(%Q^00000NkvXXu0mjf=?9|< literal 0 HcmV?d00001 diff --git a/assets/images/png/chatgroup.png b/assets/images/png/chatgroup.png new file mode 100644 index 0000000000000000000000000000000000000000..5054c5b39fd50fc091b01c29cc0b3a9470b7fc3f GIT binary patch literal 626 zcmV-&0*(ENP)qO9yg@TUM#u;mAsfI3O(%d2=mw+{1SUv2L12PZYMwz2b}+fZ7w=AIBRNm9 zEXxo*@gU4-0=lk?crYx{Y&I+D5n!hamX>A5QewWKdx9Oj!&#(shGoODqI-ae6PDUz zi^L{tC=hcBN6PZyGVnPcU`r_wFGB^=n6b#%u#`+JqmlUtmpFg*aC{=T6XpY_hKGtJ zfl9_L>thha3Co(!qcJ zXcy$_JdI8x1;WE|aqg}UGjyj0W3FsMQh>-p0$b@cgJY*S5}E=;zJ(7 zhKtvZRMk_?3`N*tZg=hOUZ~JSrRg-E0#tj9d4nQ6wcI%jhWbZ9UKiV8ME6b8v8VH+ zq92X3W9nPt7t4C^aZCRL*^Jc69#8BgRC>~&j^pOA-73Xz6LhTKhu)>e;egB&Z+;a%^woqxjmuq1G3b%hyGR?!2kdN M07*qoM6N<$f{1btwg3PC literal 0 HcmV?d00001 diff --git a/assets/images/png/deletetred.png b/assets/images/png/deletetred.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4ff5b1dc7308405458570289520ce246540600 GIT binary patch literal 498 zcmVhyN(! z%M%+5^$jDe(aXrwD$QUb>S}rFD87yyG}UW{-6HBLRlC&E$jyyN_qKY6`jdiT`dnwzXkgBbIGFi z#@4h%U100@!N+GVS)5jiTBQbxPzj@CesViaMwnnu#mY$8^8QNYK$bG4Cp{wWz?gg5 zo>iYsT4eeekT4?Bv1m2M4H(@#1fM3;+NC07*qoM6N<$f`Vw=kN^Mx literal 0 HcmV?d00001 diff --git a/assets/images/png/editicon.png b/assets/images/png/editicon.png new file mode 100644 index 0000000000000000000000000000000000000000..e27c37f0348bb6666bbd32c66356da2443ab119a GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIoCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{yI+=$B+ufw^IXo4;%2f@H;8898%ypBw-?O zETPqaO}52Iv&Bh*<$Pe?B=gYFr511f=amFq=HG8IQD#A*iBi$ko>|M)4oK_%nsCN@ zvw`d$gQgRu%V(N0+ZZ&>pZogzls>+t5(no_ni>0Ln=!xR6RR1!Cp=pGOMJ~A`G7-h z3-X)PZs>M|vg%Abb|}R6KvVbIMQslbHJP6*&MXlP__VkGNc1OZ!H1ns5~o{nWXw6r Zell^I%rk&wO2WO_!PG&j-{*gkb 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/groupchat3.png b/assets/images/png/groupchat3.png new file mode 100644 index 0000000000000000000000000000000000000000..8c102dc7d6bf014c5741aa79cf90ae475aa1dbeb GIT binary patch literal 2431 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/groupchat4.png b/assets/images/png/groupchat4.png new file mode 100644 index 0000000000000000000000000000000000000000..edf9f0ccab978cf842c8aca0d4809ec3e6b1f538 GIT binary patch literal 2304 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 a_5K5($To%<;?fcT0000``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBew3$+V@L(#+rGP;4F&?ui!C~oEt(dWDBpE3 zFJv`;p>bU#N@J=0_3w28OvhDOW{3z*?6&&!dl`q_mexNK2iaF{|6UUGJEMU2U30vS n$1*7mb*WRUmYH$o`K+=C%C-$rNXvT#w1vUb)z4*}Q$iB}7_~eL literal 0 HcmV?d00001 diff --git a/assets/images/png/messagereadcheckmark.png b/assets/images/png/messagereadcheckmark.png new file mode 100644 index 0000000000000000000000000000000000000000..cb920f85b78506f31a05c9100ba45fc71f4dabe7 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^{2``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBeu}4yV@L(#+y0B32NZZ*WEU!1IJv*jkXMLZFBt8W5-#ae&Zjyv?=+usw1l9V6SmBxj-v3zmZv0a?6K1y3yzO`8 wgrFVdQ&MBb@09i&rS^xk5 literal 0 HcmV?d00001 diff --git a/assets/images/png/mute.png b/assets/images/png/mute.png new file mode 100644 index 0000000000000000000000000000000000000000..843ccb0eb51b58b7bb43e5c1aa8e680a3719f970 GIT binary patch literal 331 zcmV-R0kr;!P)+bsNzw3;d zy+p*qwvqT6R>pF4axQNbf!Gb!(T-Dqr4NL^=eL@x>nEK8bIH{JWdEwS#^aE0Aj_?2 z6@k1_*i!i!+sy((yMr}jz>rqTx3C8|PuD@)Z~=Xb{wW2v_JgTF4ZDve_(13kyO@|* z7OsYDBrcQAkYzC3W=Fr(@FXAyNX# d`JoG&mtHONNj{ZiE@S`z002ovPDHLkV1f=_hUEYN literal 0 HcmV?d00001 diff --git a/assets/images/png/noto_soccer-ball.png b/assets/images/png/noto_soccer-ball.png new file mode 100644 index 0000000000000000000000000000000000000000..7604c931d6bd38df75d736e33c4dec15726db372 GIT binary patch literal 705 zcmV;y0zUnTP)xK~#7FjZM#GtlE((H#)Ikwz1r;kWBO-&)1{Dl#NiY^& z>??E<>%v&m{ZvY=W>8vljr?+@mY}lrb-pjOSrU6L&f$H}^PclQ&&wgGfM77#!t;Dn zZEda0dE1?O8+#Xi?D6>VKkVM4)!*uK#?t9DzZ{pZT;Ke${jmSI_z77}Zb z`0~}X=``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{vl5n$B+ufx05gO9x~u@kySgvA<1a=fEZ4?QfXLe&TY}fj!U7H>zYf zm*y-yttEQUw5a5zIj%HKI+5m>B;_Jo@+h^$@uo5rRTW>~mP3cO za#}frpE!MYb8()Mt7+rf`wo&OQ)=RO^~8nTWAf$r_igLd3xc;C%Qv~)`f_5q>$yc+ uRxgiwB71D+=PlONt6Y1mvP}NXQomN|zkK?n|Nnu$VeoYIb6Mw<&;$T@TXGcu literal 0 HcmV?d00001 diff --git a/assets/images/png/profile.png b/assets/images/png/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..693fbb0db43f19e615c09bd15a15f6ecc85bc2ee GIT binary patch literal 487 zcmVJ$@2Pq9JM&FW650mRP8BpdiD=h>o}= zS|QF7cYZ*{c`6auf>vFCS&oSX>?J4Ja^5PhiNf{VQDDn9lC*(uhvbb=*iB}P;B6$> zU~V=@_QG!X4BBvOUg&b{zyvlY6dfDLSyHUUhIH4>17Tx5R*>1Ao_;Ri;& d_OW|E#}C=u{gvwq@d^L{002ovPDHLkV1k(~(qaGr literal 0 HcmV?d00001 diff --git a/assets/images/png/vertical3dots.png b/assets/images/png/vertical3dots.png new file mode 100644 index 0000000000000000000000000000000000000000..26f216cfb215a7ad9787c009d8c310a541ab2fe5 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&8!3HF2>gs<0Db50q$YKTtZeb8+WSBKa0w~B> z9OUlAubP0l+XkK{Zlk+ literal 0 HcmV?d00001 diff --git a/lib/Common/controller/MainController.dart b/lib/Common/controller/MainController.dart index 6832ca5..997b2a1 100644 --- a/lib/Common/controller/MainController.dart +++ b/lib/Common/controller/MainController.dart @@ -1,4 +1,5 @@ import 'package:get/get.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/Chats/View/chatsmainscreen.dart'; import 'package:regroup/Feed%20Module/Main_Screens/Community/Community.dart'; class MainController extends GetxController { @@ -8,7 +9,7 @@ class MainController extends GetxController { const CommunityScreen(), const CommunityScreen(), const CommunityScreen(), - const CommunityScreen(), + const ChatsMainScreen(), const CommunityScreen(), ].obs; diff --git a/lib/Common/controller/MainScreen.dart b/lib/Common/controller/MainScreen.dart index ba6cbe8..2018873 100644 --- a/lib/Common/controller/MainScreen.dart +++ b/lib/Common/controller/MainScreen.dart @@ -10,6 +10,7 @@ class MainScreen extends StatelessWidget { Widget build(BuildContext context) { return Obx(() { return Scaffold( + resizeToAvoidBottomInset: false, body: mainController.currentTab[mainController.selectedIndex.value], ); }); diff --git a/lib/Feed Module/Main_Screens/Chats/View/chatsmainscreen.dart b/lib/Feed Module/Main_Screens/Chats/View/chatsmainscreen.dart new file mode 100644 index 0000000..8217c5e --- /dev/null +++ b/lib/Feed Module/Main_Screens/Chats/View/chatsmainscreen.dart @@ -0,0 +1,878 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:regroup/Common/CommonBottomNavigationBar.dart'; +import 'package:regroup/Common/controller/MainScreen.dart'; +import 'package:regroup/Utils/Common/CustomTextformfield.dart'; +import 'package:regroup/Utils/Common/blureffect.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; + +class ChatsMainScreen extends StatefulWidget { + const ChatsMainScreen({super.key}); + + @override + State createState() => _ChatsMainScreenState(); +} + +class _ChatsMainScreenState extends State { + TextEditingController searchcontroller = TextEditingController(); + GlobalKey _scaffoldKey1 = GlobalKey(); + + List chatcontents = [ + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Ryan Dorwart", + 'subtittle': "Lorem Ipsum is simply dummy text . . .", + 'messageread': true, + 'actstatus': true, + 'pinned': true, + }, + { + 'image': "assets/images/png/Ellipse 48.png", + 'tittle': "Alfonso Rosser", + 'subtittle': "Lorem Ipsum is simply dummy text . . .", + 'messageread': true, + 'actstatus': true, + 'pinned': false, + }, + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Tatiana Kenter", + 'subtittle': "Lorem Ipsum is simply dummy text . . .", + 'messageread': true, + 'actstatus': true, + 'pinned': false, + }, + { + 'image': "assets/images/png/Ellipse 48.png", + 'tittle': "Ahmad Rhiel Madsen", + 'subtittle': "Lorem Ipsum is simply dummy text . . .", + 'messageread': false, + 'actstatus': false, + 'pinned': false, + }, + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Liverpool FC", + 'subtittle': "Lorem Ipsum is simply dummy text . . .", + 'messageread': false, + 'actstatus': false, + 'pinned': false, + }, + { + 'image': "assets/images/png/Ellipse 48.png", + 'tittle': "Abram Westervelt", + 'subtittle': "Lorem Ipsum is simply dummy text . . .", + 'messageread': false, + 'actstatus': false, + 'pinned': false, + } + ]; + + List clubcontents = [ + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Wellness warriors collective", + 'subtittle': "Maria Herwitz : Hello Guys", + 'messageread': true, + }, + { + 'image': "assets/images/png/Ellipse 48.png", + 'tittle': "Body blitz brigade", + 'subtittle': "Maria Herwitz : Hello Guys", + 'messageread': true, + }, + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Wellness warriors collective", + 'subtittle': "Maria Herwitz : Hello Guys", + 'messageread': true, + }, + ]; + + List teamcontents = [ + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Cardio crusaders circle", + 'subtittle': "Maria Herwitz : Hello Guys", + 'messageread': true, + }, + { + 'image': "assets/images/png/Ellipse 48.png", + 'tittle': "Strength squad syndicate", + 'subtittle': "Maria Herwitz : Hello Guys", + 'messageread': true, + }, + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Flexibility faction force", + 'subtittle': "Maria Herwitz : Hello Guys", + 'messageread': true, + }, + ]; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + resizeToAvoidBottomInset: false, + key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + appBar: AppBar( + scrolledUnderElevation: 0.0, + backgroundColor: Color(0xff222935), + elevation: 0, + automaticallyImplyLeading: false, + titleSpacing: 0, + title: Padding( + padding: EdgeInsets.only(left: 16.w), + child: Text( + 'Chats', + style: TextStyle( + fontSize: 23.sp, + fontFamily: 'Helvetica', + color: Colors.white, + fontWeight: FontWeight.w700), + ), + ), + actions: [ + Padding( + padding: EdgeInsets.only(right: 16.w), + child: InkWell( + onTap: () { + Get.toNamed(RouteName.newchatpage); + }, + child: Image.asset('assets/images/png/editicon.png')), + ) + ], + bottom: PreferredSize( + preferredSize: Size.fromHeight(90), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: CustomTextFormField( + textEditingController: searchcontroller, + texttype: TextInputType.text, + hintText: "Search chats", + leadingIcon: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Icon( + Icons.search, + size: 35, + color: Colors.white, + ), + ), + // validatorText: "Enter your full name", + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + ), + ), + ], + ), + ), + ), + body: Stack( + children: [ + const CommonBlurLeftRed(), + const CommonBlurRightRed(), + const CommonBlurLeft(), + const CommonBlurRight(), + Stack( + children: [ + SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 0, + ), + child: Column(children: [ + DefaultTabController( + length: 3, + // initialIndex: selectedIndex.value, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: MyTabBar(), + ), + SizedBox( + height: 600.h, + child: TabBarView( + children: [feedTab(), clubsTab(), teamsTab()], + ), + ), + ], + ), + ), + ])), + ) + ], + ) + ], + ), + bottomNavigationBar: bottomnavigationbar(mainController), + ), + ); + } + + Widget feedTab() { + return SingleChildScrollView( + child: Column( + children: [ + ListView.separated( + separatorBuilder: (context, index) { + return Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ); + }, + itemCount: chatcontents.length, + shrinkWrap: true, + padding: const EdgeInsets.only(top: 10.0), + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Get.toNamed(RouteName.userchatpage); + }, + child: ChatList( + name: chatcontents[index]['tittle'], + imageurl: chatcontents[index]['image'], + message: chatcontents[index]['subtittle'], + isMessageRead: chatcontents[index]['messageread'], + activestatus: chatcontents[index]['actstatus'], + ispinned: chatcontents[index]['pinned'], + count: + (index == 0 || index == 1 || index == 2 || index == 3) + ? true + : false), + ); + }, + ), + ], + ), + ); + } + + Widget clubsTab() { + return SingleChildScrollView( + child: Column( + children: [ + ListView.separated( + separatorBuilder: (context, index) { + return Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ); + }, + itemCount: clubcontents.length, + shrinkWrap: true, + padding: const EdgeInsets.only(top: 10.0), + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Get.toNamed(RouteName.groupchatpage); + }, + child: SecondChatList( + name: clubcontents[index]['tittle'], + imageurl: clubcontents[index]['image'], + message: clubcontents[index]['subtittle'], + isMessageRead: clubcontents[index]['messageread'], + ), + ); + }, + ), + ], + ), + ); + } + + Widget teamsTab() { + return SingleChildScrollView( + child: Column( + children: [ + ListView.separated( + separatorBuilder: (context, index) { + return Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ); + }, + itemCount: teamcontents.length, + shrinkWrap: true, + padding: const EdgeInsets.only(top: 10.0), + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Get.toNamed(RouteName.groupchatpage); + }, + child: SecondChatList( + name: teamcontents[index]['tittle'], + imageurl: teamcontents[index]['image'], + message: teamcontents[index]['subtittle'], + isMessageRead: teamcontents[index]['messageread'], + ), + ); + }, + ), + ], + ), + ); + } +} + +class MyTabBar extends StatelessWidget { + // Set the desired height + + @override + Widget build(BuildContext context) { + return TabBar( + dividerColor: Color(0xFFFFFFFF).withOpacity(0.07), + labelStyle: TextStyle( + fontSize: 14.sp, + color: Color(0xFFFCFCFC), + fontWeight: FontWeight.w400, + fontFamily: 'Helvetica'), + indicatorSize: TabBarIndicatorSize.tab, + indicatorColor: const Color(0xFFD90B2E), + // labelColor: Colors.white, + indicatorWeight: 2.h, + dividerHeight: 2.h, + unselectedLabelColor: Color(0xFFFCFCFC), + overlayColor: MaterialStateProperty.all(const Color(0xFFD90B2E)), + tabs: const [ + Tab( + text: 'Friends', + ), + Tab( + text: 'Clubs', + ), + Tab( + text: 'Teams', + ), + ]); + } +} + +// ignore: must_be_immutable +class ChatList extends StatefulWidget { + String name; + String imageurl; + String message; + bool isMessageRead; + bool activestatus; + bool ispinned; + bool count; + + ChatList({ + Key? key, + required this.name, + required this.imageurl, + required this.message, + required this.isMessageRead, + required this.activestatus, + required this.ispinned, + required this.count, + }) : super(key: key); + + @override + State createState() => _ChatListState(); +} + +class _ChatListState extends State { + void _showContextMenu(BuildContext context, Offset offset) { + showMenu( + color: Color(0XFf222935), + context: context, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.r)), + position: + RelativeRect.fromLTRB(offset.dx, offset.dy, offset.dx, offset.dy), + items: [ + PopupMenuItem( + value: 0, + child: Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Mute chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/mute.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ]), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Pin chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/pin.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 2, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Delete chat", style: TextStyle(color: Colors.red)), + // Icon(Icons.delete, color: Colors.red), + Image.asset( + 'assets/images/png/deletetred.png', + width: 19.w, + height: 19.h, + ) + ], + ), + ), + ], + ).then((value) { + if (value != null) { + _onMenuItemSelected(value); + } + }); + } + + void _onMenuItemSelected(int value) { + switch (value) { + case 0: + // Mute chat + print('Mute chat selected'); + break; + case 1: + // Pin chat + print('Pin chat selected'); + break; + case 2: + // Delete chat + print('Delete chat selected'); + break; + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onLongPressStart: (details) { + _showContextMenu(context, details.globalPosition); + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 5.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Stack(children: [ + Container( + width: 55, + height: 55, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(widget.imageurl), + fit: BoxFit.fill, + ), + ), + ), + Positioned( + top: 40, + left: 45, + child: widget.activestatus == true + ? Container( + width: 10, + height: 10, + decoration: ShapeDecoration( + color: Color(0xFF32D74B), + shape: OvalBorder(), + ), + ) + : Container( + width: 10, + height: 10, + decoration: ShapeDecoration( + color: Color(0xFFFF453A), + shape: OvalBorder(), + )), + ) + ]), + Padding( + padding: EdgeInsets.only(top: 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16400white(widget.name), + sizedBoxHeight(3.h), + Row( + children: [ + widget.isMessageRead == true + ? Image.asset( + 'assets/images/png/messagereadcheckmark.png') + : Image.asset( + 'assets/images/png/messagedelivered.png'), + sizedBoxWidth(5.w), + Text( + widget.message, + style: TextStyle( + color: Color(0xCCFCFCFC), + fontSize: 12.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.only(top: 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + text12400white('Yesterday'), + sizedBoxHeight(5.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + widget.ispinned == true + ? Image.asset('assets/images/png/pin.png') + : SizedBox( + width: 25, + ), + sizedBoxWidth(3.w), + widget.count == true + ? Container( + width: 18, + height: 18, + decoration: ShapeDecoration( + color: Color(0xFFD90B2E), + shape: OvalBorder(), + ), + child: Text( + '1', + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xFFFCFCFC), + fontSize: 12.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + ) + : SizedBox() + ], + ) + ], + ), + ) + ], + ), + ), + ); + } +} + +class SecondChatList extends StatefulWidget { + final String name; + final String imageurl; + final String message; + final bool isMessageRead; + + SecondChatList({ + Key? key, + required this.name, + required this.imageurl, + required this.message, + required this.isMessageRead, + }) : super(key: key); + + @override + State createState() => _SecondChatListState(); +} + +class _SecondChatListState extends State { + void _showContextMenu(BuildContext context, Offset offset) { + showMenu( + color: Color(0XFf222935), + context: context, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.r)), + position: + RelativeRect.fromLTRB(offset.dx, offset.dy, offset.dx, offset.dy), + items: [ + PopupMenuItem( + value: 0, + child: Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Mute chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/mute.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ]), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Pin chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/pin.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 2, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Delete chat", style: TextStyle(color: Colors.red)), + // Icon(Icons.delete, color: Colors.red), + Image.asset( + 'assets/images/png/deletetred.png', + width: 19.w, + height: 19.h, + ) + ], + ), + ), + ], + ).then((value) { + if (value != null) { + _onMenuItemSelected(value); + } + }); + } + + void _onMenuItemSelected(int value) { + switch (value) { + case 0: + // Mute chat + print('Mute chat selected'); + break; + case 1: + // Pin chat + print('Pin chat selected'); + break; + case 2: + // Delete chat + print('Delete chat selected'); + break; + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onLongPressStart: (details) { + _showContextMenu(context, details.globalPosition); + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 5.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 55, + height: 55, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(widget.imageurl), + fit: BoxFit.fill, + ), + ), + ), + SizedBox(width: 10.w), // Add some spacing between image and text + Expanded( + child: Padding( + padding: EdgeInsets.only(top: 5.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.name, + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + SizedBox(height: 3.h), + Row( + children: [ + widget.isMessageRead + ? Image.asset( + 'assets/images/png/messagereadcheckmark.png') + : Image.asset( + 'assets/images/png/messagedelivered.png'), + SizedBox(width: 5.w), + Text( + widget.message, + style: TextStyle( + color: Color(0xCCFCFCFC), + fontSize: 12.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 10), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.end, // Align to the end of the column + children: [ + Text( + 'Yesterday', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +// class SecondChatList extends StatefulWidget { +// String name; +// String imageurl; +// String message; +// bool isMessageRead; + + +// SecondChatList({ +// Key? key, +// required this.name, +// required this.imageurl, +// required this.message, +// required this.isMessageRead, +// }) : super(key: key); + +// @override +// State createState() => _SecondChatListState(); +// } + +// class _SecondChatListState extends State { +// @override +// Widget build(BuildContext context) { +// return Padding( +// padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 5.h), +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Container( +// width: 55, +// height: 55, +// decoration: BoxDecoration( +// image: DecorationImage( +// image: AssetImage(widget.imageurl), +// fit: BoxFit.fill, +// ), +// ), +// ), +// Padding( +// padding: EdgeInsets.only(top: 5), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// text16400white(widget.name), +// sizedBoxHeight(3.h), +// Row( +// children: [ +// widget.isMessageRead == true +// ? Image.asset( +// 'assets/images/png/messagereadcheckmark.png') +// : Image.asset('assets/images/png/messagedelivered.png'), +// sizedBoxWidth(5.w), +// Text( +// widget.message, +// style: TextStyle( +// color: Color(0xCCFCFCFC), +// fontSize: 12.sp, +// fontFamily: 'Helvetica', +// fontWeight: FontWeight.w400, +// ), +// ), +// ], +// ), +// ], +// ), +// ), +// Padding( +// padding: const EdgeInsets.only(top: 5), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// text12400white('Yesterday'), +// ], +// ), +// ) +// ], +// ), +// ); +// } +// } diff --git a/lib/Feed Module/Main_Screens/Chats/View/groupchat.dart b/lib/Feed Module/Main_Screens/Chats/View/groupchat.dart new file mode 100644 index 0000000..5337ebf --- /dev/null +++ b/lib/Feed Module/Main_Screens/Chats/View/groupchat.dart @@ -0,0 +1,713 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:glassmorphism/glassmorphism.dart'; +import 'package:regroup/Common/CommonGlassmorphism.dart'; +import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Utils/Common/ImageUpload.dart'; +import 'package:regroup/Utils/Common/blureffect.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; + +class GroupChatPage extends StatefulWidget { + const GroupChatPage({super.key}); + + @override + State createState() => _GroupChatPageState(); +} + +class _GroupChatPageState extends State { + ScrollController myController = ScrollController(); + + List messages = [ + ChatMessage( + messageContent: "That sounds great! I’m in. What time works for you?", + messageType: "receiver", + isread: true, + image: 'assets/images/png/Photo.png'), + ChatMessage( + messageContent: + "Lorem ipsum is simply dummy text of the printing and typesetting industry.", + messageType: "sender", + isread: true, + image: 'assets/images/png/groupchat2.png'), + ChatMessage( + messageContent: + "Lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.", + messageType: "receiver", + isread: true, + image: 'assets/images/png/groupchat3.png'), + ChatMessage( + messageContent: "That sounds great! I’m in. What time works for you?", + messageType: "receiver", + isread: true, + image: 'assets/images/png/groupchat4.png'), + ]; + + String? attachimage; + + final messageController = TextEditingController(); + + bool isImageAdded = false; + + void _showContextMenu(BuildContext context, Offset offset) { + showMenu( + color: Color(0XFf222935), + context: context, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.r)), + position: + RelativeRect.fromLTRB(offset.dx, offset.dy, offset.dx, offset.dy), + items: [ + PopupMenuItem( + value: 0, + child: Column(children: [ + sizedBoxHeight(10.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Mute chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/mute.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ]), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Pin chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/pin.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Search", style: TextStyle(color: Colors.white)), + Icon( + Icons.search, + size: 35, + color: Colors.white, + ), + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Profile", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/profile.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Block chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/blockchat.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 2, + child: Padding( + padding: EdgeInsets.only(bottom: 10.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Delete chat", style: TextStyle(color: Colors.red)), + // Icon(Icons.delete, color: Colors.red), + Image.asset( + 'assets/images/png/deletetred.png', + width: 19.w, + height: 19.h, + ) + ], + ), + ), + ), + ], + ).then((value) { + if (value != null) { + _onMenuItemSelected(value); + } + }); + } + + void _onMenuItemSelected(int value) { + switch (value) { + case 0: + // Mute chat + print('Mute chat selected'); + break; + case 1: + // Pin chat + print('Pin chat selected'); + break; + case 2: + // Delete chat + print('Search chat selected'); + break; + case 3: + // Pin chat + print('Profile chat selected'); + break; + case 4: + // Pin chat + print('block chat selected'); + break; + case 5: + // Pin chat + print('delete chat selected'); + break; + } + } + + void _sendMessage() { + if (messageController.text.isNotEmpty) { + setState(() { + messages.add(ChatMessage( + messageContent: messageController.text, + messageType: "sender", + isread: false, + image: 'assets/images/png/groupchat2.png')); + messageController.clear(); + }); + } + } + + @override + Widget build(BuildContext context) { + Timer(const Duration(milliseconds: 50), + () => myController.jumpTo(myController.position.maxScrollExtent)); + return GestureDetector( + onTap: () { + Get.focusScope?.unfocus(); + }, + child: Scaffold( + backgroundColor: Color.fromARGB(255, 18, 32, 47), + appBar: AppBar( + elevation: 0, + automaticallyImplyLeading: false, + backgroundColor: Color(0xFF222935).withOpacity(0.50), + flexibleSpace: SafeArea( + child: Container( + // height: 90.h, + padding: EdgeInsets.only(right: 10.w, left: 4.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + Get.back(); + }, + child: Row( + children: [ + sizedBoxWidth(10.w), + commonGlassContainer( + border: 0.9, + width: 40.w, + height: 40.h, + borderradius: 100, + customWidget: Center( + child: Image.asset( + 'assets/images/png/appbararrowbutton.png') + // Icon( + // Icons.arrow_back, + // color: Colors.white, + // size: 20.sp, + // ), + ), + ), + ], + )), + SizedBox( + width: 18.w, + ), + Container( + width: 40.h, + height: 40.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25.h), + image: DecorationImage( + image: + AssetImage("assets/images/png/groupchat.png"), + fit: BoxFit.fill)), + ), + SizedBox( + width: 12.w, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Text( + 'Liverpool FC', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w400, + color: Colors.white), + ), + sizedBoxWidth(4.w), + Image.asset( + 'assets/images/png/noto_soccer-ball.png') + ], + ), + SizedBox( + height: 2.h, + ), + Text( + "Ryan, Jaxson, Dulce, Nolan ", + style: TextStyle( + color: Color(0xffFCFCFC).withOpacity(0.80), + fontSize: 12.sp, + fontWeight: FontWeight.w400), + ), + ], + ), + ), + InkWell( + onTapDown: (details) { + _showContextMenu(context, details.globalPosition); + }, + child: Container( + width: 30, + height: 20, + child: Image.asset( + 'assets/images/png/vertical3dots.png'))) + + // ignore: prefer_const_constructors + ], + ), + ), + ), + ), + body: Stack( + children: [ + const CommonBlurLeftRed(), + const CommonBlurRightRed(), + const CommonBlurLeft(), + GlassmorphicContainer( + width: MediaQuery.of(context).size.width, + height: + // 500.h, + MediaQuery.of(context).size.height, + borderRadius: 2, + blur: 10, + alignment: Alignment.bottomLeft, + border: 2, + linearGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + ], + ), + borderGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + ], + ), + child: Stack( + children: [ + ListView.builder( + controller: myController, + itemCount: messages.length, + padding: const EdgeInsets.only(top: 10.0, bottom: 70.0), + physics: const BouncingScrollPhysics(), + itemBuilder: (context, index) { + return messages[index].messageType == "receiver" + ? Padding( + padding: const EdgeInsets.only( + left: 16.0, + top: 5.0, + bottom: 5.0, + right: 90.0), + child: Align( + alignment: Alignment.topLeft, + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + width: 30, + height: 30, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage( + messages[index].image, + ), + fit: BoxFit.fill, + ), + shape: OvalBorder(), + ), + ), + sizedBoxWidth(2.w), + Flexible( + child: Container( + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: Alignment(1.00, -0.03), + end: Alignment(-1, 0.03), + colors: [ + Colors.white.withOpacity( + 0.05999999865889549), + Colors.white.withOpacity( + 0.07999999821186066) + ], + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + bottomRight: + Radius.circular(20), + ), + ), + ), + padding: const EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + messages[index].messageContent, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w400, + fontFamily: 'Helvetica', + ), + ), + sizedBoxHeight(2.h), + messages[index].isread == true + ? Image.asset( + 'assets/images/png/messagereadcheckmark.png') + : Image.asset( + 'assets/images/png/messagedelivered.png'), + ], + ), + ), + ) + ], + ), + ), + ) + : Padding( + padding: const EdgeInsets.only( + right: 16.0, + top: 5.0, + bottom: 5.0, + left: 90.0), + child: Align( + alignment: Alignment.topRight, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + children: [ + Flexible( + child: Container( + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: Alignment(1.00, 0.05), + end: Alignment(-1, -0.05), + colors: [ + Color(0xFFD90B2E), + Color(0x38D90B2E) + ], + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + bottomLeft: + Radius.circular(20), + )), + ), + padding: + const EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Text( + messages[index] + .messageContent, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontFamily: 'Helvetica', + fontWeight: + FontWeight.w400, + ), + ), + sizedBoxHeight(2.h), + messages[index].isread == true + ? Image.asset( + 'assets/images/png/messagereadcheckmark.png') + : Image.asset( + 'assets/images/png/messagedelivered.png'), + ], + ), + ), + ), + sizedBoxWidth(2.w), + Container( + width: 30, + height: 30, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage( + messages[index].image, + ), + fit: BoxFit.fill, + ), + shape: OvalBorder(), + ), + ), + ], + ), + ], + ), + ), + ); + }, + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.only(top: 15, bottom: 15), + child: Row( + children: [ + sizedBoxWidth(16.w), + Expanded( + child: GlassmorphicContainer( + width: double.infinity, + height: 48.h, + borderRadius: 30.r, + blur: 10, + alignment: Alignment.bottomCenter, + border: 0.8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.50), + const Color(0xFFFFFFFF).withOpacity(0.50), + ], + stops: [ + 0.1, + 1, + ]), + borderGradient: const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff434A53), + Color(0xFF434A53), + ], + ), + child: TextFormField( + controller: messageController, + inputFormatters: [ + RemoveEmojiInputFormatter(), + ], + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + autovalidateMode: + AutovalidateMode.onUserInteraction, + decoration: InputDecoration( + contentPadding: const EdgeInsets.all(10.0), + filled: true, + fillColor: Color(0XFF434A53), + border: InputBorder.none, + hintStyle: TextStyle( + fontSize: 14.sp, + color: + Color(0XFFFCFCFC).withOpacity(0.80), + fontWeight: FontWeight.w400, + fontFamily: 'Helvetica'), + hintText: "Type your message", + suffixIcon: messageController + .text.isNotEmpty || + isImageAdded == true + ? GestureDetector( + // onTap: () => _chatItemsAdd(), + onTap: _sendMessage, + // () { + // setState(() { + // // UploadData(); + // messageController.clear(); + // }); + // }, + // => UploadData(), + + child: Padding( + padding: EdgeInsets.only( + right: 8.w, + top: 2.h, + bottom: 2.h), + child: Container( + width: 45.w, + height: 30.h, + decoration: BoxDecoration( + color: Color(0xFFD90B2E), + borderRadius: + BorderRadius.circular( + 30.r)), + child: Center( + child: Icon( + Icons.send_outlined, + color: Colors.white, + ) + // Text( + // 'Send', + // style: TextStyle( + // color: Colors.white, + // fontSize: 16.sp), + // ) + )), + ), + ) + : IconButton( + onPressed: () { + ImageUploadBottomSheet() + .showModal( + context, + true, + (result) { + attachimage = result; + var filenameresult = + extractFileName(result); + + messageController.text = + filenameresult; + setState(() { + isImageAdded = true; + }); + }, + ); + }, + icon: Icon( + Icons.attach_file, + color: Colors.white, + size: 23.h, + ), + ), + ), + minLines: 1, + maxLines: 1, + onChanged: (text) { + setState(() { + + }); + }, + ), + ), + ), + sizedBoxWidth(12.w), + ], + ), + ), + ), + ], + )), + ], + ), + ), + ); + } +} + +class ChatMessage { + String messageContent; + String messageType; + bool isread; + String image; + ChatMessage({ + required this.messageContent, + required this.messageType, + required this.isread, + required this.image, + }); +} diff --git a/lib/Feed Module/Main_Screens/Chats/View/newchatpage.dart b/lib/Feed Module/Main_Screens/Chats/View/newchatpage.dart new file mode 100644 index 0000000..f38367c --- /dev/null +++ b/lib/Feed Module/Main_Screens/Chats/View/newchatpage.dart @@ -0,0 +1,300 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:glassmorphism/glassmorphism.dart'; +import 'package:regroup/Utils/Common/CommonAppbar.dart'; +import 'package:regroup/Utils/Common/CustomTextformfield.dart'; +import 'package:regroup/Utils/Common/blureffect.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; + +class NewChatPage extends StatefulWidget { + const NewChatPage({super.key}); + + @override + State createState() => _NewChatPageState(); +} + +class _NewChatPageState extends State { + TextEditingController searchcontroller = TextEditingController(); + + List chatcontents = [ + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Ryan Dorwart", + 'subtittle': "Row row row your boat", + }, + { + 'image': "assets/images/png/Ellipse 53.png", + 'tittle': "Ahmad Rhiel Madsen", + 'subtittle': "Football fever", + }, + { + 'image': "assets/images/png/chat4.png", + 'tittle': "Kaylynn Vaccaro", + 'subtittle': "The athletic town", + }, + { + 'image': "assets/images/png/chat5.png", + 'tittle': "Kianna Donin", + 'subtittle': "Active alliance network", + }, + { + 'image': "assets/images/png/chat6.png", + 'tittle': "Maria Herwitz", + 'subtittle': "Maria_01", + }, + { + 'image': "assets/images/png/Ellipse 53.png", + 'tittle': "Ahmad Rhiel Madsen", + 'subtittle': "FitFam federation", + }, + { + 'image': "assets/images/png/chat4.png", + 'tittle': "Kaylynn Vaccaro", + 'subtittle': "FitFam federation", + }, + { + 'image': "assets/images/png/chat5.png", + 'tittle': "Kianna Donin", + 'subtittle': "Football fever", + }, + { + 'image': "assets/images/png/chat6.png", + 'tittle': "Maria Herwitz", + 'subtittle': "Row row row your boat", + }, + ]; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + // backgroundColor: Color(0xFF222935), + backgroundColor: Color.fromARGB(255, 18, 32, 47), + + appBar: CommonAppbar(titleTxt: 'New chat'), + body: Stack(children: [ + const CommonBlurLeftRed(), + const CommonBlurRightRed(), + const CommonBlurLeft(), + GlassmorphicContainer( + width: MediaQuery.of(context).size.width, + height: + // 500.h, + MediaQuery.of(context).size.height, + borderRadius: 2, + blur: 10, + alignment: Alignment.bottomLeft, + border: 2, + linearGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + + // Color.fromARGB(255, 18, 32, 47).withOpacity(0.50), + // Color.fromARGB(255, 18, 32, 47).withOpacity(0.50), + // Color.fromARGB(255, 18, 32, 47).withOpacity(0.50), + // Color.fromARGB(255, 18, 32, 47).withOpacity(0.50), + ], + ), + borderGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + // Color.fromARGB(255, 18, 32, 47).withOpacity(0.50), + // Color.fromARGB(255, 18, 32, 47).withOpacity(0.50), + Color(0XFF222935).withOpacity(0.60), + + Color(0XFF222935).withOpacity(0.60), + ], + ), + child: ListView(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: CustomTextFormField( + textEditingController: searchcontroller, + texttype: TextInputType.text, + hintText: "Search people", + leadingIcon: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Icon( + Icons.search, + size: 35, + color: Colors.white, + ), + ), + // validatorText: "Enter your full name", + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + ), + ), + sizedBoxHeight(30.h), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.newgrouppage); + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 50, + height: 50, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage( + 'assets/images/png/chatgroup.png'), + ), + gradient: LinearGradient( + begin: Alignment(0.71, -0.70), + end: Alignment(-0.71, 0.7), + colors: [ + Colors.white.withOpacity(0.30000001192092896), + Colors.white.withOpacity(0.30000001192092896) + ], + ), + shape: OvalBorder( + side: BorderSide( + width: 0.50, color: Color(0xFF434A53)), + ), + ), + ), + sizedBoxWidth(10.w), + text18w400white('New group') + ], + ), + Image.asset('assets/images/png/arrow-left (2).png') + ], + ), + ), + ), + sizedBoxHeight(30.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: text18w700_FCFCFC('Contacts'), + ), + sizedBoxHeight(20.h), + ListView.separated( + separatorBuilder: (context, index) { + return Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ); + }, + itemCount: chatcontents.length, + shrinkWrap: true, + padding: const EdgeInsets.only(top: 10.0), + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () {}, + child: SecondChatList( + name: chatcontents[index]['tittle'], + imageurl: chatcontents[index]['image'], + message: chatcontents[index]['subtittle'], + ), + ); + }, + ), + sizedBoxHeight(20.h), + ], + ), + ]), + ), + ]), + ), + ); + } +} + +class SecondChatList extends StatefulWidget { + final String name; + final String imageurl; + final String message; + + SecondChatList({ + Key? key, + required this.name, + required this.imageurl, + required this.message, + }) : super(key: key); + + @override + State createState() => _SecondChatListState(); +} + +class _SecondChatListState extends State { + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 5.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 55, + height: 55, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(widget.imageurl), + fit: BoxFit.fill, + ), + ), + ), + SizedBox(width: 10.w), // Add some spacing between image and text + Expanded( + child: Padding( + padding: EdgeInsets.only(top: 5.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.name, + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + SizedBox(height: 3.h), + Row( + children: [ + Text( + widget.message, + style: TextStyle( + color: Color(0xCCFCFCFC), + fontSize: 12.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/Feed Module/Main_Screens/Chats/View/newgroup.dart b/lib/Feed Module/Main_Screens/Chats/View/newgroup.dart new file mode 100644 index 0000000..f751dbc --- /dev/null +++ b/lib/Feed Module/Main_Screens/Chats/View/newgroup.dart @@ -0,0 +1,365 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:glassmorphism/glassmorphism.dart'; +import 'package:regroup/Common/controller/MainScreen.dart'; +import 'package:regroup/Utils/Common/CommonAppbar.dart'; +import 'package:regroup/Utils/Common/CustomNextButton.dart'; +import 'package:regroup/Utils/Common/CustomTextformfield.dart'; +import 'package:regroup/Utils/Common/ImageUpload.dart'; +import 'package:regroup/Utils/Common/blureffect.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/texts.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; + +class NewGroupPage extends StatefulWidget { + const NewGroupPage({super.key}); + + @override + State createState() => _NewGroupPageState(); +} + +class _NewGroupPageState extends State { + TextEditingController groupnamecontroller = TextEditingController(); + TextEditingController searchcontroller = TextEditingController(); + + List filePath = []; + + List chatcontents = [ + { + 'image': "assets/images/png/Ellipse 52.png", + 'tittle': "Ryan Dorwart", + 'subtittle': "Row row row your boat", + }, + { + 'image': "assets/images/png/Ellipse 53.png", + 'tittle': "Ahmad Rhiel Madsen", + 'subtittle': "Football fever", + }, + { + 'image': "assets/images/png/chat4.png", + 'tittle': "Kaylynn Vaccaro", + 'subtittle': "The athletic town", + }, + { + 'image': "assets/images/png/chat5.png", + 'tittle': "Kianna Donin", + 'subtittle': "Active alliance network", + }, + { + 'image': "assets/images/png/chat6.png", + 'tittle': "Maria Herwitz", + 'subtittle': "Maria_01", + }, + { + 'image': "assets/images/png/Ellipse 53.png", + 'tittle': "Ahmad Rhiel Madsen", + 'subtittle': "FitFam federation", + }, + { + 'image': "assets/images/png/chat4.png", + 'tittle': "Kaylynn Vaccaro", + 'subtittle': "FitFam federation", + }, + { + 'image': "assets/images/png/chat5.png", + 'tittle': "Kianna Donin", + 'subtittle': "Football fever", + }, + { + 'image': "assets/images/png/chat6.png", + 'tittle': "Maria Herwitz", + 'subtittle': "Row row row your boat", + }, + ]; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + backgroundColor: Color.fromARGB(255, 18, 32, 47), + appBar: CommonAppbar(titleTxt: 'New group'), + body: Stack( + children: [ + const CommonBlurLeftRed(), + const CommonBlurRightRed(), + const CommonBlurLeft(), + GlassmorphicContainer( + width: MediaQuery.of(context).size.width, + height: + // 500.h, + MediaQuery.of(context).size.height, + borderRadius: 2, + blur: 10, + alignment: Alignment.bottomLeft, + border: 2, + linearGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + ], + ), + borderGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + ], + ), + child: ListView(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: () { + ImageUploadBottomSheet().showModal( + context, + false, + (result) { + var file = File(result); + filePath.add(file); + + setState(() {}); + }, + ); + }, + child: Container( + width: 50, + height: 50, + decoration: ShapeDecoration( + // image: DecorationImage( + // image: AssetImage('assets/images/png/camera1.png'), + // ), + gradient: LinearGradient( + begin: Alignment(0.71, -0.70), + end: Alignment(-0.71, 0.7), + colors: [ + Colors.white.withOpacity(0.30000001192092896), + Colors.white.withOpacity(0.30000001192092896) + ], + ), + shape: OvalBorder( + side: BorderSide( + width: 0.50, color: Color(0xFF434A53)), + ), + ), + child: + // Obx( + // () => + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // addgroupImage.profilePicPath.value != '' + filePath.isNotEmpty + ? ClipOval( + child: SizedBox.fromSize( + size: Size.fromRadius(24.r), + child: Image.file( + filePath[0]!, + fit: BoxFit.cover, + width: double.infinity, + ), + ), + ) + : Image.asset( + 'assets/images/png/camera1.png') + ], + ), + // ), + ), + ), + SizedBox( + width: 298, + child: CustomTextFormField( + textEditingController: groupnamecontroller, + texttype: TextInputType.text, + hintText: "Group name", + + // validatorText: "Enter your full name", + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + ), + ), + ], + ), + ), + sizedBoxHeight(20.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: text18w700_FCFCFC('Select contacts to add to group'), + ), + sizedBoxHeight(20.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: CustomTextFormField( + textEditingController: searchcontroller, + texttype: TextInputType.text, + hintText: "Search people", + leadingIcon: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Icon( + Icons.search, + size: 35, + color: Colors.white, + ), + ), + // validatorText: "Enter your full name", + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + ), + ), + sizedBoxHeight(20.h), + ListView.separated( + separatorBuilder: (context, index) { + return Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ); + }, + itemCount: chatcontents.length, + shrinkWrap: true, + padding: const EdgeInsets.only(top: 10.0), + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () {}, + child: GroupsList( + name: chatcontents[index]['tittle'], + imageurl: chatcontents[index]['image'], + message: chatcontents[index]['subtittle'], + ), + ); + }, + ), + sizedBoxHeight(20.h), + CustomButton( + text: 'Create group', + onPressed: () { + // Get.toNamed(RouteName.mainscreen); + Get.offUntil( + MaterialPageRoute( + builder: (context) => MainScreen()), + (Route route) => false) + ; + } + ), + sizedBoxHeight(20.h) + ], + ), + ]), + ), + ], + ), + ), + ); + } +} + +class GroupsList extends StatefulWidget { + final String name; + final String imageurl; + final String message; + + GroupsList({ + Key? key, + required this.name, + required this.imageurl, + required this.message, + }) : super(key: key); + + @override + State createState() => _GroupsListState(); +} + +class _GroupsListState extends State { + bool isAdded = false; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 5.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 55, + height: 55, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(widget.imageurl), + fit: BoxFit.fill, + ), + ), + ), + SizedBox(width: 10.w), // Add some spacing between image and text + Expanded( + child: Padding( + padding: EdgeInsets.only(top: 5.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.name, + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + SizedBox(height: 3.h), + Row( + children: [ + Text( + widget.message, + style: TextStyle( + color: Color(0xCCFCFCFC), + fontSize: 12.sp, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ], + ), + ), + ), + Checkbox( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + side: BorderSide( + color: Color(0xFF434A53).withOpacity(0.72), width: 1.5.w), + activeColor: Color(0xFF434A53).withOpacity(0.72), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(0.0)), + ), + value: isAdded, + onChanged: (value) { + setState(() { + isAdded = value ?? false; + }); + }), + ], + ), + ); + } +} diff --git a/lib/Feed Module/Main_Screens/Chats/View/userchat.dart b/lib/Feed Module/Main_Screens/Chats/View/userchat.dart new file mode 100644 index 0000000..6cfe0fe --- /dev/null +++ b/lib/Feed Module/Main_Screens/Chats/View/userchat.dart @@ -0,0 +1,676 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:glassmorphism/glassmorphism.dart'; +import 'package:regroup/Common/CommonGlassmorphism.dart'; +import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Utils/Common/ImageUpload.dart'; +import 'package:regroup/Utils/Common/blureffect.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; + +class UserChatPage extends StatefulWidget { + const UserChatPage({super.key}); + + @override + State createState() => _UserChatPageState(); +} + +class _UserChatPageState extends State { + ScrollController myController = ScrollController(); + + List messages = [ + ChatMessage( + messageContent: "That sounds great! I’m in. What time works for you?", + messageType: "receiver", + isread: true), + ChatMessage( + messageContent: + "Lorem ipsum is simply dummy text of the printing and typesetting industry.", + messageType: "sender", + isread: true), + ChatMessage( + messageContent: + "Lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.", + messageType: "receiver", + isread: true), + ChatMessage( + messageContent: "That sounds great! I’m in. What time works for you?", + messageType: "receiver", + isread: true), + ChatMessage( + messageContent: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry.", + messageType: "sender", + isread: false), + ]; + + String? attachimage; + + final messageController = TextEditingController(); + + bool isImageAdded = false; + + void _showContextMenu(BuildContext context, Offset offset) { + showMenu( + color: Color(0XFf222935), + context: context, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.r)), + position: + RelativeRect.fromLTRB(offset.dx, offset.dy, offset.dx, offset.dy), + items: [ + PopupMenuItem( + value: 0, + child: Column(children: [ + sizedBoxHeight(10.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Mute chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/mute.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ]), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Pin chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/pin.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Search", style: TextStyle(color: Colors.white)), + Icon( + Icons.search, + size: 35, + color: Colors.white, + ), + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Profile", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/profile.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 1, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Block chat", style: TextStyle(color: Colors.white)), + Image.asset( + 'assets/images/png/blockchat.png', + width: 19.w, + height: 19.h, + ) + ], + ), + Divider( + thickness: 0.6.h, + color: Color(0xffFFFFFF).withOpacity(0.72), + ) + ], + ), + ), + PopupMenuItem( + value: 2, + child: Padding( + padding: EdgeInsets.only(bottom: 10.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Delete chat", style: TextStyle(color: Colors.red)), + // Icon(Icons.delete, color: Colors.red), + Image.asset( + 'assets/images/png/deletetred.png', + width: 19.w, + height: 19.h, + ) + ], + ), + ), + ), + ], + ).then((value) { + if (value != null) { + _onMenuItemSelected(value); + } + }); + } + + void _onMenuItemSelected(int value) { + switch (value) { + case 0: + // Mute chat + print('Mute chat selected'); + break; + case 1: + // Pin chat + print('Pin chat selected'); + break; + case 2: + // Delete chat + print('Search chat selected'); + break; + case 3: + // Pin chat + print('Profile chat selected'); + break; + case 4: + // Pin chat + print('block chat selected'); + break; + case 5: + // Pin chat + print('delete chat selected'); + break; + } + } + + void _sendMessage() { + if (messageController.text.isNotEmpty) { + setState(() { + messages.add(ChatMessage( + messageContent: messageController.text, + messageType: "sender", + isread: false, + )); + messageController.clear(); + }); + } + } + + @override + Widget build(BuildContext context) { + Timer(const Duration(milliseconds: 50), + () => myController.jumpTo(myController.position.maxScrollExtent)); + return GestureDetector( + onTap: () { + Get.focusScope?.unfocus(); + }, + child: Scaffold( + backgroundColor: Color.fromARGB(255, 18, 32, 47), + appBar: AppBar( + elevation: 0, + automaticallyImplyLeading: false, + backgroundColor: Color(0xFF222935).withOpacity(0.50), + flexibleSpace: SafeArea( + child: Container( + // height: 90.h, + padding: EdgeInsets.only(right: 10.w, left: 4.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + Get.back(); + }, + child: Row( + children: [ + sizedBoxWidth(10.w), + commonGlassContainer( + border: 0.9, + width: 40.w, + height: 40.h, + borderradius: 100, + customWidget: Center( + child: Image.asset( + 'assets/images/png/appbararrowbutton.png') + // Icon( + // Icons.arrow_back, + // color: Colors.white, + // size: 20.sp, + // ), + ), + ), + ], + )), + SizedBox( + width: 18.w, + ), + Container( + width: 40.h, + height: 40.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25.h), + image: DecorationImage( + image: + AssetImage("assets/images/png/Ellipse 52.png"), + fit: BoxFit.fill)), + ), + SizedBox( + width: 12.w, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Ryan Dorwart', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w400, + color: Colors.white), + ), + SizedBox( + height: 2.h, + ), + Text( + "Ryan_01", + style: TextStyle( + color: Color(0xffFCFCFC).withOpacity(0.80), + fontSize: 12.sp, + fontWeight: FontWeight.w400), + ), + ], + ), + ), + InkWell( + onTapDown: (details) { + _showContextMenu(context, details.globalPosition); + }, + child: Container( + width: 30, + height: 20, + child: Image.asset( + 'assets/images/png/vertical3dots.png'))) + + // ignore: prefer_const_constructors + ], + ), + ), + ), + ), + body: Stack( + children: [ + const CommonBlurLeftRed(), + const CommonBlurRightRed(), + const CommonBlurLeft(), + GlassmorphicContainer( + width: MediaQuery.of(context).size.width, + height: + // 500.h, + MediaQuery.of(context).size.height, + borderRadius: 2, + blur: 10, + alignment: Alignment.bottomLeft, + border: 2, + linearGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + ], + ), + borderGradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0XFF222935).withOpacity(0.60), + Color(0XFF222935).withOpacity(0.60), + ], + ), + child: Stack( + children: [ + ListView.builder( + controller: myController, + itemCount: messages.length, + padding: const EdgeInsets.only(top: 10.0, bottom: 70.0), + physics: const BouncingScrollPhysics(), + itemBuilder: (context, index) { + return messages[index].messageType == "receiver" + ? Padding( + padding: const EdgeInsets.only( + left: 16.0, + top: 5.0, + bottom: 5.0, + right: 90.0), + child: Align( + alignment: Alignment.topLeft, + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.end, + children: [ + Flexible( + child: Container( + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: Alignment(1.00, -0.03), + end: Alignment(-1, 0.03), + colors: [ + Colors.white.withOpacity( + 0.05999999865889549), + Colors.white.withOpacity( + 0.07999999821186066) + ], + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.only( + topLeft: + Radius.circular(20), + topRight: + Radius.circular(20), + bottomRight: + Radius.circular(20), + ), + ), + ), + padding: + const EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + messages[index].messageContent, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w400, + fontFamily: 'Helvetica', + ), + ), + sizedBoxHeight(2.h), + messages[index].isread == true + ? Image.asset( + 'assets/images/png/messagereadcheckmark.png') + : Image.asset( + 'assets/images/png/messagedelivered.png'), + ], + ), + ), + ) + ], + ), + ), + ) + : Padding( + padding: const EdgeInsets.only( + right: 16.0, + top: 5.0, + bottom: 5.0, + left: 90.0), + child: Align( + alignment: Alignment.topRight, + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.end, + children: [ + Flexible( + child: Container( + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: Alignment(1.00, 0.05), + end: Alignment(-1, -0.05), + colors: [ + Color(0xFFD90B2E), + Color(0x38D90B2E) + ], + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + bottomLeft: + Radius.circular(20), + )), + ), + padding: + const EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Text( + messages[index].messageContent, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + ), + sizedBoxHeight(2.h), + messages[index].isread == true + ? Image.asset( + 'assets/images/png/messagereadcheckmark.png') + : Image.asset( + 'assets/images/png/messagedelivered.png'), + ], + ), + ), + ), + ], + ), + ), + ); + }, + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.only(top: 15, bottom: 15), + child: Row( + children: [ + sizedBoxWidth(16.w), + Expanded( + child: GlassmorphicContainer( + width: double.infinity, + height: 48.h, + borderRadius: 30.r, + blur: 10, + alignment: Alignment.bottomCenter, + border: 0.8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.50), + const Color(0xFFFFFFFF).withOpacity(0.50), + ], + stops: [ + 0.1, + 1, + ]), + borderGradient: const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff434A53), + Color(0xFF434A53), + ], + ), + child: TextFormField( + controller: messageController, + inputFormatters: [ + RemoveEmojiInputFormatter(), + ], + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + autovalidateMode: + AutovalidateMode.onUserInteraction, + decoration: InputDecoration( + contentPadding: const EdgeInsets.all(10.0), + filled: true, + fillColor: Color(0XFF434A53), + border: InputBorder.none, + hintStyle: TextStyle( + fontSize: 14.sp, + color: + Color(0XFFFCFCFC).withOpacity(0.80), + fontWeight: FontWeight.w400, + fontFamily: 'Helvetica'), + hintText: "Type your message", + suffixIcon: messageController + .text.isNotEmpty || + isImageAdded == true + ? GestureDetector( + // onTap: () => _chatItemsAdd(), + onTap: _sendMessage, + // () { + // setState(() { + // // UploadData(); + // messageController.clear(); + // }); + // }, + // => UploadData(), + + child: Padding( + padding: EdgeInsets.only( + right: 8.w, + top: 2.h, + bottom: 2.h), + child: Container( + width: 45.w, + height: 30.h, + decoration: BoxDecoration( + color: Color(0xFFD90B2E), + borderRadius: + BorderRadius.circular( + 30.r)), + child: Center( + child: Icon( + Icons.send_outlined, + color: Colors.white, + ) + // Text( + // 'Send', + // style: TextStyle( + // color: Colors.white, + // fontSize: 16.sp), + // ) + )), + ), + ) + : IconButton( + onPressed: () { + ImageUploadBottomSheet() + .showModal( + context, + true, + (result) { + attachimage = result; + var filenameresult = + extractFileName(result); + + messageController.text = + filenameresult; + setState(() { + isImageAdded = true; + }); + }, + ); + }, + icon: Icon( + Icons.attach_file, + color: Colors.white, + size: 23.h, + ), + ), + ), + minLines: 1, + maxLines: 1, + onChanged: (text) { + setState(() { + + }); + }, + ), + ), + ), + sizedBoxWidth(12.w), + ], + ), + ), + ), + ], + )), + ], + ), + ), + ); + } +} + +class ChatMessage { + String messageContent; + String messageType; + bool isread; + ChatMessage({ + required this.messageContent, + required this.messageType, + required this.isread, + }); +} diff --git a/lib/Login/View/loginscreen.dart b/lib/Login/View/loginscreen.dart index cc95d91..3327348 100644 --- a/lib/Login/View/loginscreen.dart +++ b/lib/Login/View/loginscreen.dart @@ -326,7 +326,7 @@ class _LoginScreenState extends State { height: 17.h, ), // const Icon(Icons.lock_outline), - validationMessage: "Enter your password", + // validationMessage: "Enter your password", validator: (val) { if (val == null || val.isEmpty) { return 'Please enter your password'; @@ -346,7 +346,9 @@ class _LoginScreenState extends State { child: text14400white('Forgot password ?'), )), sizedBoxHeight(40.h), - CustomButton(text: "Login", onPressed: () {}), + CustomButton(text: "Login", onPressed: () { + Get.toNamed(RouteName.mainscreen); + }), sizedBoxHeight(20.h), GestureDetector( onTap: () { diff --git a/lib/Utils/texts.dart b/lib/Utils/texts.dart index 6e8fa00..9666744 100644 --- a/lib/Utils/texts.dart +++ b/lib/Utils/texts.dart @@ -348,6 +348,17 @@ Widget text18w400_FCFCFC(String text) { ); } +Widget text18w400white(String text) { + return Text( + text, + style: TextStyle( + fontSize: 18.sp, + color: Colors.white, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400), + ); +} + Widget text18w500_FCFCFC(String text) { return Text( text, diff --git a/lib/onboarding/Signup/View/signupendpage.dart b/lib/onboarding/Signup/View/signupendpage.dart index f456e27..92cdc5c 100644 --- a/lib/onboarding/Signup/View/signupendpage.dart +++ b/lib/onboarding/Signup/View/signupendpage.dart @@ -106,7 +106,9 @@ class _SignupendPageState extends State { ), sizedBoxHeight(20.h), CustomButton( - text: 'Start your journey', onPressed: () {}) + text: 'Start your journey', onPressed: () { + Get.toNamed(RouteName.mainscreen); + }) ], ), )), diff --git a/lib/onboarding/Signup/View/signupscreen.dart b/lib/onboarding/Signup/View/signupscreen.dart index 34023c8..7adfb1c 100644 --- a/lib/onboarding/Signup/View/signupscreen.dart +++ b/lib/onboarding/Signup/View/signupscreen.dart @@ -156,7 +156,7 @@ class _SignupScreenState extends State { height: 17.h, ), // const Icon(Icons.lock_outline), - validationMessage: "Enter your password", + // validationMessage: "Enter your password", validator: (val) { if (val == null || val.isEmpty) { return 'Please enter your password'; diff --git a/lib/resources/routes/route_name.dart b/lib/resources/routes/route_name.dart index 3fd59ea..0da38a3 100644 --- a/lib/resources/routes/route_name.dart +++ b/lib/resources/routes/route_name.dart @@ -38,6 +38,13 @@ class RouteName { static const String communitysetting = '/communitysetting'; static const String editcommunity = '/editcommunity'; + static const String newchatpage = '/newchatpage'; + static const String newgrouppage = '/newgrouppage'; + + static const String userchatpage = '/userchatpage'; + + static const String groupchatpage = '/groupchatpage'; + diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index 4a95909..3e92d4d 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -1,4 +1,8 @@ import 'package:get/get_navigation/src/routes/get_route.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/Chats/View/groupchat.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/Chats/View/newchatpage.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/Chats/View/newgroup.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/Chats/View/userchat.dart'; import 'package:regroup/Feed%20Module/sidemenu/Community/Admin/PopupItem/Community%20settings/CommunitySetting.dart'; import 'package:regroup/Feed%20Module/sidemenu/Community/Admin/PopupItem/Community%20settings/EditCommunity/EditCommunity.dart'; @@ -168,6 +172,26 @@ class AppRoutes { page: () => const EditCommunity(), ), + + GetPage( + name: RouteName.newchatpage, + page: () => const NewChatPage(), + ), + GetPage( + name: RouteName.newgrouppage, + page: () => const NewGroupPage(), + ), + + GetPage( + name: RouteName.userchatpage, + page: () => const UserChatPage(), + ), + + GetPage( + name: RouteName.groupchatpage, + page: () => const GroupChatPage(), + ), + ]; }