import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:flutter_dotenv/flutter_dotenv.dart'; import '/utils/storage/session_cookie.dart'; import '/components/user_search_result.dart'; import '/data_models/user_search.dart'; class FriendAddSearch extends StatefulWidget { const FriendAddSearch({ Key? key, }) : super(key: key); @override State createState() => _FriendAddSearchState(); } class _FriendAddSearchState extends State { UserSearch? user; Text centerMessage = const Text('Search to add friends...'); TextEditingController searchController = TextEditingController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0, automaticallyImplyLeading: false, flexibleSpace: SafeArea( child: Container( padding: const EdgeInsets.only(right: 16), child: Row( children: [ IconButton( onPressed: () { Navigator.pop(context); }, icon: Icon( Icons.arrow_back, color: Theme.of(context).appBarTheme.iconTheme?.color, ), ), const SizedBox(width: 2), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Add Friends', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, color: Theme.of(context).appBarTheme.toolbarTextStyle?.color ) ), ], ) ) ] ), ), ), ), body: Stack( children: [ Padding( padding: const EdgeInsets.only(top: 16,left: 16,right: 16), child: TextField( autofocus: true, decoration: InputDecoration( hintText: 'Search...', prefixIcon: const Icon( Icons.search, size: 20 ), suffixIcon: Padding( padding: const EdgeInsets.only(top: 4, bottom: 4, right: 8), child: OutlinedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(Theme.of(context).colorScheme.secondary), foregroundColor: MaterialStateProperty.all(Theme.of(context).colorScheme.onSecondary), shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: BorderRadius.circular(16.0))), elevation: MaterialStateProperty.all(4), ), onPressed: searchUsername, child: const Icon(Icons.search, size: 25), ), ), ), controller: searchController, ), ), Padding( padding: const EdgeInsets.only(top: 90), child: showFriend(), ), ], ), ); } Widget showFriend() { if (user == null) { return Center( child: centerMessage, ); } return UserSearchResult( user: user!, ); } Future searchUsername() async { if (searchController.text.isEmpty) { return; } Map params = {}; params['username'] = searchController.text; var uri = Uri.parse('${dotenv.env["SERVER_URL"]}api/v1/auth/users'); uri = uri.replace(queryParameters: params); var resp = await http.get( uri, headers: { 'cookie': await getSessionCookie(), } ); if (resp.statusCode != 200) { user = null; centerMessage = const Text('User not found'); setState(() {}); return; } user = UserSearch.fromJson( jsonDecode(resp.body) ); setState(() {}); FocusScope.of(context).unfocus(); searchController.clear(); } }