import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:messaging_app/components/messaging_provider.dart'; import 'package:messaging_app/models/users.dart'; import 'package:messaging_app/pages/conversations_page.dart'; import 'package:messaging_app/service/navigation_service.dart'; import 'package:provider/provider.dart'; import 'package:timeago/timeago.dart' as timeago; // ignore: must_be_immutable class SearchPage extends StatefulWidget { SearchPage({ super.key, required this.deviceHeight, required this.deviceWidth, }); double deviceHeight; double deviceWidth; late MessagingProviders _auth; @override State createState() => _SearchPageState(); } class _SearchPageState extends State { late String _searchText; late List _usersData; // @override void initState() { super.initState(); _searchText = ''; _usersData = []; } @override Widget build(BuildContext context) { return SingleChildScrollView( child: SizedBox( height: widget.deviceHeight, width: widget.deviceWidth, child: ChangeNotifierProvider.value( value: MessagingProviders.instance, child: _searchPaheUI(), ), ), ); } Widget _searchPaheUI() { return Builder(builder: (_context) { widget._auth = Provider.of(_context); return Column( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: [ _searchPageUIField(), _searchPageUIList(), ], ); }); } Widget _searchPageUIField() { return Container( height: widget.deviceHeight * 0.08, width: widget.deviceWidth, padding: EdgeInsets.symmetric(vertical: widget.deviceHeight * 0.02), child: TextField( autocorrect: false, style: TextStyle( color: Colors.white, ), onChanged: (_input) { setState(() { _searchText = _input; }); }, decoration: InputDecoration( prefixIcon: Icon(Icons.search), labelText: "search", labelStyle: TextStyle(color: Colors.white), border: OutlineInputBorder(borderSide: BorderSide.none), ), ), ); } Widget _searchPageUIList() { return StreamBuilder>( stream: MessagingProviders.instance.getAllUsers(_searchText.trim()), builder: (_, _snapshot) { if (_snapshot.hasData) { _usersData = _snapshot.data! .where((_data) => _data.id != widget._auth.user!.$id) .toList(); } return _snapshot.hasData ? SizedBox( height: widget.deviceHeight * 0.70, child: ListView.builder( itemCount: _usersData.length, itemBuilder: (_, _index) { var _userData = _usersData[_index]; var _isUserActive = _userData.lastSeen.isBefore( DateTime.now().toUtc().subtract( Duration( minutes: 1, ), ), ); return ListTile( enabled: true, onTap: () async { String _chatId; String _linkId = '${widget._auth.user!.$id}${_userData.id}'; _chatId = await MessagingProviders.instance .getConversationLink( _linkId.substring(0, 36)); if (_chatId.isEmpty) { List _members = [ widget._auth.user!.$id, _userData.id ]; List messagesTemp = []; messagesTemp = [ json.encode({ widget._auth.user!.$id: [], }), json.encode({ _userData.id: [], }) ]; Map _chat = { "ownerId": widget._auth.user!.$id, "members": _members, "messages": messagesTemp }; _chatId = await MessagingProviders.instance .newMesaage(_chat); } NavigationService.instance.navigateToRoute( MaterialPageRoute( builder: (BuildContext _context) { return ConversationsPage( chatId: _chatId, chatName: _userData.name, chatImage: _userData.image, ); }, ), ); }, title: Text(_userData.name), leading: Container( width: 50, height: 50, decoration: BoxDecoration( borderRadius: BorderRadius.circular(100), image: DecorationImage( fit: BoxFit.cover, image: NetworkImage(_userData.image), ), ), ), trailing: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.end, children: [ _isUserActive ? Text( "last seen", style: TextStyle( fontSize: 15, ), ) : Text( "active", style: TextStyle( fontSize: 15, ), ), _isUserActive ? Text( timeago.format( _userData.lastSeen, ), style: TextStyle(fontSize: 15), ) : Container( height: 10, width: 10, decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(100), ), ) ], ), ); }), ) : Container() // : SpinKitWanderingCubes( // color: Colors.blue, // size: 50.0, // ); ; }); } }