From fa2046f12b9cd55e6e7215f9757a77da4b980315 Mon Sep 17 00:00:00 2001 From: MohammadTaha Basiri Date: Sat, 8 Jan 2022 13:48:32 +0330 Subject: [PATCH] D1APP-52 direct list (chat rooms) (dynamic) --- .../home/profile/direct_list/direct_list.dart | 146 ++++++++++-------- .../direct_list/direct_list_state.dart | 31 +++- 2 files changed, 112 insertions(+), 65 deletions(-) diff --git a/lib/pages/home/profile/direct_list/direct_list.dart b/lib/pages/home/profile/direct_list/direct_list.dart index 15c7a90..ab583ea 100644 --- a/lib/pages/home/profile/direct_list/direct_list.dart +++ b/lib/pages/home/profile/direct_list/direct_list.dart @@ -1,84 +1,102 @@ import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; +import 'package:didvan/models/chat_room/chat_room.dart'; import 'package:didvan/models/view/app_bar_data.dart'; +import 'package:didvan/pages/home/profile/direct_list/direct_list_state.dart'; +import 'package:didvan/pages/home/profile/direct_list/widgets/chat_room_item.dart'; import 'package:didvan/routes/routes.dart'; import 'package:didvan/widgets/didvan/badge.dart'; import 'package:didvan/widgets/didvan/divider.dart'; import 'package:didvan/widgets/didvan/scaffold.dart'; import 'package:didvan/widgets/didvan/text.dart'; +import 'package:didvan/widgets/shimmer_placeholder.dart'; +import 'package:didvan/widgets/sliver_state_handler.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -class DirectList extends StatelessWidget { +class DirectList extends StatefulWidget { const DirectList({Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - return DidvanScaffold( - appBarData: AppBarData( - hasBack: true, - title: 'پیام‌ها', - trailing: const DidvanBadge( - text: '12', - ), - ), - slivers: [for (var i = 0; i < 10; i++) _itemBuilder(context)], - ); + State createState() => _DirectListState(); +} + +class _DirectListState extends State { + @override + void initState() { + Future.delayed(Duration.zero, () { + context.read().getDirectsList(); + }); + super.initState(); } - Widget _itemBuilder(BuildContext context) { - return GestureDetector( - onTap: () => Navigator.of(context).pushNamed(Routes.direct), - child: Container( - color: Colors.transparent, - child: Column( - children: [ - Row( - children: [ - const Icon( - DidvanIcons.avatar_light, - size: 32, - ), - const SizedBox(width: 12), - Expanded( - child: DidvanText( - 'سردبیر رادار سیاسی', - style: Theme.of(context).textTheme.bodyText1, - ), - ), - const DidvanBadge(text: '2'), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(width: 40), - const Icon( - DidvanIcons.check_double_light, - size: 16, - ), - const SizedBox(width: 4), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const DidvanText( - 'فورت فورت،تموم شد؟ خیلی تاثیرگذار بود.', - maxLines: 1, - ), - DidvanText( - '15 دقیقه پیش', - style: Theme.of(context).textTheme.caption, - color: Theme.of(context).colorScheme.caption, - ) - ], - ), - ), - ], - ), - const DidvanDivider(), - ], + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, state, child) => DidvanScaffold( + appBarData: AppBarData( + hasBack: true, + title: 'پیام‌ها', + trailing: DidvanBadge( + text: state.unreadCount.toString(), + ), ), + slivers: [ + SliverStateHandler( + itemPadding: const EdgeInsets.symmetric(horizontal: 16), + state: state, + placeholder: const _ChatRoomPlaceholder(), + builder: (context, state, index) => ChatRoomItem( + chatRoom: state.chatRooms[index], + ), + childCount: state.chatRooms.length, + ), + ], ), ); } } + +class _ChatRoomPlaceholder extends StatelessWidget { + const _ChatRoomPlaceholder({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ShimmerPlaceholder( + height: 24, + width: 24, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + ShimmerPlaceholder( + height: 24, + width: 100, + ), + SizedBox(height: 12), + ShimmerPlaceholder( + height: 16, + width: 300, + ), + SizedBox(height: 12), + ShimmerPlaceholder( + height: 12, + width: 80, + ), + ], + ), + ), + ], + ), + const DidvanDivider(), + ], + ); + } +} diff --git a/lib/pages/home/profile/direct_list/direct_list_state.dart b/lib/pages/home/profile/direct_list/direct_list_state.dart index 913a161..728305a 100644 --- a/lib/pages/home/profile/direct_list/direct_list_state.dart +++ b/lib/pages/home/profile/direct_list/direct_list_state.dart @@ -1,3 +1,32 @@ +import 'package:didvan/models/chat_room/chat_room.dart'; +import 'package:didvan/models/enums.dart'; import 'package:didvan/providers/core_provider.dart'; +import 'package:didvan/services/network/request.dart'; +import 'package:didvan/services/network/request_helper.dart'; -class DirectListState extends CoreProvier {} +class DirectListState extends CoreProvier { + final List chatRooms = []; + int _unreadCount = 0; + int get unreadCount => _unreadCount; + + set unreadCount(int value) { + _unreadCount = value; + notifyListeners(); + } + + Future getDirectsList() async { + appState = AppState.busy; + final RequestService service = RequestService(RequestHelper.directs); + await service.httpGet(); + if (service.isSuccess) { + _unreadCount = service.result['unread'] ?? 0; + final List _chatRooms = service.result['chatRooms'] ?? []; + for (var i = 0; i < _chatRooms.length; i++) { + chatRooms.add(ChatRoom.fromJson(_chatRooms[i])); + } + appState = AppState.idle; + return; + } + appState = AppState.failed; + } +}