-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.dart
103 lines (91 loc) · 3.21 KB
/
main.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
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:misc_utilities/responsive_widget.dart';
import 'package:user_feed/user_feed.dart';
/// A wrapper that handles fetching user's feed, toggles a shimmer animation to provide
/// user with visual feedback when feed is in a loading state
class FeedComponentWrapper extends StatefulWidget {
@override
_FeedComponentWrapperState createState() => _FeedComponentWrapperState();
}
class _FeedComponentWrapperState extends State<FeedComponentWrapper> {
late Stream<dynamic> _feedStream;
late StreamController<Object> _feedStreamController;
@override
void initState() {
super.initState();
_feedStreamController = StreamController<Object>.broadcast();
_feedStream = _feedStreamController.stream;
WidgetsBinding.instance.addPostFrameCallback((Duration timeStamp) {
/// Call your function to fetch user's feed
// fetchUserFeed();
});
}
@override
void dispose() {
_feedStreamController.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return StreamBuilder<dynamic>(
stream: _feedStream,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
/// Show feed shimmer before the data is displayed
if (snapshot.data is Map<String, dynamic> &&
snapshot.data['data'] != null &&
snapshot.data['data']['loading'] != null &&
snapshot.data['data']['loading'] == true) {
return const FeedLoadingShimmer(
feedItemShimmerPadding: 0,
flavor: Flavour.PRO,
globalActionShimmerHorizontalPadding: 0,
nudgeShimmerPadding: 0,
);
}
/// Error checking
if (snapshot.hasError) {
final Map<String, dynamic>? error =
snapshot.error as Map<String, dynamic>?;
/// check if the error is a timeout error and return an appropriate widget
if (error!['error'] == 'timeout') {
return Center(
child: Container(
// Add your timeout error widget
));
}
// other type of error but not a timeout
return Container(
// Add your timeout error widget
);
}
if (snapshot.hasData) {
final FeedResponsePayload payload = FeedResponsePayload.fromJson(
snapshot.data as Map<String, dynamic>);
return FeedComponent(
userFeed: payload,
flavour: Flavour.PRO,
profileProgress: '100',
setupComplete: true,
isSmallScreen: ResponsiveWidget.isSmallScreen(context),
feedContentCallbacks: getFeedActionCallbacks(context: context),
);
}
return const FeedLoadingShimmer(
feedItemShimmerPadding: 0,
flavor: Flavour.PRO,
globalActionShimmerHorizontalPadding: 0,
nudgeShimmerPadding: 0,
);
},
);
}
}
Map<String, Function> getFeedActionCallbacks({required BuildContext context}) {
return <String, Function>{
kCompleteProfile: () {
Navigator.of(context, rootNavigator: true)
.pushNamed('/completeProfileRoute');
},
};
}