mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-30 21:13:28 +01:00 
			
		
		
		
	Progress on basic UI for testing
This commit is contained in:
		
							
								
								
									
										72
									
								
								lib/pages/add_app.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								lib/pages/add_app.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:obtainium/pages/app.dart'; | ||||
| import 'package:obtainium/services/apps_provider.dart'; | ||||
| import 'package:obtainium/services/source_service.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
|  | ||||
| class AddAppPage extends StatefulWidget { | ||||
|   const AddAppPage({super.key}); | ||||
|  | ||||
|   @override | ||||
|   State<AddAppPage> createState() => _AddAppPageState(); | ||||
| } | ||||
|  | ||||
| class _AddAppPageState extends State<AddAppPage> { | ||||
|   final _formKey = GlobalKey<FormState>(); | ||||
|   final urlInputController = TextEditingController(); | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       appBar: AppBar( | ||||
|         title: const Text('Obtainium - Add App'), | ||||
|       ), | ||||
|       body: Center( | ||||
|           child: Form( | ||||
|         key: _formKey, | ||||
|         child: Column( | ||||
|           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|           mainAxisAlignment: MainAxisAlignment.center, | ||||
|           children: [ | ||||
|             TextFormField( | ||||
|               controller: urlInputController, | ||||
|               validator: (value) { | ||||
|                 if (value == null || | ||||
|                     value.isEmpty || | ||||
|                     Uri.tryParse(value) == null) { | ||||
|                   return 'Please enter a supported source URL'; | ||||
|                 } | ||||
|                 return null; | ||||
|               }, | ||||
|             ), | ||||
|             Padding( | ||||
|               padding: const EdgeInsets.symmetric(vertical: 16.0), | ||||
|               child: ElevatedButton( | ||||
|                 onPressed: () { | ||||
|                   if (_formKey.currentState!.validate()) { | ||||
|                     SourceService() | ||||
|                         .getApp(urlInputController.value.text) | ||||
|                         .then((app) { | ||||
|                       var appsProvider = context.read<AppsProvider>(); | ||||
|                       appsProvider.saveApp(app).then((_) { | ||||
|                         Navigator.push( | ||||
|                             context, | ||||
|                             MaterialPageRoute( | ||||
|                                 builder: (context) => AppPage(appId: app.id))); | ||||
|                       }); | ||||
|                     }).catchError((e) { | ||||
|                       ScaffoldMessenger.of(context).showSnackBar( | ||||
|                         SnackBar(content: Text(e.toString())), | ||||
|                       ); | ||||
|                     }); | ||||
|                   } | ||||
|                 }, | ||||
|                 child: const Text('Add'), | ||||
|               ), | ||||
|             ), | ||||
|           ], | ||||
|         ), | ||||
|       )), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										32
									
								
								lib/pages/app.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								lib/pages/app.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:obtainium/services/apps_provider.dart'; | ||||
| import 'package:obtainium/services/source_service.dart'; | ||||
| import 'package:webview_flutter/webview_flutter.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
|  | ||||
| class AppPage extends StatefulWidget { | ||||
|   const AppPage({super.key, required this.appId}); | ||||
|  | ||||
|   final String appId; | ||||
|  | ||||
|   @override | ||||
|   State<AppPage> createState() => _AppPageState(); | ||||
| } | ||||
|  | ||||
| class _AppPageState extends State<AppPage> { | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     var appsProvider = context.watch<AppsProvider>(); | ||||
|     App? app = appsProvider.apps[widget.appId]; | ||||
|     if (app == null) { | ||||
|       Navigator.pop(context); | ||||
|     } | ||||
|     return Scaffold( | ||||
|         appBar: AppBar( | ||||
|           title: Text('App - ${app?.name} - ${app?.author}'), | ||||
|         ), | ||||
|         body: WebView( | ||||
|           initialUrl: app?.url, | ||||
|         )); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										47
									
								
								lib/pages/apps.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								lib/pages/apps.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:obtainium/pages/add_app.dart'; | ||||
| import 'package:obtainium/services/apps_provider.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
|  | ||||
| class AppsPage extends StatefulWidget { | ||||
|   const AppsPage({super.key}); | ||||
|  | ||||
|   @override | ||||
|   State<AppsPage> createState() => _AppsPageState(); | ||||
| } | ||||
|  | ||||
| class _AppsPageState extends State<AppsPage> { | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       appBar: AppBar( | ||||
|         title: const Text('Obtainium - Apps'), | ||||
|       ), | ||||
|       body: Center( | ||||
|         child: Column( | ||||
|           mainAxisAlignment: MainAxisAlignment.center, | ||||
|           children: () { | ||||
|             var appsProvider = context.watch<AppsProvider>(); | ||||
|             if (appsProvider.loadingApps) { | ||||
|               return [const Text('Loading Apps...')]; | ||||
|             } else if (appsProvider.apps.isEmpty) { | ||||
|               return [const Text('No Apps Yet.')]; | ||||
|             } else { | ||||
|               return appsProvider.apps.values.map((e) => Text(e.id)).toList(); | ||||
|             } | ||||
|           }(), | ||||
|         ), | ||||
|       ), | ||||
|       floatingActionButton: FloatingActionButton( | ||||
|         onPressed: () { | ||||
|           Navigator.push( | ||||
|             context, | ||||
|             MaterialPageRoute(builder: (context) => const AddAppPage()), | ||||
|           ); | ||||
|         }, | ||||
|         tooltip: 'Add App', | ||||
|         child: const Icon(Icons.add), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user