Skip to content

Commit

Permalink
TW-616 Remove pull_to_refresh
Browse files Browse the repository at this point in the history
  • Loading branch information
drminh2807 authored and hoangdat committed Sep 21, 2023
1 parent edf7a2d commit 0203c4c
Show file tree
Hide file tree
Showing 9 changed files with 221 additions and 166 deletions.
5 changes: 5 additions & 0 deletions lib/domain/app_state/room/timeline_search_event_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ class TimelineSearchEventSuccess extends Success {

@override
List<Object?> get props => [events];

@override
String toString() {
return "TimelineSearchEventSuccess ${events.length} ${events.map((event) => event.eventId)}";
}
}

class TimelineSearchEventFailure extends Failure {
Expand Down
12 changes: 3 additions & 9 deletions lib/domain/usecase/room/timeline_search_event_interactor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,18 @@ class TimelineSearchEventInteractor {
String? sinceEventId,
}) async* {
try {
yield* timeline
final events = await timeline
.searchEvent(
searchFunc: searchFunc,
requestHistoryCount: requestHistoryCount,
maxHistoryRequests: maxHistoryRequests,
limit: limit,
sinceEventId: sinceEventId,
)
.map(_convertEventToSuccess);
.last;
yield Right(TimelineSearchEventSuccess(events: events));
} catch (e) {
yield Left(TimelineSearchEventFailure(exception: e));
}
}

Either<Failure, Success> _convertEventToSuccess(events) {
Logs().v(
'TimelineSearchEventInteractor::events ${events.length} ${events.map((event) => event.eventId)}',
);
return Right(TimelineSearchEventSuccess(events: events));
}
}
4 changes: 0 additions & 4 deletions lib/pages/chat_details/chat_details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ class ChatDetails extends StatefulWidget {
}

