diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index 327846d..a98832f 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -1,9 +1,11 @@ import 'dart:convert'; +import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class GitHub implements AppSource { @override @@ -137,7 +139,7 @@ class GitHub implements AppSource { @override List moreSourceSettingsFormItems = [ GeneratedFormItem( - label: 'GitHub Credentials (Increases Rate Limit)', + label: 'GitHub Personal Access Token (Increases Rate Limit)', id: 'github-creds', required: false, additionalValidators: [ @@ -153,6 +155,23 @@ class GitHub implements AppSource { } return null; } + ], + hint: 'username:token', + belowWidgets: [ + const SizedBox( + height: 8, + ), + GestureDetector( + onTap: () { + launchUrlString( + 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token', + mode: LaunchMode.externalApplication); + }, + child: const Text( + 'About GitHub PATs', + style: TextStyle( + decoration: TextDecoration.underline, fontSize: 12), + )) ]) ]; } diff --git a/lib/components/generated_form.dart b/lib/components/generated_form.dart index 1318b06..a777d5f 100644 --- a/lib/components/generated_form.dart +++ b/lib/components/generated_form.dart @@ -11,6 +11,8 @@ class GeneratedFormItem { late int max; late List additionalValidators; late String id; + late List belowWidgets; + late String? hint; GeneratedFormItem( {this.label = 'Input', @@ -18,7 +20,9 @@ class GeneratedFormItem { this.required = true, this.max = 1, this.additionalValidators = const [], - this.id = 'input'}); + this.id = 'input', + this.belowWidgets = const [], + this.hint}); } class GeneratedForm extends StatefulWidget { @@ -91,7 +95,8 @@ class _GeneratedFormState extends State { }); }, decoration: InputDecoration( - helperText: e.value.label + (e.value.required ? ' *' : '')), + helperText: e.value.label + (e.value.required ? ' *' : ''), + hintText: e.value.hint), minLines: e.value.max <= 1 ? null : e.value.max, maxLines: e.value.max <= 1 ? 1 : e.value.max, validator: (value) { @@ -157,7 +162,13 @@ class _GeneratedFormState extends State { width: 20, )); } - rowItems.add(Expanded(child: rowInput.value)); + rowItems.add(Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + rowInput.value, + ...widget.items[rowInputs.key][rowInput.key].belowWidgets + ]))); }); rows.add(rowItems); });