user can set url

This commit is contained in:
gitea
2026-03-07 22:17:33 +01:00
parent 15867bb177
commit 3c20065e03
5 changed files with 140 additions and 8 deletions
+87
View File
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import '../env.dart';
import '../services/api_auth_service.dart';
class LoginScreen extends StatefulWidget {
@@ -13,19 +14,75 @@ class _LoginScreenState extends State<LoginScreen> {
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
final _serverUrlController = TextEditingController();
bool _loading = false;
String? _errorMessage;
bool _isRegister = false;
final _displayNameController = TextEditingController();
@override
void initState() {
super.initState();
_serverUrlController.text = apiBaseUrl;
}
@override
void dispose() {
_emailController.dispose();
_passwordController.dispose();
_serverUrlController.dispose();
_displayNameController.dispose();
super.dispose();
}
Future<void> _saveServerUrl() async {
final raw = _serverUrlController.text.trim().replaceAll(' ', '');
if (raw.isEmpty) {
await setApiBaseUrlOverride(null);
if (mounted) {
setState(() {
_serverUrlController.text = apiBaseUrlDefault;
_errorMessage = null;
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Using default server URL')),
);
}
return;
}
final withoutSlash = raw.endsWith('/') ? raw.substring(0, raw.length - 1) : raw;
final uri = Uri.tryParse(withoutSlash);
if (uri == null ||
(!uri.scheme.startsWith('http') || uri.host.isEmpty)) {
if (mounted) {
setState(() {
_errorMessage = 'Enter a valid URL (e.g. https://example.com)';
});
}
return;
}
await setApiBaseUrlOverride(withoutSlash);
if (mounted) {
setState(() => _errorMessage = null);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Server URL saved')),
);
}
}
Future<void> _useDefaultServerUrl() async {
await setApiBaseUrlOverride(null);
if (mounted) {
setState(() {
_serverUrlController.text = apiBaseUrlDefault;
_errorMessage = null;
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Using default server URL')),
);
}
}
Future<void> _submit() async {
setState(() {
_errorMessage = null;
@@ -113,6 +170,36 @@ class _LoginScreenState extends State<LoginScreen> {
return null;
},
),
const SizedBox(height: 20),
Text(
'Server URL',
style: Theme.of(context).textTheme.titleSmall,
),
const SizedBox(height: 8),
TextFormField(
controller: _serverUrlController,
decoration: const InputDecoration(
hintText: 'Leave empty for app default',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.url,
autocorrect: false,
textInputAction: TextInputAction.done,
),
const SizedBox(height: 8),
Row(
children: [
FilledButton.tonal(
onPressed: _loading ? null : _saveServerUrl,
child: const Text('Save server URL'),
),
const SizedBox(width: 12),
TextButton(
onPressed: _loading ? null : _useDefaultServerUrl,
child: const Text('Use default'),
),
],
),
if (_errorMessage != null) ...[
const SizedBox(height: 16),
Text(