feat: Onboarding with dynamic homeservers from joinmatrix.org
This commit is contained in:
parent
bf63253889
commit
9a310d9636
5 changed files with 196 additions and 9 deletions
|
|
@ -3,9 +3,11 @@ import 'dart:async';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:matrix_homeserver_recommendations/matrix_homeserver_recommendations.dart';
|
||||
import 'package:vrouter/vrouter.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/pages/homeserver_picker/homeserver_bottom_sheet.dart';
|
||||
import 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import '../../utils/localized_exception_extension.dart';
|
||||
|
|
@ -19,9 +21,62 @@ class HomeserverPicker extends StatefulWidget {
|
|||
|
||||
class HomeserverPickerController extends State<HomeserverPicker> {
|
||||
bool isLoading = false;
|
||||
final TextEditingController homeserverController =
|
||||
TextEditingController(text: AppConfig.defaultHomeserver);
|
||||
final TextEditingController homeserverController = TextEditingController(
|
||||
text: AppConfig.defaultHomeserver,
|
||||
);
|
||||
final FocusNode homeserverFocusNode = FocusNode();
|
||||
String? error;
|
||||
List<HomeserverBenchmarkResult>? benchmarkResults;
|
||||
bool displayServerList = false;
|
||||
bool get loadingHomeservers =>
|
||||
AppConfig.allowOtherHomeservers && benchmarkResults == null;
|
||||
String searchTerm = '';
|
||||
|
||||
void _updateFocus() {
|
||||
if (benchmarkResults == null) _loadHomeserverList();
|
||||
setState(() {
|
||||
displayServerList = homeserverFocusNode.hasFocus;
|
||||
});
|
||||
}
|
||||
|
||||
void showServerInfo(HomeserverBenchmarkResult server) => showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (_) => HomeserverBottomSheet(
|
||||
homeserver: server,
|
||||
),
|
||||
);
|
||||
|
||||
void onChanged(String text) => setState(() {
|
||||
searchTerm = text;
|
||||
});
|
||||
|
||||
List<HomeserverBenchmarkResult> get filteredHomeservers => benchmarkResults!
|
||||
.where((element) =>
|
||||
element.homeserver.baseUrl.host.contains(searchTerm) ||
|
||||
(element.homeserver.description?.contains(searchTerm) ?? false))
|
||||
.toList();
|
||||
|
||||
void _loadHomeserverList() async {
|
||||
try {
|
||||
final homeserverList = await JoinmatrixOrgParser().fetchHomeservers();
|
||||
final benchmark = await HomeserverListProvider.benchmarkHomeserver(
|
||||
homeserverList,
|
||||
timeout: const Duration(seconds: 10),
|
||||
);
|
||||
setState(() {
|
||||
benchmarkResults = benchmark;
|
||||
});
|
||||
} catch (e, s) {
|
||||
Logs().e('Homeserver benchmark failed', e, s);
|
||||
benchmarkResults = [];
|
||||
}
|
||||
}
|
||||
|
||||
void setServer(String server) => setState(() {
|
||||
homeserverController.text = server;
|
||||
searchTerm = '';
|
||||
homeserverFocusNode.unfocus();
|
||||
});
|
||||
|
||||
/// Starts an analysis of the given homeserver. It uses the current domain and
|
||||
/// makes sure that it is prefixed with https. Then it searches for the
|
||||
|
|
@ -29,8 +84,11 @@ class HomeserverPickerController extends State<HomeserverPicker> {
|
|||
/// login type.
|
||||
Future<void> checkHomeserverAction() async {
|
||||
setState(() {
|
||||
homeserverFocusNode.unfocus();
|
||||
error = null;
|
||||
isLoading = true;
|
||||
searchTerm = '';
|
||||
displayServerList = false;
|
||||
});
|
||||
|
||||
try {
|
||||
|
|
@ -68,6 +126,18 @@ class HomeserverPickerController extends State<HomeserverPicker> {
|
|||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
homeserverFocusNode.removeListener(_updateFocus);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
homeserverFocusNode.addListener(_updateFocus);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Matrix.of(context).navigatorContext = context;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue