Skip to content
This repository was archived by the owner on Jul 17, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions lib/controllers/camera_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@ import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart' show Uint8List, kIsWeb;
import 'package:image_picker/image_picker.dart';
import 'package:get_it/get_it.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:openwardrobe/repositories/app_repository.dart';

final cameraControllerProvider = Provider((ref) => CameraController(ref.read));

class CameraController {
final AppRepository _appRepository = GetIt.instance<AppRepository>();
final AppRepository _appRepository;

CameraController(read) : _appRepository = read(appRepositoryProvider);

Future<List<File>> pickImages({bool fromGallery = false}) async {
if (kIsWeb) {
Expand Down
9 changes: 6 additions & 3 deletions lib/controllers/home_controller.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import 'package:get_it/get_it.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:openwardrobe/repositories/app_repository.dart';
import 'package:openwardrobe/brick/models/user_profile.model.dart';

final homeControllerProvider = Provider((ref) => HomeController(ref.read));

class HomeController {
final AppRepository _appRepository = GetIt.instance<AppRepository>();
final AppRepository _appRepository;

HomeController(read) : _appRepository = read(appRepositoryProvider);

Future<UserProfile> fetchUserProfile() async {
try {
Expand All @@ -13,5 +17,4 @@ class HomeController {
throw Exception('Failed to fetch user profile: $e');
}
}

}
9 changes: 7 additions & 2 deletions lib/controllers/lookbook_controller.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import 'package:get_it/get_it.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:openwardrobe/repositories/app_repository.dart';
import 'package:openwardrobe/brick/models/lookbook.model.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final lookbookControllerProvider = Provider<LookbookController>((ref) => LookbookController(ref));

class LookbookController {
final AppRepository _appRepository = GetIt.instance<AppRepository>();
final AppRepository _appRepository;

LookbookController(ProviderRef ref) : _appRepository = ref.read(appRepositoryProvider);

Future<List<Lookbook>> fetchLookbookItems() async {
try {
Expand Down
84 changes: 18 additions & 66 deletions lib/controllers/settings_account_controller.dart
Original file line number Diff line number Diff line change
@@ -1,76 +1,28 @@
import 'dart:io';
import 'package:flutter/foundation.dart' show Uint8List, kIsWeb;
import 'package:get_it/get_it.dart';
import 'package:image_picker/image_picker.dart';
import 'package:openwardrobe/brick/models/user_profile.model.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:openwardrobe/repositories/app_repository.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

class SettingsAccountController {
final AppRepository _appRepository = GetIt.instance<AppRepository>();

Future<UserProfile> fetchUserProfile() async {
try {
final profiles = await _appRepository.get<UserProfile>();
return profiles.first;
} catch (e) {
throw Exception('Failed to fetch user profile: $e');
}
}

Future<void> upsertUserProfile(UserProfile profile) async {
try {
await _appRepository.upsert<UserProfile>(profile);
} catch (e) {
throw Exception('Failed to upsert user profile: $e');
}
}
import 'package:openwardrobe/brick/models/user_profile.model.dart';

Future<String> uploadAvatar(File imageFile) async {
try {
final response = await Supabase.instance.client.storage
.from('avatars')
.upload(imageFile.path, imageFile);
return response;
} catch (e) {
throw Exception('Failed to upload avatar: $e');
}
}
class SettingsAccountController extends StateNotifier<UserProfile?> {
final AppRepository _appRepository;

Future<String> uploadWebAvatar(Uint8List imageBytes, String fileName) async {
try {
final response = await Supabase.instance.client.storage
.from('avatars')
.uploadBinary(fileName, imageBytes);
return response;
} catch (e) {
throw Exception('Failed to upload web avatar: $e');
}
}
SettingsAccountController(this._appRepository) : super(null);

Future<File?> pickImage({bool fromGallery = false}) async {
final picker = ImagePicker();
final pickedFile = await picker.pickImage(
source: fromGallery ? ImageSource.gallery : ImageSource.camera,
);
UserProfile? get userProfile => state;

if (pickedFile != null) {
return File(pickedFile.path);
} else {
return null;
Future<void> fetchUserProfile() async {
final profiles = await _appRepository.get<UserProfile>();
if (profiles.isNotEmpty) {
state = profiles.first;
}
}

Future<Uint8List?> pickWebImage() async {
final picker = ImagePicker();
final pickedFile = await picker.pickImage(
source: ImageSource.gallery,
);

if (pickedFile != null) {
return await pickedFile.readAsBytes();
} else {
return null;
}
Future<void> updateUserProfile(UserProfile updatedProfile) async {
await _appRepository.upsert<UserProfile>(updatedProfile);
state = updatedProfile; // Directly update state without using separate variables
}
}

final settingsAccountControllerProvider =
StateNotifierProvider<SettingsAccountController, UserProfile?>(
(ref) => SettingsAccountController(ref.read(appRepositoryProvider)),
);
8 changes: 6 additions & 2 deletions lib/controllers/settings_controller.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import 'package:get_it/get_it.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:openwardrobe/repositories/app_repository.dart';

final settingsControllerProvider = Provider((ref) => SettingsController(ref.read));

class SettingsController {
final AppRepository _appRepository = GetIt.instance<AppRepository>();
final AppRepository _appRepository;

SettingsController(Reader read) : _appRepository = read(appRepositoryProvider);

Future<Map<String, dynamic>> fetchSettings() async {
try {
Expand Down
8 changes: 6 additions & 2 deletions lib/controllers/wardrobe_controller.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import 'package:get_it/get_it.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:openwardrobe/brick/models/outfit.model.dart';
import 'package:openwardrobe/repositories/app_repository.dart';
import 'package:openwardrobe/brick/models/wardrobe_item.model.dart';

final wardrobeControllerProvider = Provider((ref) => WardrobeController(ref.read));

class WardrobeController {
final AppRepository _appRepository = GetIt.instance<AppRepository>();
final AppRepository _appRepository;

WardrobeController(read) : _appRepository = read(appRepositoryProvider);

Future<List<WardrobeItem>> fetchWardrobeItems() async {
try {
Expand Down
22 changes: 0 additions & 22 deletions lib/di/service_locator.dart

This file was deleted.

7 changes: 2 additions & 5 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:openwardrobe/repositories/app_repository.dart';
import 'router/app_router.dart';

import 'package:openwardrobe/di/service_locator.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

// sqflite_common_ffi_web
import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart';
Expand All @@ -26,9 +25,7 @@ Future<void> main() async {

await AppRepository().initialize();

setupLocator();

runApp(const MyApp());
runApp(const ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
Expand Down
9 changes: 5 additions & 4 deletions lib/repositories/app_repository.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
// Saved in my_app/lib/src/brick/repository.dart
import 'package:brick_offline_first_with_supabase/brick_offline_first_with_supabase.dart';
import 'package:brick_sqlite/brick_sqlite.dart';
import 'package:brick_sqlite/memory_cache_provider.dart';
// This hide is for Brick's @Supabase annotation; in most cases,
// supabase_flutter **will not** be imported in application code.
import 'package:brick_supabase/brick_supabase.dart' hide Supabase;
import 'package:openwardrobe/brick/db/schema.g.dart';
import 'package:sqflite_common/sqlite_api.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

import 'package:openwardrobe/brick/brick.g.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final appRepositoryProvider = Provider<AppRepository>((ref) {
return AppRepository();
});

class AppRepository extends OfflineFirstWithSupabaseRepository {
static late AppRepository? _instance;
Expand Down
11 changes: 2 additions & 9 deletions lib/router/app_router.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:openwardrobe/brick/models/lookbook.model.dart';
import 'package:openwardrobe/ui/screens/camera/page.dart';
import 'package:openwardrobe/ui/screens/lookbook/page.dart';
import 'package:openwardrobe/ui/screens/wardrobe/settings/page.dart';
import 'package:openwardrobe/ui/screens/settings/page.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

import '../ui/screens/auth/page.dart';
import '../ui/screens/home/page.dart';
import '../ui/screens/wardrobe/page.dart';
import '../ui/screens/wardrobe/add/page.dart';
import '../ui/widgets/scaffold_with_navbar.dart';
import '../ui/screens/wardrobe/settings/account_page.dart'; // Import the new settings account page

class AppRouter {
static final GlobalKey<NavigatorState> _rootNavigatorKey =
Expand Down Expand Up @@ -44,11 +41,7 @@ class AppRouter {
name: 'Add Item',
builder: (context, state) => const CameraScreen(),
),
GoRoute(
path: '/settings/account',
name: 'SettingsAccount',
builder: (context, state) => const SettingsAccountPage(),
),

StatefulShellRoute.indexedStack(
builder: (context, state, navigationShell) {
return ScaffoldWithNavBar(navigationShell: navigationShell);
Expand Down
10 changes: 5 additions & 5 deletions lib/ui/screens/home/page.dart
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:openwardrobe/brick/models/user_profile.model.dart';
import 'package:openwardrobe/controllers/home_controller.dart';
import 'package:openwardrobe/ui/widgets/dashboard/link.dart';
import 'package:openwardrobe/ui/widgets/user_profile/user_profile_component.dart';

class HomeScreen extends StatelessWidget {
class HomeScreen extends ConsumerWidget {
HomeScreen({super.key});

final HomeController homeController = GetIt.instance<HomeController>();

@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
final homeController = ref.read(homeControllerProvider);

return Scaffold(
appBar: AppBar(
title: const Text('Home'),
Expand Down
10 changes: 5 additions & 5 deletions lib/ui/screens/lookbook/page.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import 'package:flutter/material.dart';
import 'package:openwardrobe/brick/models/lookbook.model.dart';
import 'package:get_it/get_it.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:openwardrobe/ui/widgets/lookbook/lookbook_component.dart';
import 'package:openwardrobe/controllers/lookbook_controller.dart';

class LookbookScreen extends StatelessWidget {
class LookbookScreen extends ConsumerWidget {
LookbookScreen({super.key});

final LookbookController lookbookController = GetIt.instance<LookbookController>();

@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
final lookbookController = ref.read(lookbookControllerProvider);

return Scaffold(
appBar: AppBar(
title: const Text('Lookbook'),
Expand Down
Loading
Loading