diff --git a/lib/dialogues/search.dart b/lib/dialogues/search.dart deleted file mode 100644 index 15eca9f..0000000 --- a/lib/dialogues/search.dart +++ /dev/null @@ -1,134 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:localization/localization.dart'; -import 'package:loris/business_logic/account/account.dart'; -import 'package:loris/business_logic/timeline/timeline.dart'; -import 'package:loris/global.dart' as global; -import 'package:loris/business_logic/search/search.dart' as logic; -import 'package:loris/themes/themes.dart' as themes; - -import '../partials/post.dart'; - -class SearchDialogue extends StatefulWidget { - const SearchDialogue({super.key}); - - @override - State createState() => _SearchDialogueState(); -} - -class _SearchDialogueState extends State { - String searchText = ""; - String searchTextControl = ""; - Map results = {}; - int searched = 0; - - void searchSingle(String id) async { - final result = await logic.searchForEntry(searchText, id); - if (result.key == 200 && mounted) { - setState(() { - results.addAll({id: result.value!}); - searched++; - }); - } - } - - void search() { - searched = 0; - searchTextControl = searchText; - for (var id in global.settings!.identities.keys.toList()) { - searchSingle(id); - } - } - - @override - Widget build(BuildContext context) { - List accountModels = []; - List postModels = []; - results.forEach( - (key, value) { - for (var m in value.accountModels) { - accountModels.add(m); - } - for (var m in value.postModels) { - postModels.add(m); - } - }, - ); - return BackdropFilter( - filter: - ImageFilter.blur(sigmaX: 10, sigmaY: 10, tileMode: TileMode.mirror), - child: SimpleDialog( - contentPadding: const EdgeInsets.all(0), - titlePadding: const EdgeInsets.all(0), - title: Column( - children: [ - TextField( - style: Theme.of(context).textTheme.bodyMedium, - autofocus: true, - keyboardType: TextInputType.url, - onEditingComplete: () { - if (searchText.isNotEmpty) { - search(); - } - }, - onChanged: ((value) => setState(() { - searchText = value; - })), - decoration: InputDecoration( - prefixIcon: Icon( - color: Theme.of(context).colorScheme.primary, - Icons.search, - ))), - if (searched < global.settings!.identities.length && - searchTextControl.isNotEmpty) - Column( - children: [ - SelectableText( - "${"searched".i18n()} $searched ${searched == 1 ? "instance".i18n() : "instances".i18n()}"), - const LinearProgressIndicator(), - ], - ), - ], - ), - children: [ - Container( - width: global.getWidth(context), - constraints: BoxConstraints( - maxWidth: global.getConstraints(context).maxWidth, - maxHeight: MediaQuery.of(context).size.height * 2 / 3, - ), - child: ListView.builder( - itemCount: accountModels.length + postModels.length, - itemBuilder: (context, index) { - if (index < accountModels.length) { - final model = accountModels[index]; - return Padding( - padding: themes.defaultMargins, - child: Column( - children: [ - SelectableText(model.identity), - DisplayName(account: model) - ], - ), - ); - } - final model = postModels[index - accountModels.length]; - return Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - SelectableText(model.identity), - Post( - model: model, - ) - ], - ), - ); - }), - ), - ], - ), - ); - } -} diff --git a/lib/pages/search/search.dart b/lib/pages/search/search.dart index 8b13789..a012a4c 100644 --- a/lib/pages/search/search.dart +++ b/lib/pages/search/search.dart @@ -1 +1,140 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:localization/localization.dart'; +import 'package:loris/business_logic/account/account.dart'; +import 'package:loris/business_logic/timeline/timeline.dart'; +import 'package:loris/global.dart' as global; +import 'package:loris/business_logic/search/search.dart' as logic; +import 'package:loris/themes/themes.dart' as themes; + +import '../../partials/post.dart'; + +class SearchPage extends StatefulWidget { + const SearchPage({super.key}); + + @override + State createState() => _SearchPageState(); +} + +class _SearchPageState extends State { + String searchText = ""; + String searchTextControl = ""; + Map results = {}; + int searched = 0; + + void searchSingle(String id) async { + final result = await logic.searchForEntry(searchText, id); + if (result.key == 200 && mounted) { + setState(() { + results.addAll({id: result.value!}); + searched++; + }); + } + } + + void search() { + searched = 0; + searchTextControl = searchText; + for (var id in global.settings!.identities.keys.toList()) { + searchSingle(id); + } + } + + @override + Widget build(BuildContext context) { + List accountModels = []; + List postModels = []; + results.forEach( + (key, value) { + for (var m in value.accountModels) { + accountModels.add(m); + } + for (var m in value.postModels) { + postModels.add(m); + } + }, + ); + return Container( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 2, + ))), + child: Material( + child: Column( + children: [ + Column( + children: [ + TextField( + style: Theme.of(context).textTheme.bodyMedium, + autofocus: true, + keyboardType: TextInputType.url, + onEditingComplete: () { + if (searchText.isNotEmpty) { + search(); + } + }, + onChanged: ((value) => setState(() { + searchText = value; + })), + decoration: InputDecoration( + prefixIcon: Icon( + color: Theme.of(context).colorScheme.primary, + Icons.search, + ))), + if (searched < global.settings!.identities.length && + searchTextControl.isNotEmpty) + Column( + children: [ + SelectableText( + "${"searched".i18n()} $searched ${searched == 1 ? "instance".i18n() : "instances".i18n()}"), + const LinearProgressIndicator(), + ], + ), + ], + ), + Expanded( + child: Container( + width: global.getWidth(context), + constraints: BoxConstraints( + maxWidth: global.getConstraints(context).maxWidth, + ), + child: ListView.builder( + shrinkWrap: true, + itemCount: accountModels.length + postModels.length, + itemBuilder: (context, index) { + if (index < accountModels.length) { + final model = accountModels[index]; + return Padding( + padding: themes.defaultMargins, + child: Column( + children: [ + SelectableText(model.identity), + DisplayName(account: model) + ], + ), + ); + } + final model = postModels[index - accountModels.length]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + SelectableText(model.identity), + Post( + model: model, + ) + ], + ), + ); + }), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index f5b3cf7..54ad3fc 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -37,17 +37,18 @@ Widget settings(context) { ), Container( decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - border: Border( - top: BorderSide( - color: Theme.of(context).colorScheme.primary, width: 2))), - child: Wrap( - children: [ - IconButton( - onPressed: () {}, - icon: const Icon(Icons.search), - ) - ], + border: Border( + top: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 2, + ), + ), + ), + child: Material( + child: Wrap( + alignment: WrapAlignment.center, + children: [], + ), )), ], ); diff --git a/lib/pages/timeline/timeline.dart b/lib/pages/timeline/timeline.dart index 275db38..61e1810 100644 --- a/lib/pages/timeline/timeline.dart +++ b/lib/pages/timeline/timeline.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:localization/localization.dart'; import 'package:loris/dialogues/makepost.dart'; -import 'package:loris/dialogues/search.dart'; import 'package:loris/partials/thread.dart'; import '../../business_logic/timeline/timeline.dart' as tl; import '../../global.dart' as global; @@ -145,13 +144,6 @@ class TimelineState extends State { }, icon: const Icon(Icons.refresh), ), - IconButton( - onPressed: () => showDialog( - barrierColor: Colors.transparent, - context: context, - builder: (context) => const SearchDialogue(), - ), - icon: const Icon(Icons.search)), DropdownButtonHideUnderline( child: DropdownButton( alignment: Alignment.center, diff --git a/lib/partials/main_scaffold.dart b/lib/partials/main_scaffold.dart index 45bd548..a0ffce4 100644 --- a/lib/partials/main_scaffold.dart +++ b/lib/partials/main_scaffold.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:localization/localization.dart'; -import 'package:loris/pages/chat/chat.dart'; import 'package:loris/pages/notifications/notifications.dart'; +import 'package:loris/pages/search/search.dart'; import 'package:loris/pages/timeline/timeline.dart'; import 'package:loris/pages/settings/settings.dart'; import '../business_logic/websocket.dart' as websocket; @@ -41,7 +41,7 @@ class _MainScaffoldState extends State { Widget build(BuildContext context) { final screens = [ const Timeline(), - const Chat(), + const SearchPage(), const Notifications(), settings(context), ]; @@ -68,7 +68,7 @@ class _MainScaffoldState extends State { NavigationDestination( icon: const Icon(Icons.forum), label: "timeline".i18n()), NavigationDestination( - icon: const Icon(Icons.chat), label: "chat".i18n()), + icon: const Icon(Icons.search), label: "chat".i18n()), NavigationDestination( icon: Icon((unreadNotifs >= 1) ? Icons.notifications_active