class ChatDetailsController extends State<ChatDetails> {
static const _mediaFetchLimit = 20;
static const _linksFetchLimit = 20;
final invitationSelectionMobileAndTabletKey =
const Key('InvitationSelectionMobileAndTabletKey');

Expand Down Expand Up @@ -453,7 +451,6 @@ class ChatDetailsController extends State<ChatDetails> {
ChatDetailsPageModel(
page: ChatDetailsPage.media,
child: ChatDetailsMediaPage(
eventsListController: mediaListController,
getTimeline: getTimeline,
cacheMap: _mediaCacheMap,
),
Expand All @@ -465,7 +462,6 @@ class ChatDetailsController extends State<ChatDetails> {
ChatDetailsPageModel(
page: ChatDetailsPage.links,
child: ChatDetailsLinksPage(
eventsListController: linksListController,
getTimeline: getTimeline,
),
),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
import 'package:fluffychat/app_state/success.dart';
import 'package:fluffychat/domain/app_state/room/timeline_search_event_state.dart';
import 'package:fluffychat/pages/chat_details/chat_details_page_view/links/chat_details_links_style.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart';
import 'package:fluffychat/utils/string_extension.dart';
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';

import 'package:fluffychat/pages/chat_details/chat_details_page_view/same_type_events_list_builder.dart';
import 'package:fluffychat/pages/chat_details/chat_details_page_view/same_type_events_list_controller.dart';

class ChatDetailsLinksPage extends StatelessWidget {
final SameTypeEventsListController eventsListController;
static const _linksFetchLimit = 20;
final Future<Timeline> Function() getTimeline;

const ChatDetailsLinksPage({
Key? key,
required this.eventsListController,
required this.getTimeline,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return SameTypeEventsListBuilder(
controller: eventsListController,
getTimeline: getTimeline,
searchFunc: (event) => event.isContainsLink,
limit: _linksFetchLimit,
builder: (context, eventsState) {
final events = eventsState
.getSuccessOrNull<TimelineSearchEventSuccess>()
?.events ??
[];
return ListView.separated(
return SliverList.separated(
itemCount: events.length,
itemBuilder: (context, index) {
final body = events[index].body;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:fluffychat/app_state/success.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/domain/app_state/room/timeline_search_event_state.dart';
import 'package:fluffychat/pages/chat_details/chat_details_page_view/media/chat_details_media_style.dart';
import 'package:fluffychat/pages/chat_details/chat_details_page_view/same_type_events_list_builder.dart';
import 'package:fluffychat/pages/chat_details/chat_details_page_view/same_type_events_list_controller.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart';
import 'package:fluffychat/widgets/mxc_image.dart';
Expand All @@ -11,69 +10,65 @@ import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:matrix/matrix.dart';

class ChatDetailsMediaPage extends StatelessWidget {
final SameTypeEventsListController eventsListController;
static const _mediaFetchLimit = 20;
final Future<Timeline> Function() getTimeline;
final Map<EventId, ImageData>? cacheMap;
const ChatDetailsMediaPage({
Key? key,
required this.eventsListController,
required this.getTimeline,
this.cacheMap,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return SameTypeEventsListBuilder(
controller: eventsListController,
getTimeline: getTimeline,
searchFunc: (event) => event.isVideoOrImage,
limit: _mediaFetchLimit,
builder: (context, eventsState) {
final events = eventsState
.getSuccessOrNull<TimelineSearchEventSuccess>()
?.events ??
[];
return CustomScrollView(
slivers: [
SliverGrid.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
Logs().v("ChatDetailsMediaPage::events: ${events.length}");
return SliverGrid.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
itemCount: events.length,
itemBuilder: (context, index) => Stack(
fit: StackFit.expand,
children: [
MxcImage(
event: events[index],
isThumbnail: true,
fit: BoxFit.cover,
onTapPreview: () {},
isPreview: true,
placeholder: (context) => BlurHash(
hash:
events[index].blurHash ?? AppConfig.defaultImageBlurHash,
),
cacheKey: events[index].eventId,
cacheMap: cacheMap,
),
itemCount: events.length,
itemBuilder: (context, index) => Stack(
fit: StackFit.expand,
children: [
MxcImage(
event: events[index],
isThumbnail: true,
fit: BoxFit.cover,
onTapPreview: () {},
isPreview: true,
placeholder: (context) => BlurHash(
hash: events[index].blurHash ??
AppConfig.defaultImageBlurHash,
if (events[index].messageType == MessageTypes.Video)
Positioned(
bottom: ChatDetailsMediaStyle.durationPosition,
right: ChatDetailsMediaStyle.durationPosition,
child: Container(
padding: ChatDetailsMediaStyle.durationPadding,
decoration: ChatDetailsMediaStyle.durationBoxDecoration(
context,
),
cacheKey: events[index].eventId,
cacheMap: cacheMap,
),
if (events[index].messageType == MessageTypes.Video)
Positioned(
bottom: ChatDetailsMediaStyle.durationPosition,
right: ChatDetailsMediaStyle.durationPosition,
child: Container(
padding: ChatDetailsMediaStyle.durationPadding,
decoration: ChatDetailsMediaStyle.durationBoxDecoration(
context,
),
child: Text(
"00:00",
style:
ChatDetailsMediaStyle.durationTextStyle(context),
),
),
child: Text(
"00:00",
style: ChatDetailsMediaStyle.durationTextStyle(context),
),
],
),
)
],
),
),
],
),
);
},
);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import 'package:fluffychat/pages/chat_details/chat_details_page_view/same_type_events_list_controller.dart';
import 'package:flutter/material.dart';

class SameTypeEventsListBuilderView extends StatelessWidget {
final SameTypeEventsBuilderController controller;

const SameTypeEventsListBuilderView({
Key? key,
required this.controller,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return RefreshIndicator(
onRefresh: controller.refresh,
child: CustomScrollView(
controller: controller.scrollController,
slivers: [
ValueListenableBuilder(
valueListenable: controller.refreshing,
builder: (context, refreshing, child) => SliverToBoxAdapter(
child: refreshing ? const _LoadingIndicator() : const SizedBox(),
),
),
ValueListenableBuilder(
valueListenable: controller.eventsNotifier,
builder: (context, eventsState, child) =>
controller.widget.builder(context, eventsState),
),
ValueListenableBuilder(
valueListenable: controller.loadingMore,
builder: (context, loadingMore, child) => SliverToBoxAdapter(
child: loadingMore ? const _LoadingIndicator() : const SizedBox(),
),
)
],
),
);
}
}

class _LoadingIndicator extends StatelessWidget {
const _LoadingIndicator();

@override
Widget build(BuildContext context) {
return const Padding(
padding: EdgeInsets.all(16),
child: Center(child: CircularProgressIndicator()),
);
}
}
Loading

0 comments on commit 0203c4c

Please sign in to comment.