diff --git a/lib/controllers/party_creator_controller.dart b/lib/controllers/party_creator_controller.dart index bef1a16..5e1d22f 100644 --- a/lib/controllers/party_creator_controller.dart +++ b/lib/controllers/party_creator_controller.dart @@ -55,21 +55,21 @@ class PartyCreatorController { const storage = FlutterSecureStorage(); final token = await storage.read(key: "access"); final url = "$mainUrl/parties/"; - final req = http.MultipartRequest("POST", Uri.parse(url)); + final req = http.MultipartRequest( + "POST", + Uri.parse(url), + ); + req.headers.addAll({ + "Content-Type": "multipart/form-data", + "Authorization": "Bearer $token", + }); req.fields.addAll({ - "owner_public_id": party.ownerPublicId!, "name": party.name, "privacy_status": party.privacyStatus.toString(), "description": party.description, "location": party.location!.toPOINT(), "start_time": party.startTime.toIso8601String(), "stop_time": party.stopTime.toIso8601String(), - "participants": - jsonEncode([for (final p in party.participants!) p.toMap()]), - }); - req.headers.addAll({ - "Content-Type": "multipart/form-data", - "Authorization": "Bearer $token", }); //FIXME creating party without image if (party.image != null) { diff --git a/lib/controllers/search_controller.dart b/lib/controllers/search_controller.dart index 8069271..7f2ebc3 100644 --- a/lib/controllers/search_controller.dart +++ b/lib/controllers/search_controller.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'package:drinkify/utils/ext.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:http/http.dart' as http; import 'package:latlong2/latlong.dart'; @@ -7,6 +6,7 @@ import 'package:latlong2/latlong.dart'; import '../utils/consts.dart'; import '../models/friend.dart'; import '../models/party.dart'; +import '../utils/ext.dart'; ///Used for searching parties and users class SearchController { diff --git a/lib/models/friend.dart b/lib/models/friend.dart index 2b45037..9f91f86 100644 --- a/lib/models/friend.dart +++ b/lib/models/friend.dart @@ -1,4 +1,4 @@ -import 'package:drinkify/utils/ext.dart'; +import '../utils/ext.dart'; class Friend { final String? publicId; diff --git a/lib/models/party.dart b/lib/models/party.dart index 0e08930..06674a2 100644 --- a/lib/models/party.dart +++ b/lib/models/party.dart @@ -1,7 +1,7 @@ import 'package:latlong2/latlong.dart'; import './friend.dart'; -import '/utils/ext.dart'; +import '../utils/ext.dart'; class Party { final String? publicId; diff --git a/lib/routes/create_party_page.dart b/lib/routes/create_party_page.dart index b9d4f0a..c667485 100644 --- a/lib/routes/create_party_page.dart +++ b/lib/routes/create_party_page.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; import 'package:latlong2/latlong.dart'; @@ -10,6 +9,7 @@ import 'package:location/location.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../utils/theming.dart'; +import '../utils/ext.dart'; import '../widgets/custom_floating_button.dart'; import '../routes/create_party_routes/description_page.dart'; import '../widgets/createpartypage/party_status.dart'; @@ -29,7 +29,7 @@ class CreatePartyRoute extends StatefulWidget { State createState() => _CreatePartyRouteState(); } -class _CreatePartyRouteState extends State { +class _CreatePartyRouteState extends State with MapUtils { //List of elements needed to send in the http request LatLng? selPoint; XFile? thumbnail; @@ -175,18 +175,14 @@ class _CreatePartyRouteState extends State { } setState(() => errorFields = tempErrorList); if (errorFields.isNotEmpty && !_wrongDate) return; - const storage = FlutterSecureStorage(); - final userId = await storage.read(key: "user_publicId"); final isCreated = await PartyCreatorController.createParty( Party( - ownerPublicId: userId!, name: partyTitle, description: descriptionCtrl.text, location: selPoint, startTime: endTime!, stopTime: endTime!, privacyStatus: partyStatus, - participants: invitedUsers, image: thumbnail?.path, ), ); diff --git a/lib/routes/party_info_page.dart b/lib/routes/party_info_page.dart index a656e7c..d911b47 100644 --- a/lib/routes/party_info_page.dart +++ b/lib/routes/party_info_page.dart @@ -1,10 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:drinkify/models/party.dart'; +import '../models/party.dart'; class PartyInfoPage extends StatelessWidget { final Party party; - const PartyInfoPage(this.party, {super.key}); + const PartyInfoPage( + this.party, { + super.key, + }); //TODO finish this page @override diff --git a/lib/routes/profile_page.dart b/lib/routes/profile_page.dart index d0ecd56..621885a 100644 --- a/lib/routes/profile_page.dart +++ b/lib/routes/profile_page.dart @@ -1,11 +1,11 @@ -import 'package:drinkify/controllers/user_controller.dart'; -import 'package:drinkify/models/user.dart'; import 'package:flutter/material.dart' hide SearchController; import '../utils/theming.dart'; import '../widgets/profilepage/user_info.dart'; import '../models/friend.dart'; -import 'package:drinkify/controllers/search_controller.dart'; +import '../models/user.dart'; +import '../controllers/search_controller.dart'; +import '../controllers/user_controller.dart'; class ProfilePage extends StatefulWidget { final Friend? user; @@ -19,27 +19,26 @@ class ProfilePage extends StatefulWidget { } class _ProfilePageState extends State { - late User? user; - late Friend? friend; + User? user; + Friend? friend; @override void initState() { super.initState(); - user = User.emptyUser(); - friend = const Friend(); WidgetsBinding.instance.addPostFrameCallback((_) async { if (_isMyProfile) { final myProfileData = await UserController.me(); + if (!mounted) return; setState(() => user = myProfileData); - return; - } + } else { + final data = await SearchController.searchUserByPublicId( + widget.user!.publicId!, + ); - final data = await SearchController.searchUserByPublicId( - widget.user!.publicId!, - ); - if (!mounted) return; - setState(() => friend = data); + if (!mounted) return; + setState(() => friend = data); + } }); } @@ -53,8 +52,8 @@ class _ProfilePageState extends State { backgroundColor: Theming.bgColor, title: Text( _isMyProfile - ? "${user!.firstName} ${user!.lastName}" - : "${friend!.firstName} ${friend!.lastName}", + ? "${user?.firstName ?? ""} ${user?.lastName ?? ""}" + : "${friend?.firstName ?? ""} ${friend?.lastName}", style: const TextStyle( color: Theming.whiteTone, fontSize: 18, diff --git a/lib/routes/selected_party_page.dart b/lib/routes/selected_party_page.dart index 532246e..67d131c 100644 --- a/lib/routes/selected_party_page.dart +++ b/lib/routes/selected_party_page.dart @@ -1,5 +1,3 @@ -import 'package:drinkify/controllers/party_controller.dart'; -import 'package:drinkify/widgets/dialogs/success_sheet.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; @@ -12,6 +10,8 @@ import '../widgets/selectedpartypage/party_desc.dart'; import '../utils/theming.dart'; import '../models/party.dart'; import '../widgets/glass_morphism.dart'; +import '../controllers/party_controller.dart'; +import '../widgets/dialogs/success_sheet.dart'; class SelectedPartyPage extends StatefulWidget { final Party party; diff --git a/lib/routes/settings_routes/edit_profile_page.dart b/lib/routes/settings_routes/edit_profile_page.dart index 40136a6..f682882 100644 --- a/lib/routes/settings_routes/edit_profile_page.dart +++ b/lib/routes/settings_routes/edit_profile_page.dart @@ -1,5 +1,4 @@ import 'dart:io'; -import 'package:drinkify/widgets/dialogs/success_sheet.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -11,9 +10,10 @@ import '/utils/theming.dart'; import '/widgets/edit_field.dart'; import '/widgets/custom_floating_button.dart'; import '/widgets/dialogs/account_delete_confirm.dart'; -import '../../widgets/dialogs/image_picker_sheet.dart'; +import '/widgets/dialogs/image_picker_sheet.dart'; import '/controllers/user_controller.dart'; import '/models/user.dart'; +import '/widgets/dialogs/success_sheet.dart'; class EditProfilePage extends StatefulWidget { const EditProfilePage({super.key}); diff --git a/lib/routes/settings_routes/organization_page.dart b/lib/routes/settings_routes/organization_page.dart index 2423585..94a17bd 100644 --- a/lib/routes/settings_routes/organization_page.dart +++ b/lib/routes/settings_routes/organization_page.dart @@ -1,4 +1,3 @@ -import 'package:drinkify/widgets/dialogs/party_options_sheet.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -7,6 +6,7 @@ import '/utils/theming.dart'; import '/models/party.dart'; import '/controllers/party_creator_controller.dart'; import '/widgets/partiespage/party_holder.dart'; +import '/widgets/dialogs/party_options_sheet.dart'; class OrganizationPage extends StatefulWidget { const OrganizationPage({super.key}); diff --git a/lib/utils/ext.dart b/lib/utils/ext.dart index cd965e3..7e4a5b9 100644 --- a/lib/utils/ext.dart +++ b/lib/utils/ext.dart @@ -75,9 +75,7 @@ mixin MapUtils { return false; } -} -mixin LocationUtils { Future userLocation() async { LatLng selPoint; bool serviceEnabled; diff --git a/lib/widgets/createpartypage/invite_friends.dart b/lib/widgets/createpartypage/invite_friends.dart index d0cce36..d62640c 100644 --- a/lib/widgets/createpartypage/invite_friends.dart +++ b/lib/widgets/createpartypage/invite_friends.dart @@ -1,9 +1,9 @@ -import 'package:drinkify/models/friend.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '/utils/theming.dart'; import '/routes/create_party_routes/invite_friends_page.dart'; +import '/models/friend.dart'; class InviteFriends extends StatefulWidget { final Function(List) onFinish; diff --git a/lib/widgets/glass_morphism.dart b/lib/widgets/glass_morphism.dart index 48b1a87..d8db243 100644 --- a/lib/widgets/glass_morphism.dart +++ b/lib/widgets/glass_morphism.dart @@ -1,5 +1,5 @@ -import 'package:flutter/material.dart'; import 'dart:ui'; +import 'package:flutter/material.dart'; class GlassMorphism extends StatelessWidget { final double blur; diff --git a/lib/widgets/partiespage/search_and_map.dart b/lib/widgets/partiespage/search_and_map.dart index eeffd1c..61c634a 100644 --- a/lib/widgets/partiespage/search_and_map.dart +++ b/lib/widgets/partiespage/search_and_map.dart @@ -6,7 +6,7 @@ import '/utils/theming.dart'; import '/models/friend.dart'; import '/controllers/search_controller.dart'; import '/models/party.dart'; -import '/utils/ext.dart'; +import '/utils/ext.dart' show MapUtils; import '/models/search_type.dart'; import '/widgets/glass_morphism.dart'; @@ -25,7 +25,7 @@ class SearchAndMap extends StatefulWidget { State createState() => _SearchAndMapState(); } -class _SearchAndMapState extends State with LocationUtils { +class _SearchAndMapState extends State with MapUtils { late int selectedIndex; late final TextEditingController searchCtrl; late SearchType searchType; diff --git a/lib/widgets/partiespage/user_holder.dart b/lib/widgets/partiespage/user_holder.dart index 5d844b4..729de6f 100644 --- a/lib/widgets/partiespage/user_holder.dart +++ b/lib/widgets/partiespage/user_holder.dart @@ -15,7 +15,7 @@ class UserHolder extends StatelessWidget { super.key, }); - void _goToProfile(BuildContext ctx) => ctx.go("/profile", extra: user); + void _goToProfile(BuildContext ctx) => ctx.push("/profile", extra: user); @override Widget build(BuildContext context) { diff --git a/lib/widgets/profilepage/user_info.dart b/lib/widgets/profilepage/user_info.dart index fb57ecf..94f1b58 100644 --- a/lib/widgets/profilepage/user_info.dart +++ b/lib/widgets/profilepage/user_info.dart @@ -1,4 +1,3 @@ -import 'package:drinkify/models/friend_invitiation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -7,6 +6,7 @@ import '/utils/theming.dart'; import '/widgets/dialogs/success_sheet.dart'; import '/models/friend.dart'; import '/models/user.dart'; +import '/models/friend_invitiation.dart'; import '/controllers/user_controller.dart'; class UserInfo extends StatefulWidget { @@ -23,7 +23,7 @@ class UserInfo extends StatefulWidget { } class _UserInfoState extends State { - bool get _isMyProfile => widget.user != null; + bool get _isMyProfile => widget.friend == null; @override Widget build(BuildContext context) { @@ -32,9 +32,8 @@ class _UserInfoState extends State { //Profile picture Column( children: [ - //TODO fix friend pfp loading _isMyProfile - ? widget.user!.pfp != null + ? widget.user?.pfp != null ? CircleAvatar( radius: 50, backgroundImage: NetworkImage(widget.user!.pfp!), @@ -46,7 +45,7 @@ class _UserInfoState extends State { AssetImage("assets/images/default_pfp.png"), backgroundColor: Theming.bgColorLight, ) - : widget.friend!.pfp != null + : widget.friend?.pfp != null ? CircleAvatar( radius: 50, backgroundImage: NetworkImage(widget.friend!.pfp!), @@ -73,8 +72,8 @@ class _UserInfoState extends State { ), child: Text( _isMyProfile - ? "@${widget.user!.username}" - : "@${widget.friend!.username}", + ? "@${widget.user?.username ?? ""}" + : "@${widget.friend?.username ?? ""}", style: const TextStyle( color: Theming.greenTone, ), @@ -90,7 +89,7 @@ class _UserInfoState extends State { onTap: () async { const storage = FlutterSecureStorage(); final userId = await storage.read(key: "user_publicId"); - if (widget.user!.publicId == userId) return; + if (widget.user?.publicId == userId) return; final success = await UserController.sendFriendInvitation( FriendInvitation( receiverPublicId: widget.friend!.publicId!,