-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
#61 Added messages list and message page
- Loading branch information
Showing
8 changed files
with
233 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:intl/intl.dart'; | ||
import 'package:rainbow_challenge/services/dio_client.dart'; | ||
import 'package:rainbow_challenge/utils/model/message.dart'; | ||
import 'package:rainbow_challenge/utils/repository/messages_repository.dart'; | ||
import 'package:rainbow_challenge/widgets/wrapper_main.dart'; | ||
|
||
class MessagePage extends StatefulWidget { | ||
final Message message; | ||
|
||
MessagePage({required this.message}); | ||
|
||
@override | ||
State<StatefulWidget> createState() { | ||
return _MessagePageState(message: message); | ||
} | ||
} | ||
|
||
class _MessagePageState extends State<MessagePage> { | ||
final Message message; | ||
|
||
_MessagePageState({required this.message}); | ||
|
||
@override | ||
void initState() { | ||
super.initState(); | ||
updateMessage(); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return WrapperMainWidget( | ||
mainArea: Padding( | ||
padding: EdgeInsets.all(24), | ||
child: Column( | ||
crossAxisAlignment: CrossAxisAlignment.start, | ||
mainAxisAlignment: MainAxisAlignment.start, | ||
children: [ | ||
Text(DateFormat('yyyy-MM-dd kk:mm').format(message.timeSent)), | ||
Container( | ||
height: 24, | ||
), | ||
Text(message.messageText ?? ""), | ||
Container( | ||
height: 24, | ||
), | ||
Text(message.adminSender ?? ""), | ||
], | ||
)), | ||
title: "Pranešimas", | ||
); | ||
} | ||
|
||
Future<void> updateMessage() async { | ||
await MessagesRepository(dioClient: DioClient()) | ||
.setSeen(message.uuid ?? ""); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:rainbow_challenge/services/dio_client.dart'; | ||
import 'package:rainbow_challenge/theme/colors.dart'; | ||
import 'package:rainbow_challenge/utils/model/message.dart'; | ||
import 'package:rainbow_challenge/utils/repository/messages_repository.dart'; | ||
import 'package:rainbow_challenge/widgets/widgets.dart'; | ||
|
||
import 'message_page.dart'; | ||
|
||
class MessagesPage extends StatefulWidget { | ||
const MessagesPage({Key? key}) : super(key: key); | ||
|
||
@override | ||
State<StatefulWidget> createState() { | ||
return _MessagesPageState(); | ||
} | ||
} | ||
|
||
class _MessagesPageState extends State<MessagesPage> { | ||
List<Message> messages = List<Message>.empty(growable: true); | ||
bool isLoading = true; | ||
|
||
@override | ||
void initState() { | ||
super.initState(); | ||
loadData(); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return WrapperMainWidget( | ||
mainArea: getMainAreaView(context), | ||
title: "Pranešimai", | ||
); | ||
} | ||
|
||
Widget getMainAreaView(BuildContext context) { | ||
if (isLoading) | ||
return Column( | ||
mainAxisAlignment: MainAxisAlignment.center, | ||
children: [CircularProgressIndicator()]); | ||
|
||
return ListView.separated( | ||
scrollDirection: Axis.vertical, | ||
shrinkWrap: true, | ||
padding: const EdgeInsets.only(left: 24, right: 24, top: 10), | ||
itemCount: messages.length, | ||
itemBuilder: (BuildContext context, int index) { | ||
return getListViewCell(messages[index]); | ||
}, | ||
separatorBuilder: (BuildContext context, int index) => const Divider( | ||
thickness: 1, | ||
height: 10, | ||
), | ||
); | ||
} | ||
|
||
Widget getListViewCell(Message message) { | ||
return GestureDetector( | ||
child: Container( | ||
height: 50, | ||
child: Row( | ||
mainAxisAlignment: MainAxisAlignment.start, | ||
crossAxisAlignment: CrossAxisAlignment.center, | ||
children: [ | ||
Expanded( | ||
child: Text(message.messageText ?? "", | ||
maxLines: 1, | ||
overflow: TextOverflow.ellipsis, | ||
style: TextStyle( | ||
fontWeight: message.seen | ||
? FontWeight.normal | ||
: FontWeight.bold))), | ||
Icon( | ||
Icons.chevron_right_outlined, | ||
color: ThemeColors.secondaryColor.withOpacity(0.7), | ||
size: 24.0, | ||
), | ||
], | ||
)), | ||
onTap: () async { | ||
await onMessageClick(message); | ||
}); | ||
} | ||
|
||
Future onMessageClick(Message message) async { | ||
await Navigator.push(context, MaterialPageRoute(builder: (context) { | ||
return MessagePage(message: message); | ||
})); | ||
setState(() { | ||
isLoading = true; | ||
}); | ||
|
||
loadData(); | ||
} | ||
|
||
Future loadData() async { | ||
var fetchedMessages = | ||
await MessagesRepository(dioClient: DioClient()).fetchMessages(); | ||
|
||
setState(() { | ||
messages = fetchedMessages; | ||
isLoading = false; | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import 'dart:convert'; | ||
|
||
Message messageFromJson(String str) => Message.fromJson(json.decode(str)); | ||
|
||
String messageToJson(Message data) => json.encode(data.toJson()); | ||
|
||
class Message { | ||
Message({ | ||
required this.uuid, | ||
required this.messageText, | ||
required this.user, | ||
required this.adminSender, | ||
required this.timeSent, | ||
required this.seen, | ||
}); | ||
|
||
String? uuid; | ||
String? messageText; | ||
String? user; | ||
String? adminSender; | ||
DateTime timeSent; | ||
bool seen; | ||
|
||
factory Message.fromJson(Map<String, dynamic> json) => Message( | ||
uuid: json["uuid"], | ||
messageText: json["message_text"], | ||
user: json["user"], | ||
adminSender: json["admin_sender"], | ||
timeSent: DateTime.parse(json["time_sent"]), | ||
seen: json["seen"], | ||
); | ||
|
||
Map<String, dynamic> toJson() => { | ||
"uuid": uuid, | ||
"message_text": messageText, | ||
"user": user, | ||
"admin_sender": adminSender, | ||
"time_sent": timeSent.toIso8601String(), | ||
"seen": seen, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import 'package:rainbow_challenge/constants/api.dart'; | ||
import 'package:rainbow_challenge/services/dio_client.dart'; | ||
import 'package:rainbow_challenge/utils/model/message.dart'; | ||
|
||
class MessagesRepository { | ||
final DioClient dioClient; | ||
MessagesRepository({required this.dioClient}); | ||
|
||
Future<List<Message>> fetchMessages() async { | ||
final messagesResponse = await dioClient.getList(Api.messagesEndpoint); | ||
return messagesResponse!.map((e) => Message.fromJson(e)).toList(); | ||
} | ||
|
||
Future setSeen(String id) { | ||
var body = {"seen": true}; | ||
return dioClient.updateItem("${Api.messagesEndpoint}${id}/", body); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters