together_mobile/lib/screens/contact_add/search_new_screen.dart

195 lines
5.9 KiB
Dart

import 'dart:io';
import 'package:cherry_toast/cherry_toast.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:together_mobile/common/constants.dart';
import 'package:together_mobile/models/contact_model.dart';
import 'package:together_mobile/models/init_get_it.dart';
import 'package:together_mobile/models/user_model.dart';
import 'package:together_mobile/request/search_new.dart';
import 'package:together_mobile/request/user_profile.dart';
import 'package:together_mobile/utils/app_dir.dart';
class SearchNewScreen extends StatefulWidget {
const SearchNewScreen({super.key});
@override
State<SearchNewScreen> createState() => _SearchNewScreenState();
}
class _SearchNewScreenState extends State<SearchNewScreen> {
final TextEditingController _controller = TextEditingController();
bool _isAvailable = false;
bool _isHttpSent = false;
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('搜索'),
),
body: Column(
children: [
Container(
margin: EdgeInsets.fromLTRB(
0,
30,
0,
MediaQuery.of(context).size.height / 2 - 80 - 175,
),
height: 30,
child: _isHttpSent
? const CircularProgressIndicator()
: const SizedBox(),
),
Container(
alignment: Alignment.centerLeft,
width: 350,
height: 50,
child: TextField(
onChanged: (value) {
if (value.isEmpty) {
setState(() {
_isAvailable = false;
});
} else {
setState(() {
_isAvailable = true;
});
}
},
textAlignVertical: TextAlignVertical.center,
controller: _controller,
decoration: InputDecoration(
// contentPadding: EdgeInsets.only(left: 5),
contentPadding: const EdgeInsets.symmetric(horizontal: 10),
hintText: '用户名/邮箱/群聊号',
prefixIcon: const Icon(Icons.search),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
),
),
),
const SizedBox(
height: 30,
),
Row(
children: [
const Spacer(),
FilledButton(
onPressed: () {},
style: FilledButton.styleFrom(
backgroundColor:
_isAvailable ? kSecondaryColor : kUnAvailableColor,
),
child: const Text('搜索群聊'),
),
const Spacer(),
FilledButton(
onPressed: () async {
if (!_isAvailable) {
return;
}
String condition = '';
if (_controller.text.contains('@')) {
condition = 'email';
} else {
condition = 'username';
}
await _searchNewFriend(context, condition);
},
style: FilledButton.styleFrom(
backgroundColor:
_isAvailable ? kPrimaryColor : kUnAvailableColor,
),
child: const Text('搜索好友'),
),
const Spacer(),
],
)
],
));
}
Future<void> _searchNewFriend(BuildContext context, String condition) async {
if (!_isAvailable || _isHttpSent) {
return;
}
String searchValue = _controller.text;
if (searchValue == getIt.get<UserAccount>().username ||
searchValue == getIt.get<UserAccount>().email) {
context.pushNamed('MainProfile');
return;
}
var (isExisted, friendId) = getIt.get<ContactAccountProfile>().getIdBy(
'username',
searchValue,
);
if (isExisted) {
context.pushNamed(
'FriendProfile',
queryParameters: {'friendId': friendId},
);
return;
}
setState(() {
_isHttpSent = true;
});
Map<String, dynamic> res = await searchContactBy(
condition,
searchValue,
);
setState(() {
_isHttpSent = false;
});
if (res['code'] == 10501) {
// ignore: use_build_context_synchronously
CherryToast.warning(title: const Text('用户不存在')).show(context);
} else {
Map<String, String> accountProfile = {
'id': res['data']['id'],
'username': res['data']['username'],
'email': res['data']['email'],
'nickname': res['data']['nickname'] ?? '',
'birthday': res['data']['birthday'] ?? '',
'location': res['data']['location'] ?? '',
'status': res['data']['status'] ?? '',
'sign': res['data']['sign'] ?? '',
'gender': res['data']['gender'] == null
? ''
: res['data']['gender'] == 'man'
? ''
: '',
'avatar': res['data']['avatar'] ?? '',
};
// if (accountProfile['avatar']!.isNotEmpty) {
// if (!File(accountProfile['avatar']!).existsSync()) {
// var data = await downloadAvatar(res['data']['avatar']);
// await File(accountProfile['avatar']!).writeAsBytes(data);
// }
// }
// ignore: use_build_context_synchronously
context.pushNamed('AddFriend', queryParameters: accountProfile);
}
}
}