Minor fixes

This commit is contained in:
Christian Pauly 2020-05-09 09:30:03 +02:00
commit f074ae93cb
6 changed files with 111 additions and 62 deletions

View file

@ -79,8 +79,10 @@ class _ChatState extends State<_Chat> {
String inputText = "";
bool get _canLoadMore => timeline.events.last.type != EventTypes.RoomCreate;
void requestHistory() async {
if (timeline.events.last.type != EventTypes.RoomCreate) {
if (_canLoadMore) {
setState(() => this._loadingHistory = true);
await timeline.requestHistory(historyCount: _loadHistoryCount);
if (mounted) setState(() => this._loadingHistory = false);
@ -450,58 +452,79 @@ class _ChatState extends State<_Chat> {
return ListView.builder(
reverse: true,
itemCount: timeline.events.length + 1,
itemCount: timeline.events.length + 2,
controller: _scrollController,
itemBuilder: (BuildContext context, int i) {
return i == 0
? AnimatedContainer(
height: seenByText.isEmpty ? 0 : 24,
duration: seenByText.isEmpty
? Duration(milliseconds: 0)
: Duration(milliseconds: 500),
alignment: timeline.events.first.senderId ==
client.userID
? Alignment.topRight
: Alignment.topLeft,
child: Text(
seenByText,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Theme.of(context).primaryColor,
),
),
padding: EdgeInsets.only(
left: 8,
right: 8,
bottom: 8,
),
)
: Message(timeline.events[i - 1],
onAvatarTab: (Event event) {
sendController.text += ' ${event.senderId}';
}, onSelect: (Event event) {
if (!event.redacted) {
if (selectedEvents.contains(event)) {
setState(
() => selectedEvents.remove(event),
);
} else {
setState(
() => selectedEvents.add(event),
);
}
selectedEvents.sort(
(a, b) => a.time.compareTo(b.time),
);
}
},
longPressSelect: selectedEvents.isEmpty,
selected: selectedEvents
.contains(timeline.events[i - 1]),
timeline: timeline,
nextEvent:
i >= 2 ? timeline.events[i - 2] : null);
return i == timeline.events.length + 1
? _canLoadMore
? FlatButton(
child: Text(
L10n.of(context).loadMore,
style: TextStyle(
color:
Theme.of(context).primaryColor,
fontWeight: FontWeight.bold,
decoration:
TextDecoration.underline,
),
),
onPressed: requestHistory,
)
: Container()
: i == 0
? AnimatedContainer(
height: seenByText.isEmpty ? 0 : 24,
duration: seenByText.isEmpty
? Duration(milliseconds: 0)
: Duration(milliseconds: 500),
alignment:
timeline.events.first.senderId ==
client.userID
? Alignment.topRight
: Alignment.topLeft,
child: Text(
seenByText,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color:
Theme.of(context).primaryColor,
),
),
padding: EdgeInsets.only(
left: 8,
right: 8,
bottom: 8,
),
)
: Message(timeline.events[i - 1],
onAvatarTab: (Event event) {
sendController.text +=
' ${event.senderId}';
}, onSelect: (Event event) {
if (!event.redacted) {
if (selectedEvents.contains(event)) {
setState(
() =>
selectedEvents.remove(event),
);
} else {
setState(
() => selectedEvents.add(event),
);
}
selectedEvents.sort(
(a, b) => a.time.compareTo(b.time),
);
}
},
longPressSelect: selectedEvents.isEmpty,
selected: selectedEvents
.contains(timeline.events[i - 1]),
timeline: timeline,
nextEvent: i >= 2
? timeline.events[i - 2]
: null);
});
},
),

View file

@ -58,6 +58,8 @@ class _ChatListState extends State<ChatList> {
bool loadingPublicRooms = false;
String searchServer;
final ScrollController _scrollController = ScrollController();
Future<void> waitForFirstSync(BuildContext context) async {
Client client = Matrix.of(context).client;
if (client.prevBatch?.isEmpty ?? true) {
@ -66,8 +68,17 @@ class _ChatListState extends State<ChatList> {
return true;
}
bool _scrolledToTop = true;
@override
void initState() {
_scrollController.addListener(() async {
if (_scrollController.position.pixels > 0 && _scrolledToTop) {
setState(() => _scrolledToTop = false);
} else if (_scrollController.position.pixels == 0 && !_scrolledToTop) {
setState(() => _scrolledToTop = true);
}
});
searchController.addListener(() {
coolDown?.cancel();
if (searchController.text.isEmpty) {
@ -272,6 +283,7 @@ class _ChatListState extends State<ChatList> {
),
),
appBar: AppBar(
elevation: _scrolledToTop ? 0 : null,
leading: selectMode != SelectMode.share
? null
: IconButton(
@ -381,6 +393,7 @@ class _ChatListState extends State<ChatList> {
(publicRoomsResponse?.publicRooms?.length ?? 0);
final int totalCount = rooms.length + publicRoomsCount;
return ListView.separated(
controller: _scrollController,
separatorBuilder: (BuildContext context, int i) =>
i == totalCount - publicRoomsCount
? Material(