@@ -26,93 +26,52 @@ class ChatPage extends StatefulWidget {
2626class _ChatPageState extends State <ChatPage > {
2727 bool _isAttachmentUploading = false ;
2828
29- void _handleAtachmentPress () {
29+ void _handleAtachmentPressed () {
3030 showModalBottomSheet <void >(
3131 context: context,
3232 builder: (BuildContext context) {
33- return SizedBox (
34- height: 180 ,
35- child: Column (
36- crossAxisAlignment: CrossAxisAlignment .stretch,
37- children: < Widget > [
38- TextButton (
39- onPressed: () {
40- Navigator .pop (context);
41- _showFilePicker ();
42- },
43- child: const Align (
44- alignment: Alignment .centerLeft,
45- child: Text ('Open file picker' ),
33+ return SafeArea (
34+ child: SizedBox (
35+ height: 144 ,
36+ child: Column (
37+ crossAxisAlignment: CrossAxisAlignment .stretch,
38+ children: < Widget > [
39+ TextButton (
40+ onPressed: () {
41+ Navigator .pop (context);
42+ _handleImageSelection ();
43+ },
44+ child: const Align (
45+ alignment: Alignment .centerLeft,
46+ child: Text ('Photo' ),
47+ ),
4648 ),
47- ),
48- TextButton (
49- onPressed : () {
50- Navigator . pop (context );
51- _showImagePicker ();
52- },
53- child : const Align (
54- alignment : Alignment .centerLeft ,
55- child : Text ( 'Open image picker' ),
49+ TextButton (
50+ onPressed : () {
51+ Navigator . pop (context);
52+ _handleFileSelection ( );
53+ },
54+ child : const Align (
55+ alignment : Alignment .centerLeft,
56+ child : Text ( 'File' ) ,
57+ ),
5658 ),
57- ),
58- TextButton (
59- onPressed : () => Navigator . pop (context),
60- child : const Align (
61- alignment : Alignment .centerLeft ,
62- child : Text ( 'Cancel' ),
59+ TextButton (
60+ onPressed : () => Navigator . pop (context),
61+ child : const Align (
62+ alignment : Alignment .centerLeft,
63+ child : Text ( 'Cancel' ) ,
64+ ),
6365 ),
64- ) ,
65- ] ,
66+ ] ,
67+ ) ,
6668 ),
6769 );
6870 },
6971 );
7072 }
7173
72- void _handleMessageTap (types.Message message) async {
73- if (message is types.FileMessage ) {
74- var localPath = message.uri;
75-
76- if (message.uri.startsWith ('http' )) {
77- final client = http.Client ();
78- final request = await client.get (Uri .parse (message.uri));
79- final bytes = request.bodyBytes;
80- final documentsDir = (await getApplicationDocumentsDirectory ()).path;
81- localPath = '$documentsDir /${message .name }' ;
82-
83- if (! File (localPath).existsSync ()) {
84- final file = File (localPath);
85- await file.writeAsBytes (bytes);
86- }
87- }
88-
89- await OpenFile .open (localPath);
90- }
91- }
92-
93- void _handlePreviewDataFetched (
94- types.TextMessage message,
95- types.PreviewData previewData,
96- ) {
97- final updatedMessage = message.copyWith (previewData: previewData);
98-
99- FirebaseChatCore .instance.updateMessage (updatedMessage, widget.room.id);
100- }
101-
102- void _handleSendPressed (types.PartialText message) {
103- FirebaseChatCore .instance.sendMessage (
104- message,
105- widget.room.id,
106- );
107- }
108-
109- void _setAttachmentUploading (bool uploading) {
110- setState (() {
111- _isAttachmentUploading = uploading;
112- });
113- }
114-
115- void _showFilePicker () async {
74+ void _handleFileSelection () async {
11675 final result = await FilePicker .platform.pickFiles (
11776 type: FileType .any,
11877 );
@@ -141,13 +100,11 @@ class _ChatPageState extends State<ChatPage> {
141100 _setAttachmentUploading (false );
142101 print (e);
143102 }
144- } else {
145- // User canceled the picker
146103 }
147104 }
148105
149- void _showImagePicker () async {
150- final result = await ImagePicker ().getImage (
106+ void _handleImageSelection () async {
107+ final result = await ImagePicker ().pickImage (
151108 imageQuality: 70 ,
152109 maxWidth: 1440 ,
153110 source: ImageSource .gallery,
@@ -159,7 +116,7 @@ class _ChatPageState extends State<ChatPage> {
159116 final size = file.lengthSync ();
160117 final bytes = await result.readAsBytes ();
161118 final image = await decodeImageFromList (bytes);
162- final name = result.path. split ( '/' ).last ;
119+ final name = result.name ;
163120
164121 try {
165122 final reference = FirebaseStorage .instance.ref (name);
@@ -183,11 +140,52 @@ class _ChatPageState extends State<ChatPage> {
183140 _setAttachmentUploading (false );
184141 print (e);
185142 }
186- } else {
187- // User canceled the picker
188143 }
189144 }
190145
146+ void _handleMessageTap (types.Message message) async {
147+ if (message is types.FileMessage ) {
148+ var localPath = message.uri;
149+
150+ if (message.uri.startsWith ('http' )) {
151+ final client = http.Client ();
152+ final request = await client.get (Uri .parse (message.uri));
153+ final bytes = request.bodyBytes;
154+ final documentsDir = (await getApplicationDocumentsDirectory ()).path;
155+ localPath = '$documentsDir /${message .name }' ;
156+
157+ if (! File (localPath).existsSync ()) {
158+ final file = File (localPath);
159+ await file.writeAsBytes (bytes);
160+ }
161+ }
162+
163+ await OpenFile .open (localPath);
164+ }
165+ }
166+
167+ void _handlePreviewDataFetched (
168+ types.TextMessage message,
169+ types.PreviewData previewData,
170+ ) {
171+ final updatedMessage = message.copyWith (previewData: previewData);
172+
173+ FirebaseChatCore .instance.updateMessage (updatedMessage, widget.room.id);
174+ }
175+
176+ void _handleSendPressed (types.PartialText message) {
177+ FirebaseChatCore .instance.sendMessage (
178+ message,
179+ widget.room.id,
180+ );
181+ }
182+
183+ void _setAttachmentUploading (bool uploading) {
184+ setState (() {
185+ _isAttachmentUploading = uploading;
186+ });
187+ }
188+
191189 @override
192190 Widget build (BuildContext context) {
193191 return Scaffold (
@@ -206,7 +204,7 @@ class _ChatPageState extends State<ChatPage> {
206204 return Chat (
207205 isAttachmentUploading: _isAttachmentUploading,
208206 messages: snapshot.data ?? [],
209- onAttachmentPressed: _handleAtachmentPress ,
207+ onAttachmentPressed: _handleAtachmentPressed ,
210208 onMessageTap: _handleMessageTap,
211209 onPreviewDataFetched: _handlePreviewDataFetched,
212210 onSendPressed: _handleSendPressed,
0 commit comments