When enabled via config.json, unauthenticated web users are automatically redirected to the homeserver's SSO provider on page load, bypassing the homeserver picker UI. Uses full-page redirect with localStorage token recovery to avoid browser popup blocking. Requires defaultHomeserver to also be set in config.json.
51 lines
1.2 KiB
Dart
51 lines
1.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
class ViewModelBuilder<T extends ValueNotifier> extends StatefulWidget {
|
|
final T Function() create;
|
|
final Widget Function(BuildContext context, T viewModel, Widget? child)
|
|
builder;
|
|
final Widget? child;
|
|
final void Function(BuildContext context, T viewModel)? onCreated;
|
|
const ViewModelBuilder({
|
|
super.key,
|
|
required this.create,
|
|
required this.builder,
|
|
this.child,
|
|
this.onCreated,
|
|
});
|
|
|
|
@override
|
|
State<ViewModelBuilder<T>> createState() => _ViewModelBuilderState<T>();
|
|
}
|
|
|
|
class _ViewModelBuilderState<T extends ValueNotifier>
|
|
extends State<ViewModelBuilder<T>> {
|
|
late final T _viewModel;
|
|
|
|
@override
|
|
void initState() {
|
|
_viewModel = widget.create();
|
|
if (widget.onCreated != null) {
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
if (!mounted) return;
|
|
widget.onCreated!(context, _viewModel);
|
|
});
|
|
}
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_viewModel.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ValueListenableBuilder(
|
|
valueListenable: _viewModel,
|
|
builder: (context, value, child) =>
|
|
widget.builder.call(context, _viewModel, child),
|
|
);
|
|
}
|
|
}
|