You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
747 lines
24 KiB
747 lines
24 KiB
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:numeral/numeral.dart';
|
|
import 'package:page_transition/page_transition.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:teso/Classes/API%20Clasess/ThirdPerson.dart';
|
|
import 'package:teso/Classes/TesoUser.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:teso/Classes/customTesoButton.dart';
|
|
|
|
import 'package:teso/Pages/PageWidgets/Posts/posted.dart';
|
|
import 'package:teso/Pages/PageWidgets/Third Person Profile/header.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'package:http/http.dart' as http;
|
|
import 'package:teso/providers/user_provider.dart';
|
|
import 'package:teso/util/SizeConfig.dart';
|
|
import 'package:teso/util/consts.dart';
|
|
import 'package:teso/Pages/PageWidgets/Third Person Profile/Empty.dart';
|
|
import 'dart:convert';
|
|
|
|
import 'Notifications/ChatScreen.dart';
|
|
|
|
// ignore: must_be_immutable
|
|
class UserProfileThirdPerson extends StatefulWidget {
|
|
TesoUser user;
|
|
final ThirdPerson fullProfile;
|
|
|
|
UserProfileThirdPerson({Key key, this.user, this.fullProfile})
|
|
: super(key: key);
|
|
@override
|
|
_UserProfileThirdPersonState createState() => _UserProfileThirdPersonState();
|
|
}
|
|
|
|
enum AppBarBehavior { normal, pinned, floating, snapping }
|
|
|
|
class _UserProfileThirdPersonState extends State<UserProfileThirdPerson>
|
|
with TickerProviderStateMixin {
|
|
final datakey = new GlobalKey();
|
|
ThirdPerson userProfile = new ThirdPerson();
|
|
int count;
|
|
ScrollController _controller, control, scrollController;
|
|
// AppBarBehavior _appBarBehavior = AppBarBehavior.pinned;
|
|
Animation<double> width;
|
|
Animation<double> heigth;
|
|
AnimationController _containerController;
|
|
double scale;
|
|
bool available = false;
|
|
bool scrolled = false;
|
|
SharedPreferences prefs;
|
|
bool addFriends = false;
|
|
bool friends = false;
|
|
bool pending = false;
|
|
bool approve = false;
|
|
bool loading = false;
|
|
int request = 0;
|
|
var _future;
|
|
|
|
Future<void> getProfile() async {
|
|
prefs = await SharedPreferences.getInstance();
|
|
String token = prefs.getString("tokensTeso");
|
|
Map<String, String> requestHeaders = {
|
|
'Content-type': 'application/json',
|
|
'Authorization': token
|
|
};
|
|
var register = serverLocation + 'user_details/pullProfile';
|
|
var client = await http.post(Uri.parse(register),
|
|
body: json.encode(widget.user.userGUID), headers: requestHeaders);
|
|
if (client.statusCode == 200) {
|
|
var profile = jsonDecode(client.body);
|
|
userProfile = ThirdPerson.fromJSON(profile);
|
|
third(userProfile);
|
|
}
|
|
}
|
|
|
|
void _scrollListener() {
|
|
if (_controller.offset >= _controller.position.maxScrollExtent &&
|
|
!_controller.position.outOfRange) {
|
|
// fetchImages();
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
scrollController.dispose();
|
|
_controller.dispose();
|
|
_containerController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_controller = ScrollController();
|
|
_controller.addListener(_scrollListener);
|
|
count = 0;
|
|
|
|
if (widget.fullProfile != null) {
|
|
third(widget.fullProfile);
|
|
} else {
|
|
_future = getProfile();
|
|
}
|
|
|
|
scrollController = new ScrollController();
|
|
scrollController.addListener(() => setState(() {}));
|
|
_containerController = new AnimationController(
|
|
duration: new Duration(milliseconds: 2000), vsync: this);
|
|
|
|
width = new Tween<double>(
|
|
begin: 200.0,
|
|
end: 220.0,
|
|
).animate(
|
|
new CurvedAnimation(
|
|
parent: _containerController,
|
|
curve: Curves.ease,
|
|
),
|
|
);
|
|
heigth = new Tween<double>(
|
|
begin: 400.0,
|
|
end: 400.0,
|
|
).animate(
|
|
new CurvedAnimation(
|
|
parent: _containerController,
|
|
curve: Curves.ease,
|
|
),
|
|
);
|
|
heigth.addListener(() {
|
|
setState(() {
|
|
if (heigth.isCompleted) {}
|
|
});
|
|
});
|
|
_containerController.forward();
|
|
}
|
|
|
|
void third(ThirdPerson fullProfile) async {
|
|
switch (fullProfile.relation) {
|
|
case "not related":
|
|
setState(() {
|
|
addFriends = true;
|
|
});
|
|
break;
|
|
case "sent pending":
|
|
setState(() {
|
|
pending = true;
|
|
});
|
|
break;
|
|
case "received pending":
|
|
setState(() {
|
|
approve = true;
|
|
});
|
|
break;
|
|
case "friends":
|
|
setState(() {
|
|
friends = true;
|
|
});
|
|
break;
|
|
}
|
|
if (fullProfile.user != null) widget.user = widget.fullProfile.user;
|
|
|
|
// trends = fullProfile.posts;
|
|
// await fetchImages();
|
|
}
|
|
|
|
void removeRelationship() async {
|
|
setState(() {
|
|
loading = true;
|
|
addFriends = false;
|
|
friends = false;
|
|
pending = false;
|
|
approve = false;
|
|
loading = false;
|
|
});
|
|
prefs = await SharedPreferences.getInstance();
|
|
String token = prefs.getString("tokensTeso");
|
|
Map<String, String> requestHeaders = {
|
|
'Content-type': 'application/json',
|
|
'Authorization': token
|
|
};
|
|
String searchValue = widget.user.userGUID;
|
|
var register = serverLocation + 'relationships/unfriend';
|
|
var client = await http.post(Uri.parse(register),
|
|
body: json.encode(searchValue), headers: requestHeaders);
|
|
if (client.statusCode == 200) {
|
|
setState(() {
|
|
friends = false;
|
|
pending = false;
|
|
addFriends = !friends;
|
|
});
|
|
} else {
|
|
setState(() {
|
|
friends = true;
|
|
pending = false;
|
|
addFriends = !friends;
|
|
});
|
|
}
|
|
setState(() {
|
|
loading = false;
|
|
});
|
|
}
|
|
|
|
void addRelationship() async {
|
|
setState(() {
|
|
loading = true;
|
|
addFriends = false;
|
|
friends = false;
|
|
pending = false;
|
|
approve = false;
|
|
loading = false;
|
|
});
|
|
prefs = await SharedPreferences.getInstance();
|
|
String token = prefs.getString("tokensTeso");
|
|
Map<String, String> requestHeaders = {
|
|
'Content-type': 'application/json',
|
|
'Authorization': token
|
|
};
|
|
String searchValue = widget.user.userGUID;
|
|
var register = serverLocation + 'relationships/friendrequest';
|
|
var client = await http.post(Uri.parse(register),
|
|
body: json.encode(searchValue), headers: requestHeaders);
|
|
if (client.statusCode == 200) {
|
|
setState(() {
|
|
request = 52;
|
|
pending = true;
|
|
friends = false;
|
|
addFriends = friends;
|
|
});
|
|
} else {
|
|
setState(() {
|
|
friends = false;
|
|
pending = false;
|
|
addFriends = true;
|
|
});
|
|
}
|
|
setState(() {
|
|
loading = false;
|
|
});
|
|
}
|
|
|
|
void approveRelationship() async {
|
|
setState(() {
|
|
loading = true;
|
|
addFriends = false;
|
|
friends = false;
|
|
pending = false;
|
|
approve = false;
|
|
loading = false;
|
|
});
|
|
prefs = await SharedPreferences.getInstance();
|
|
String token = prefs.getString("tokensTeso");
|
|
Map<String, String> requestHeaders = {
|
|
'Content-type': 'application/json',
|
|
'Authorization': token
|
|
};
|
|
String searchValue = widget.user.userGUID;
|
|
var register = serverLocation + 'relationships/friendapproval';
|
|
var client = await http.post(Uri.parse(register),
|
|
body: json.encode(searchValue), headers: requestHeaders);
|
|
if (client.statusCode == 200) {
|
|
setState(() {
|
|
pending = false;
|
|
friends = true;
|
|
addFriends = !friends;
|
|
approve = false;
|
|
});
|
|
} else {
|
|
setState(() {
|
|
friends = false;
|
|
pending = false;
|
|
addFriends = false;
|
|
approve = true;
|
|
});
|
|
}
|
|
setState(() {
|
|
loading = false;
|
|
});
|
|
}
|
|
|
|
void declineRelationship() async {
|
|
setState(() {
|
|
loading = true;
|
|
addFriends = false;
|
|
friends = false;
|
|
pending = false;
|
|
approve = false;
|
|
loading = false;
|
|
});
|
|
prefs = await SharedPreferences.getInstance();
|
|
String token = prefs.getString("tokensTeso");
|
|
Map<String, String> requestHeaders = {
|
|
'Content-type': 'application/json',
|
|
'Authorization': token
|
|
};
|
|
String searchValue = widget.user.userGUID;
|
|
var register = serverLocation + 'relationships/frienddecline';
|
|
var client = await http.post(Uri.parse(register),
|
|
body: json.encode(searchValue), headers: requestHeaders);
|
|
if (client.statusCode == 200) {
|
|
setState(() {
|
|
pending = false;
|
|
friends = false;
|
|
addFriends = !friends;
|
|
approve = false;
|
|
});
|
|
} else {
|
|
setState(() {
|
|
friends = false;
|
|
pending = false;
|
|
addFriends = false;
|
|
approve = true;
|
|
});
|
|
}
|
|
setState(() {
|
|
loading = false;
|
|
});
|
|
}
|
|
|
|
void cancelRelationshipRequest() async {
|
|
setState(() {
|
|
request = 0;
|
|
loading = true;
|
|
addFriends = false;
|
|
friends = false;
|
|
pending = false;
|
|
approve = false;
|
|
loading = false;
|
|
});
|
|
prefs = await SharedPreferences.getInstance();
|
|
String token = prefs.getString("tokensTeso");
|
|
Map<String, String> requestHeaders = {
|
|
'Content-type': 'application/json',
|
|
'Authorization': token
|
|
};
|
|
String searchValue = widget.user.userGUID;
|
|
var register = serverLocation + 'relationships/cancelrequest';
|
|
var client = await http.post(Uri.parse(register),
|
|
body: json.encode(searchValue), headers: requestHeaders);
|
|
if (client.statusCode == 200) {
|
|
setState(() {
|
|
friends = false;
|
|
pending = false;
|
|
addFriends = !friends;
|
|
});
|
|
}
|
|
setState(() {
|
|
loading = false;
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (scrollController.hasClients) {
|
|
scale = scrollController.offset / 250;
|
|
scale = scale * 2;
|
|
if (scale > 1.90) {
|
|
scrolled = true;
|
|
} else {
|
|
scrolled = false;
|
|
}
|
|
} else {
|
|
scale = 0.0;
|
|
scrolled = false;
|
|
}
|
|
return Scaffold(
|
|
appBar: PreferredSize(
|
|
preferredSize: Size.fromHeight(238),
|
|
child: Column(
|
|
children: [
|
|
AppBar(
|
|
backgroundColor: Theme.of(context).backgroundColor,
|
|
elevation: 0.0,
|
|
leadingWidth: 50,
|
|
centerTitle: true,
|
|
leading: IconButton(
|
|
icon: Icon(
|
|
Icons.arrow_back_ios,
|
|
),
|
|
onPressed: () => Navigator.pop(context),
|
|
),
|
|
title: Text(
|
|
widget.user.username,
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
),
|
|
),
|
|
actions: [
|
|
Visibility(
|
|
visible: addFriends,
|
|
child: Container(
|
|
margin: EdgeInsets.symmetric(horizontal: 10),
|
|
height: 30.0,
|
|
width: 40.0,
|
|
decoration: new BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
border: Border.all(color: accentMain, width: 2.0),
|
|
),
|
|
child: IconButton(
|
|
icon: Icon(
|
|
Icons.person_add_alt,
|
|
color: accentMain,
|
|
),
|
|
onPressed: addRelationship,
|
|
),
|
|
),
|
|
),
|
|
IconButton(
|
|
onPressed: () => statusDialog(context),
|
|
icon: Icon(
|
|
Icons.more_horiz,
|
|
),
|
|
)
|
|
],
|
|
),
|
|
Container(
|
|
width: width.value,
|
|
child: buildHead(
|
|
context: context,
|
|
loading: loading,
|
|
user: widget.user,
|
|
posts: userProfile.posts != null
|
|
? Numeral(userProfile.posts.length).value().toString()
|
|
: "0",
|
|
friends: userProfile.friends,
|
|
following: userProfile.posts,
|
|
relation: friends,
|
|
// unFriend: removeRelationship,
|
|
// approve: approveRelationship,
|
|
pending: pending,
|
|
// approveRequest: approve,
|
|
//cancelRequest: cancelRelationshipRequest,
|
|
// decline: declineRelationship
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
body: FutureBuilder(
|
|
future: _future,
|
|
builder: (context, snapshot) {
|
|
if (snapshot.data == null &&
|
|
snapshot.connectionState == ConnectionState.waiting) {
|
|
return Center(
|
|
child: CupertinoActivityIndicator(
|
|
animating: true,
|
|
radius: 15,
|
|
),
|
|
);
|
|
} else if (userProfile.posts.length == 0 &&
|
|
snapshot.connectionState == ConnectionState.done) {
|
|
return buildEmpty3P(context);
|
|
} else {
|
|
return Container(
|
|
height: MediaQuery.of(context).size.height,
|
|
child: StaggeredGridView.count(
|
|
physics: scrolled
|
|
? NeverScrollableScrollPhysics()
|
|
: AlwaysScrollableScrollPhysics(),
|
|
controller: _controller,
|
|
crossAxisCount: 3,
|
|
children: List.generate(userProfile.posts.length, (int index) {
|
|
return buildPosted(
|
|
context,
|
|
userProfile.posts.elementAt(index),
|
|
0.325,
|
|
widget.user,
|
|
addFriends);
|
|
}),
|
|
staggeredTiles: List.generate(
|
|
userProfile.posts.length,
|
|
(int index) {
|
|
return StaggeredTile.fit(1);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
void statusDialog(BuildContext context) {
|
|
showModalBottomSheet(
|
|
context: context,
|
|
isScrollControlled: true,
|
|
enableDrag: true,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.vertical(top: Radius.circular(30.0)),
|
|
),
|
|
builder: (BuildContext bc) {
|
|
return SizedBox(
|
|
height: MediaQuery.of(context).size.height * 0.5,
|
|
child: Column(
|
|
children: [
|
|
new Container(
|
|
margin: EdgeInsets.symmetric(
|
|
vertical: 15.0,
|
|
),
|
|
child: Center(
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 20.0),
|
|
child: Container(
|
|
width: 50,
|
|
height: 4,
|
|
color: Colors.grey,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 5,
|
|
),
|
|
Container(
|
|
height: MediaQuery.of(context).size.height * 0.4,
|
|
padding: EdgeInsets.symmetric(horizontal: 15),
|
|
child: new ListView(
|
|
scrollDirection: Axis.vertical,
|
|
children: <Widget>[
|
|
ListTile(
|
|
title: Center(
|
|
child: Text(
|
|
"Block User",
|
|
style: TextStyle(
|
|
color: Colors.red[800],
|
|
fontSize: SizeConfig.blockSizeHorizontal * 4.5,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
onTap: () => blockDialog(context),
|
|
),
|
|
Visibility(visible: friends, child: Divider()),
|
|
Visibility(
|
|
visible: friends,
|
|
child: ListTile(
|
|
title: Center(
|
|
child: Text(
|
|
"Send Message",
|
|
style: TextStyle(
|
|
color: Colors.blueAccent,
|
|
fontSize: SizeConfig.blockSizeHorizontal * 4.5,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
onTap: () => Navigator.pushReplacement(
|
|
context,
|
|
PageTransition(
|
|
child: ChatScreen(
|
|
user: widget.user,
|
|
),
|
|
type: PageTransitionType.fade,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Visibility(visible: addFriends, child: Divider()),
|
|
Visibility(
|
|
visible: addFriends,
|
|
child: ListTile(
|
|
title: Center(
|
|
child: Text(
|
|
"Add Friend",
|
|
style: TextStyle(
|
|
color: Colors.blueAccent,
|
|
fontSize:
|
|
SizeConfig.blockSizeHorizontal * 4.5,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
onTap: () {
|
|
addRelationship();
|
|
|
|
Navigator.pop(context);
|
|
}),
|
|
),
|
|
Visibility(visible: pending, child: Divider()),
|
|
Visibility(
|
|
visible: pending,
|
|
child: ListTile(
|
|
title: Center(
|
|
child: Text(
|
|
"Cancel Friend Request",
|
|
style: TextStyle(
|
|
color: Colors.red[800],
|
|
fontSize:
|
|
SizeConfig.blockSizeHorizontal * 4.5,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
onTap: () {
|
|
declineRelationship();
|
|
|
|
Navigator.pop(context);
|
|
}),
|
|
),
|
|
Visibility(visible: approve, child: Divider()),
|
|
Visibility(
|
|
visible: approve,
|
|
child: ListTile(
|
|
title: Center(
|
|
child: Text(
|
|
"Accept Friend Request",
|
|
style: TextStyle(
|
|
color: Colors.blueAccent,
|
|
fontSize: SizeConfig.blockSizeHorizontal * 4.5,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
onTap: approveRelationship,
|
|
),
|
|
),
|
|
Visibility(visible: approve, child: Divider()),
|
|
Visibility(
|
|
visible: approve,
|
|
child: ListTile(
|
|
title: Center(
|
|
child: Text(
|
|
"Decline Friend Request",
|
|
style: TextStyle(
|
|
color: Colors.red[800],
|
|
fontSize:
|
|
SizeConfig.blockSizeHorizontal * 4.5,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
onTap: () {
|
|
declineRelationship();
|
|
|
|
Navigator.pop(context);
|
|
}),
|
|
),
|
|
Visibility(visible: friends, child: Divider()),
|
|
Visibility(
|
|
visible: friends,
|
|
child: ListTile(
|
|
title: Center(
|
|
child: Text(
|
|
"Unfriend",
|
|
style: TextStyle(
|
|
color: Colors.red[800],
|
|
fontSize:
|
|
SizeConfig.blockSizeHorizontal * 4.5,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
onTap: () {
|
|
removeRelationship();
|
|
|
|
Navigator.pop(context);
|
|
}),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
blockDialog(BuildContext context) {
|
|
showModalBottomSheet(
|
|
context: context,
|
|
isScrollControlled: true,
|
|
enableDrag: true,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.vertical(top: Radius.circular(30.0)),
|
|
),
|
|
builder: (BuildContext bc) {
|
|
return SizedBox(
|
|
height: MediaQuery.of(context).size.height * 0.38,
|
|
child: Column(
|
|
children: [
|
|
new Container(
|
|
margin: EdgeInsets.symmetric(
|
|
vertical: 15.0,
|
|
),
|
|
child: Center(
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 20.0),
|
|
child: Container(
|
|
width: 50,
|
|
height: 4,
|
|
color: Colors.grey,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 5,
|
|
),
|
|
Container(
|
|
padding: EdgeInsets.symmetric(horizontal: 15),
|
|
child: Text(
|
|
"Block ${widget.user.username.toUpperCase()} ? ",
|
|
style: TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
Divider(),
|
|
Container(
|
|
padding: EdgeInsets.symmetric(horizontal: 15),
|
|
child: Text(
|
|
"${widget.user.username} won't be able to message you or find your profile or post on Teso. Neither would you, "
|
|
"they won't be notified that you have blocked them. You would have to unblock them to be able to interact with them.",
|
|
style: TextStyle(
|
|
color: Colors.grey,
|
|
fontSize: SizeConfig.blockSizeHorizontal * 3.5,
|
|
),
|
|
),
|
|
),
|
|
Container(
|
|
margin: EdgeInsets.only(top: 20),
|
|
width: MediaQuery.of(context).size.width - 20,
|
|
height: 40,
|
|
child: RaisedGradientButton(
|
|
child: Text(
|
|
"Continue",
|
|
style: TextStyle(color: Colors.white, fontSize: 18),
|
|
),
|
|
gradient: LinearGradient(
|
|
begin: Alignment.topCenter,
|
|
end: Alignment.bottomCenter,
|
|
colors: [
|
|
// Colors.green[400],
|
|
// Colors.green[600],
|
|
Colors.red[800],
|
|
Colors.redAccent,
|
|
],
|
|
),
|
|
onPressed: () {
|
|
Provider.of<UserProvider>(context, listen: false)
|
|
.blockUser(widget.user);
|
|
Navigator.pop(context, true);
|
|
Navigator.pop(context, true);
|
|
},
|
|
width: MediaQuery.of(context).size.width - 20,
|
|
height: 40,
|
|
),
|
|
)
|
|
],
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|