diff --git a/Mobile/assets/logo.png b/Mobile/assets/logo.png new file mode 100644 index 0000000..ddd1dbf Binary files /dev/null and b/Mobile/assets/logo.png differ diff --git a/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/_composite.stamp b/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/_composite.stamp deleted file mode 100644 index 1b2d28c..0000000 --- a/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/_composite.stamp +++ /dev/null @@ -1 +0,0 @@ -{"inputs":[],"outputs":[]} \ No newline at end of file diff --git a/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/gen_dart_plugin_registrant.stamp b/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/gen_dart_plugin_registrant.stamp deleted file mode 100644 index 1b2d28c..0000000 --- a/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/gen_dart_plugin_registrant.stamp +++ /dev/null @@ -1 +0,0 @@ -{"inputs":[],"outputs":[]} \ No newline at end of file diff --git a/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/gen_localizations.stamp b/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/gen_localizations.stamp deleted file mode 100644 index 1b2d28c..0000000 --- a/Mobile/build/8f264e038ea189c3c7110ab09ae876d1/gen_localizations.stamp +++ /dev/null @@ -1 +0,0 @@ -{"inputs":[],"outputs":[]} \ No newline at end of file diff --git a/Mobile/build/web/.dockerignore b/Mobile/build/web/.dockerignore deleted file mode 100644 index 0881874..0000000 --- a/Mobile/build/web/.dockerignore +++ /dev/null @@ -1,11 +0,0 @@ -.git -build/ -.idea -.vscode -*.iml -*.log -.dart_tool/ -.packages -.flutter-plugins -.flutter-plugins-dependencies -.flutter-versions diff --git a/Mobile/build/web/.last_build_id b/Mobile/build/web/.last_build_id deleted file mode 100644 index 9bebe46..0000000 --- a/Mobile/build/web/.last_build_id +++ /dev/null @@ -1 +0,0 @@ -516798f188c0e5e5f173ebddd87b8d0b \ No newline at end of file diff --git a/Mobile/build/web/flutter_service_worker.js b/Mobile/build/web/flutter_service_worker.js deleted file mode 100644 index 6bd2477..0000000 --- a/Mobile/build/web/flutter_service_worker.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict'; -const MANIFEST = 'flutter-app-manifest'; -const TEMP = 'flutter-temp-cache'; -const CACHE_NAME = 'flutter-app-cache'; - -const RESOURCES = {"assets/AssetManifest.bin": "693635b5258fe5f1cda720cf224f158c", -"assets/AssetManifest.bin.json": "69a99f98c8b1fb8111c5fb961769fcd8", -"assets/AssetManifest.json": "2efbb41d7877d10aac9d091f58ccd7b9", -"assets/FontManifest.json": "dc3d03800ccca4601324923c0b1d6d57", -"assets/fonts/MaterialIcons-Regular.otf": "0bce9903b954d8e416b6fe79155f122c", -"assets/NOTICES": "12f6a7042ed1645a5cabf5d072de4770", -"assets/packages/cupertino_icons/assets/CupertinoIcons.ttf": "e986ebe42ef785b27164c36a9abc7818", -"assets/shaders/ink_sparkle.frag": "ecc85a2e95f5e9f53123dcaf8cb9b6ce", -"canvaskit/canvaskit.js": "c86fbd9e7b17accae76e5ad116583dc4", -"canvaskit/canvaskit.js.symbols": "38cba9233b92472a36ff011dc21c2c9f", -"canvaskit/canvaskit.wasm": "3d2a2d663e8c5111ac61a46367f751ac", -"canvaskit/chromium/canvaskit.js": "43787ac5098c648979c27c13c6f804c3", -"canvaskit/chromium/canvaskit.js.symbols": "4525682ef039faeb11f24f37436dca06", -"canvaskit/chromium/canvaskit.wasm": "f5934e694f12929ed56a671617acd254", -"canvaskit/skwasm.js": "445e9e400085faead4493be2224d95aa", -"canvaskit/skwasm.js.symbols": "741d50ffba71f89345996b0aa8426af8", -"canvaskit/skwasm.wasm": "e42815763c5d05bba43f9d0337fa7d84", -"canvaskit/skwasm.worker.js": "bfb704a6c714a75da9ef320991e88b03", -"conf/app.conf": "27b9f8f06e2c2ba98a11a9a2b7d808b2", -"conf/nginx.conf": "6b627505ce964c6c803ec3a50243940c", -"Dockerfile": "814e0c8e66fb59c1d44cb098b2ab06d2", -"favicon.png": "5dcef449791fa27946b3d35ad8803796", -"flutter.js": "c71a09214cb6f5f8996a531350400a9a", -"icons/Icon-192.png": "ac9a721a12bbc803b44f645561ecb1e1", -"icons/Icon-512.png": "96e752610906ba2a93c65f8abe1645f1", -"icons/Icon-maskable-192.png": "c457ef57daa1d16f64b27b786ec2ea3c", -"icons/Icon-maskable-512.png": "301a7604d45b3e739efc881eb04896ea", -"index.html": "48f49a7687916ae75958435b3e706b15", -"/": "48f49a7687916ae75958435b3e706b15", -"main.dart.js": "a41b85bb4fd7ed263adb109950286daf", -"manifest.json": "6818dc0048f086a6849c17ab04b5b189", -"version.json": "9ed43ffa08b5c3b81f0154dc4943c58e"}; -// The application shell files that are downloaded before a service worker can -// start. -const CORE = ["main.dart.js", -"index.html", -"assets/AssetManifest.bin.json", -"assets/FontManifest.json"]; - -// During install, the TEMP cache is populated with the application shell files. -self.addEventListener("install", (event) => { - self.skipWaiting(); - return event.waitUntil( - caches.open(TEMP).then((cache) => { - return cache.addAll( - CORE.map((value) => new Request(value, {'cache': 'reload'}))); - }) - ); -}); -// During activate, the cache is populated with the temp files downloaded in -// install. If this service worker is upgrading from one with a saved -// MANIFEST, then use this to retain unchanged resource files. -self.addEventListener("activate", function(event) { - return event.waitUntil(async function() { - try { - var contentCache = await caches.open(CACHE_NAME); - var tempCache = await caches.open(TEMP); - var manifestCache = await caches.open(MANIFEST); - var manifest = await manifestCache.match('manifest'); - // When there is no prior manifest, clear the entire cache. - if (!manifest) { - await caches.delete(CACHE_NAME); - contentCache = await caches.open(CACHE_NAME); - for (var request of await tempCache.keys()) { - var response = await tempCache.match(request); - await contentCache.put(request, response); - } - await caches.delete(TEMP); - // Save the manifest to make future upgrades efficient. - await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES))); - // Claim client to enable caching on first launch - self.clients.claim(); - return; - } - var oldManifest = await manifest.json(); - var origin = self.location.origin; - for (var request of await contentCache.keys()) { - var key = request.url.substring(origin.length + 1); - if (key == "") { - key = "/"; - } - // If a resource from the old manifest is not in the new cache, or if - // the MD5 sum has changed, delete it. Otherwise the resource is left - // in the cache and can be reused by the new service worker. - if (!RESOURCES[key] || RESOURCES[key] != oldManifest[key]) { - await contentCache.delete(request); - } - } - // Populate the cache with the app shell TEMP files, potentially overwriting - // cache files preserved above. - for (var request of await tempCache.keys()) { - var response = await tempCache.match(request); - await contentCache.put(request, response); - } - await caches.delete(TEMP); - // Save the manifest to make future upgrades efficient. - await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES))); - // Claim client to enable caching on first launch - self.clients.claim(); - return; - } catch (err) { - // On an unhandled exception the state of the cache cannot be guaranteed. - console.error('Failed to upgrade service worker: ' + err); - await caches.delete(CACHE_NAME); - await caches.delete(TEMP); - await caches.delete(MANIFEST); - } - }()); -}); -// The fetch handler redirects requests for RESOURCE files to the service -// worker cache. -self.addEventListener("fetch", (event) => { - if (event.request.method !== 'GET') { - return; - } - var origin = self.location.origin; - var key = event.request.url.substring(origin.length + 1); - // Redirect URLs to the index.html - if (key.indexOf('?v=') != -1) { - key = key.split('?v=')[0]; - } - if (event.request.url == origin || event.request.url.startsWith(origin + '/#') || key == '') { - key = '/'; - } - // If the URL is not the RESOURCE list then return to signal that the - // browser should take over. - if (!RESOURCES[key]) { - return; - } - // If the URL is the index.html, perform an online-first request. - if (key == '/') { - return onlineFirst(event); - } - event.respondWith(caches.open(CACHE_NAME) - .then((cache) => { - return cache.match(event.request).then((response) => { - // Either respond with the cached resource, or perform a fetch and - // lazily populate the cache only if the resource was successfully fetched. - return response || fetch(event.request).then((response) => { - if (response && Boolean(response.ok)) { - cache.put(event.request, response.clone()); - } - return response; - }); - }) - }) - ); -}); -self.addEventListener('message', (event) => { - // SkipWaiting can be used to immediately activate a waiting service worker. - // This will also require a page refresh triggered by the main worker. - if (event.data === 'skipWaiting') { - self.skipWaiting(); - return; - } - if (event.data === 'downloadOffline') { - downloadOffline(); - return; - } -}); -// Download offline will check the RESOURCES for all files not in the cache -// and populate them. -async function downloadOffline() { - var resources = []; - var contentCache = await caches.open(CACHE_NAME); - var currentContent = {}; - for (var request of await contentCache.keys()) { - var key = request.url.substring(origin.length + 1); - if (key == "") { - key = "/"; - } - currentContent[key] = true; - } - for (var resourceKey of Object.keys(RESOURCES)) { - if (!currentContent[resourceKey]) { - resources.push(resourceKey); - } - } - return contentCache.addAll(resources); -} -// Attempt to download the resource online before falling back to -// the offline cache. -function onlineFirst(event) { - return event.respondWith( - fetch(event.request).then((response) => { - return caches.open(CACHE_NAME).then((cache) => { - cache.put(event.request, response.clone()); - return response; - }); - }).catch((error) => { - return caches.open(CACHE_NAME).then((cache) => { - return cache.match(event.request).then((response) => { - if (response != null) { - return response; - } - throw error; - }); - }); - }) - ); -} diff --git a/Mobile/lib/api.dart b/Mobile/lib/api.dart index 7a4e6a8..2f11dcd 100644 --- a/Mobile/lib/api.dart +++ b/Mobile/lib/api.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; -import 'dart:developer'; enum ApiService { auth, @@ -11,7 +10,6 @@ enum ApiService { Future request(BuildContext context, ApiService service, String method, String path, Object? body) async { - log('hello'); final messenger = ScaffoldMessenger.of(context); final host = switch (service) { @@ -19,9 +17,6 @@ Future request(BuildContext context, ApiService service, String method, ApiService.app => const String.fromEnvironment('APP_SERVICE_HOST'), }; - log('hello'); - log(const String.fromEnvironment('AUTH_SERVICE_HOST')); - final http.Response response; try { diff --git a/Mobile/lib/base/sidemenu.dart b/Mobile/lib/base/sidemenu.dart index 7f74d20..6b410d0 100644 --- a/Mobile/lib/base/sidemenu.dart +++ b/Mobile/lib/base/sidemenu.dart @@ -1,35 +1,27 @@ import 'package:flutter/material.dart'; import 'package:mobile/api.dart' as api; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:google_fonts/google_fonts.dart'; + class SideMenu extends StatefulWidget { final Widget body; + final int selectedIndex ; - const SideMenu({super.key, required this.body}); + const SideMenu({super.key, required this.body, required this.selectedIndex}); @override State createState() => _SideMenuState(); } class _SideMenuState extends State { - final GlobalKey _scaffoldKey = GlobalKey(); - int _selectedIndex = 0; bool _isLoggedIn = false; + late int _selectedIndex; - void _onItemTapped(int index) { - setState(() { - _selectedIndex = index; - }); - } - - Future _postNavigationCallback(dynamic _) async { - final isLoggedIn = await api.isLoggedIn(context); - setState(() => _isLoggedIn = isLoggedIn); - - // Close sidebar - if (mounted && _scaffoldKey.currentState?.isDrawerOpen == true) { - Navigator.pop(context); - } + @override + void initState() { + super.initState(); + _selectedIndex = widget.selectedIndex; // Initialize _selectedIndex with the value from the widget } void _logout() async { @@ -41,7 +33,8 @@ class _SideMenuState extends State { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Successfully logged out'))); - Navigator.pop(context); + Navigator.pushReplacementNamed(context, '/login'); + } } @@ -55,97 +48,103 @@ class _SideMenuState extends State { } @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - title: const Text('SkanTavels'), +Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + title: Row( + children: [ + const SizedBox(width: 55), + Text('SkanTravels', + style: GoogleFonts.jacquesFrancois( + fontSize: 30, + color: Colors.black, + ), + ), + ], ), - drawer: Drawer( - child: ListView( - padding: EdgeInsets.zero, - children: [ - const DrawerHeader( - decoration: BoxDecoration( - color: Colors.blue, + ), + drawer: Drawer( + child: ListView( + padding: EdgeInsets.zero, + children: [ + DrawerHeader( + child: Column( + children: [ + const Image( + image: AssetImage('assets/logo.png'), + height: 100, ), - child: Text('Drawer Header'), - ), - ListTile( - title: const Text('Home'), - leading: const Icon(Icons.home), - selected: _selectedIndex == 0, - onTap: () { - // Update the state of the app - _onItemTapped(0); - // Then close the drawer - Navigator.pushReplacementNamed(context, '/home'); - }, - ), - ListTile( - title: const Text('Favourites'), - leading: const Icon(Icons.star), - selected: _selectedIndex == 1, - onTap: () { - // Update the state of the app - _onItemTapped(1); - // Then close the drawer - Navigator.pushReplacementNamed(context, '/favourites'); - }, - ), - ListTile( - title: const Text('Profile'), - leading: const Icon(Icons.person), - selected: _selectedIndex == 2, - onTap: () { - // Update the state of the app - _onItemTapped(2); - // Then close the drawer - Navigator.pushReplacementNamed(context, '/profile'); - }, - ), - const Divider( - color: Colors.grey, - thickness: 2, - indent: 40, - ), - ...(_isLoggedIn - ? [ - ListTile( - title: const Text('Log out'), - leading: const Icon(Icons.logout), - selected: false, - onTap: _logout, - ) - ] - : [ - ListTile( - title: const Text('Register'), - leading: const Icon(Icons.add_box_outlined), - selected: _selectedIndex == 3, - onTap: () { - // Update the state of the app - _onItemTapped(3); - // Then close the drawer - Navigator.pushReplacementNamed(context, '/register'); - }, - ), - ListTile( - title: const Text('Login'), - leading: const Icon(Icons.login), - selected: _selectedIndex == 4, - onTap: () { - // Update the state of the app - _onItemTapped(4); - // Then close the drawer - Navigator.pushReplacementNamed(context, '/login'); - }, - ) - ]) - ], - ), + Text( + 'SkanTravels', + style: GoogleFonts.jacquesFrancois( + fontSize: 20, + color: Color(0xFF1862E7), + ), + ), + ], + ) + ), + ListTile( + title: const Text('Home'), + leading: const Icon(Icons.home), + selected: _selectedIndex == 0, + onTap: () { + Navigator.pushReplacementNamed(context, '/home'); + }, + ), + ListTile( + title: const Text('Favourites'), + leading: const Icon(Icons.star), + selected: _selectedIndex == 1, + onTap: () { + Navigator.pushReplacementNamed(context, '/favourites'); + }, + ), + ListTile( + title: const Text('Profile'), + leading: const Icon(Icons.person), + selected: _selectedIndex == 2, + onTap: () { + Navigator.pushReplacementNamed(context, '/profile'); + }, + ), + const Divider( + color: Colors.grey, + thickness: 2, + indent: 40, + ), + ...(_isLoggedIn + ? [ + ListTile( + title: const Text('Log out'), + leading: const Icon(Icons.logout), + selected: false, + onTap: _logout, + ) + ] + : [ + ListTile( + title: const Text('Register'), + leading: const Icon(Icons.add_box_outlined), + selected: _selectedIndex == 3, + onTap: () { + Navigator.pushReplacementNamed(context, '/register'); + }, + ), + ListTile( + title: const Text('Login'), + leading: const Icon(Icons.login), + selected: _selectedIndex == 4, + onTap: () { + Navigator.pushReplacementNamed(context, '/login'); + }, + ) + ]) + ], ), - body: widget.body, - ); - } + ), + body: widget.body, + ); } +} \ No newline at end of file diff --git a/Mobile/lib/favourites.dart b/Mobile/lib/favourites.dart index fd01f2a..65d3e74 100644 --- a/Mobile/lib/favourites.dart +++ b/Mobile/lib/favourites.dart @@ -7,6 +7,7 @@ class FavouritesPage extends StatelessWidget { @override Widget build(BuildContext context) { return const SideMenu( + selectedIndex: 1, body: Center( child: Text('This is Page 1'), ), diff --git a/Mobile/lib/login.dart b/Mobile/lib/login.dart index 224b905..f5d2432 100644 --- a/Mobile/lib/login.dart +++ b/Mobile/lib/login.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mobile/base/sidemenu.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:google_fonts/google_fonts.dart'; import 'api.dart' as api; class LoginPage extends StatefulWidget { @@ -36,12 +37,24 @@ class _LoginPageState extends State { @override Widget build(BuildContext context) { return SideMenu( + selectedIndex: 4, body: Scaffold( body: Center( child: Container( constraints: const BoxConstraints(minWidth: 100, maxWidth: 400), child: Column(children: [ - const SizedBox(height: 80), + const Image( + image: AssetImage('assets/logo.png'), + height: 200, + ), + Text( + 'SkanTravels', + style: GoogleFonts.jacquesFrancois( + fontSize: 30, + color: const Color(0xFF1862E7), + ), + ), + const SizedBox(height: 40), const Text('Email'), TextField(controller: emailInput), const SizedBox(height: 30), @@ -54,6 +67,7 @@ class _LoginPageState extends State { const SizedBox(height: 30), ElevatedButton(onPressed: _login, child: const Text('Login')), const SizedBox(height: 10), + const Text('or'), TextButton( child: const Text('Register account'), onPressed: () => diff --git a/Mobile/lib/main.dart b/Mobile/lib/main.dart index 65f5548..9aac884 100644 --- a/Mobile/lib/main.dart +++ b/Mobile/lib/main.dart @@ -46,6 +46,7 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { return SideMenu( + selectedIndex: 0, body: Scaffold( key: _scaffoldKey, //drawer: navigationMenu, diff --git a/Mobile/lib/models.dart b/Mobile/lib/models.dart new file mode 100644 index 0000000..5ab25e3 --- /dev/null +++ b/Mobile/lib/models.dart @@ -0,0 +1,15 @@ +class Favorite { + int id; + String userId; + double lat; + double lng; + + Favorite(this.id, this.userId, this.lat, this.lng); +} + +class Login { + String id; + String token; + + Login(this.id, this.token); +} \ No newline at end of file diff --git a/Mobile/lib/profile.dart b/Mobile/lib/profile.dart index 7b8fcae..51d7622 100644 --- a/Mobile/lib/profile.dart +++ b/Mobile/lib/profile.dart @@ -1,14 +1,90 @@ import 'package:flutter/material.dart'; -import 'base/sidemenu.dart'; // Import the base layout widget +import 'base/sidemenu.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'api.dart' as api; -class ProfilePage extends StatelessWidget { - const ProfilePage({super.key}); + +class ProfilePage extends StatefulWidget { + final String id; + + const ProfilePage({super.key, required this.id}); + + @override + State createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + late String _id; + + @override + void initState() { + super.initState(); + _id = widget.id; // Initialize _selectedIndex with the value from the widget + } + +Future _getUser() async { + final token = await api + .request(context, api.ApiService.auth, 'GET', '/api/Users/$_id', { + }); + + if (token == null) return; + + final prefs = await SharedPreferences.getInstance(); + prefs.setString('token', token); + + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Successfully logged in'))); + Navigator.pushReplacementNamed(context, '/home'); + } + } @override Widget build(BuildContext context) { - return const SideMenu( - body: Center( - child: Text('This is Page 1'), + return SideMenu( + selectedIndex: 2, + body: Stack( + children: [ + const Align( + alignment: Alignment.topLeft, + child: Padding( + padding: EdgeInsets.all(16.0), + child: Text( + 'Your Profile', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + ), + ), + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.account_circle, + size: 100, + color: Colors.grey, + ), + const SizedBox(height: 20), + const Text( + 'Username', + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + const Text( + 'email@example.com', + style: TextStyle(fontSize: 16, color: Colors.grey), + ), + const SizedBox(height: 50), + ElevatedButton( + onPressed: () { + // Add your edit action here + }, + child: const Text('Edit'), + ), + ], + ), + ), + ], ), ); } diff --git a/Mobile/lib/register.dart b/Mobile/lib/register.dart index 6959ed0..4a26684 100644 --- a/Mobile/lib/register.dart +++ b/Mobile/lib/register.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mobile/base/sidemenu.dart'; +import 'package:google_fonts/google_fonts.dart'; import 'api.dart' as api; class RegisterPage extends StatefulWidget { @@ -34,12 +35,24 @@ class _RegisterPageState extends State { @override Widget build(BuildContext context) { return SideMenu( + selectedIndex: 3, body: Scaffold( body: Center( child: Container( constraints: const BoxConstraints(minWidth: 100, maxWidth: 400), child: Column(children: [ - const SizedBox(height: 80), + const Image( + image: AssetImage('assets/logo.png'), + height: 200, + ), + Text( + 'SkanTravels', + style: GoogleFonts.jacquesFrancois( + fontSize: 30, + color: Color(0xFF1862E7), + ), + ), + const SizedBox(height: 40), const Text('Username'), TextField(controller: usernameInput), const SizedBox(height: 30), @@ -56,6 +69,7 @@ class _RegisterPageState extends State { ElevatedButton( onPressed: _register, child: const Text('Register')), const SizedBox(height: 10), + const Text('or'), TextButton( child: const Text('Login'), onPressed: () => Navigator.pushReplacementNamed(context, '/login')), diff --git a/Mobile/macos/Flutter/GeneratedPluginRegistrant.swift b/Mobile/macos/Flutter/GeneratedPluginRegistrant.swift index 724bb2a..b8e2b22 100644 --- a/Mobile/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/Mobile/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,10 @@ import FlutterMacOS import Foundation +import path_provider_foundation import shared_preferences_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) } diff --git a/Mobile/pubspec.lock b/Mobile/pubspec.lock index 74b0042..d73b93f 100644 --- a/Mobile/pubspec.lock +++ b/Mobile/pubspec.lock @@ -41,6 +41,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + url: "https://pub.dev" + source: hosted + version: "3.0.5" cupertino_icons: dependency: "direct main" description: @@ -112,6 +120,14 @@ packages: description: flutter source: sdk version: "0.0.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 + url: "https://pub.dev" + source: hosted + version: "6.2.1" http: dependency: "direct main" description: @@ -232,6 +248,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" + url: "https://pub.dev" + source: hosted + version: "2.2.10" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" path_provider_linux: dependency: transitive description: diff --git a/Mobile/pubspec.yaml b/Mobile/pubspec.yaml index ab442b3..302ed3f 100644 --- a/Mobile/pubspec.yaml +++ b/Mobile/pubspec.yaml @@ -38,6 +38,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 shared_preferences: ^2.3.2 + google_fonts: ^6.2.1 dev_dependencies: flutter_test: @@ -55,15 +56,12 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. + assets: + - assets/ uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware