/
rooms_feed.dart
136 lines (130 loc) · 5.06 KB
/
rooms_feed.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import 'package:awesome_dialog/awesome_dialog.dart';
import 'package:flutter/material.dart';
import 'package:flutter_voice_chat_using_agora/models/room.dart';
import 'package:flutter_voice_chat_using_agora/widgets/form_submit_button.dart';
import 'package:flutter_voice_chat_using_agora/widgets/dialog_helper.dart';
import 'package:flutter_voice_chat_using_agora/app/home/empty_feed.dart';
import 'package:flutter_voice_chat_using_agora/app/home/rooms/room_tile.dart';
import 'package:flutter_voice_chat_using_agora/app/home/rooms/room_tile_view_model.dart';
import 'package:flutter_voice_chat_using_agora/app/home/rooms_feed_view_model.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_voice_chat_using_agora/app/top_level_providers.dart';
import 'package:flutter_voice_chat_using_agora/constants/strings.dart';
import 'package:flutter_voice_chat_using_agora/models/user.dart';
import 'package:flutter_voice_chat_using_agora/routing/app_routes.dart';
import 'package:flutter_voice_chat_using_agora/widgets/profile_button.dart';
final roomsTileModelStreamProvider = StreamProvider.autoDispose<List<RoomTileViewModel>>((ref) {
final database = ref.watch(databaseProvider);
if (database != null) {
return database.roomsStream().map((rooms) => rooms.map((room) => RoomTileViewModel(room: room)).toList());
}
return const Stream.empty();
});
class RoomsFeed extends ConsumerWidget {
final RoomsFeedViewModel model;
final VoidCallback onSignOut;
RoomsFeed({
@required this.model,
@required this.onSignOut
});
final TextEditingController _createdRoomNameController = TextEditingController();
@override
Widget build(BuildContext context, ScopedReader watch) {
final roomsTileViewModelStream = watch(roomsTileModelStreamProvider);
final currentUserStream = watch(userProvider);
return Scaffold(
appBar: AppBar(
title: Text(Strings.appName),
actions: [
IconButton(
icon: Icon(Icons.logout),
onPressed: () async {
await model.signOut();
this.onSignOut();
}
),
currentUserStream.when(
data: (User user) {
return ProfileButton(
userImagePath: user.imageUrl,
onPressed: () {
Navigator.of(context).pushNamed(
AppRoutes.profile,
arguments: { 'uid': user.identifier },
);
},
);
},
loading: () {
return Container();
},
error: (error, stackTrace) {
return Container();
}
)
],
),
body: Stack(
children: [
roomsTileViewModelStream.when(
data: (List<RoomTileViewModel> items) {
return items.isEmpty ? Container() : ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
RoomTileViewModel item = items[index];
return RoomTile(
model: item,
onPressed: () {
Navigator.pushNamed(
context,
AppRoutes.roomDetail,
arguments: { 'room': item.room },
);
},
);
},
);
},
loading: () {
return Center(child: CircularProgressIndicator());
},
error: (error, stackTrace) {
return const EmptyFeed(
title: 'Something went wrong',
message: 'Can\'t load items right now',
);
}
),
model.isLoading ? Center(child: CircularProgressIndicator(),) : Container(),
Align(
alignment: Alignment.bottomCenter,
child: Container(
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 40),
width: double.infinity,
child: FormSubmitButton(
key: const Key('create-room-button'),
text: model.createRoomButtonText(),
initialLoading: false,
onPressed: () async {
AwesomeDialog dialog = DialogHelper.createdRoomNameDialog(context, _createdRoomNameController, model);
await dialog.show();
String roomName = _createdRoomNameController.text;
if (model.currentUserIsParticipatingInARoom()) {
AwesomeDialog leavingCurrentRoomDialog = DialogHelper.leavingParticipatingRoomDialogUponRoomCreate(context, model);
leavingCurrentRoomDialog.show();
}
Room room = await model.createRoom(roomName);
Navigator.pushNamed(
context,
AppRoutes.roomDetail,
arguments: { 'room': room },
);
}
)
)
)
]
),
);
}
}