Skip to content

Commit

Permalink
Merge pull request #134 from DevKor-github/133-persistent-login
Browse files Browse the repository at this point in the history
133 persistent login
  • Loading branch information
jjoonleo authored Feb 10, 2025
2 parents bed713f + 799b7df commit 6372bb7
Show file tree
Hide file tree
Showing 13 changed files with 75 additions and 24 deletions.
2 changes: 1 addition & 1 deletion lib/data/repositories/authentication_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class AuthenticationRepositoryImpl implements AuthenticationRepository {
}

@override
Future<UserEntity> getUSer() async {
Future<UserEntity> getUser() async {
try {
final user = await _authenticationRemoteDataSource.getUser();
_userStreamController.add(user);
Expand Down
5 changes: 3 additions & 2 deletions lib/data/repositories/schedule_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
Future<void> updateSchedule(ScheduleEntity schedule) async {
try {
await scheduleRemoteDataSource.updateSchedule(schedule);
_scheduleStreamController
.add(Set.from(_scheduleStreamController.value)..add(schedule));
_scheduleStreamController.add(Set.from(_scheduleStreamController.value)
..remove(schedule)
..add(schedule));
//await scheduleLocalDataSource.updateSchedule(schedule);
} catch (e) {
rethrow;
Expand Down
2 changes: 1 addition & 1 deletion lib/domain/repositories/authentication_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ abstract interface class AuthenticationRepository {

Future<void> signInWithGoogle();

Future<void> getUSer();
Future<void> getUser();
}
13 changes: 13 additions & 0 deletions lib/domain/use-cases/load_user_use_case.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:injectable/injectable.dart';
import 'package:on_time_front/domain/repositories/authentication_repository.dart';

@Injectable()
class LoadUserUseCase {
final AuthenticationRepository _authenticationRepository;

LoadUserUseCase(this._authenticationRepository);

Future<void> call() async {
await _authenticationRepository.getUser();
}
}
2 changes: 1 addition & 1 deletion lib/domain/use-cases/onboard_use_case.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ class OnboardUseCase {
required String note}) async {
await _preparationRepository.createDefaultPreparation(
preparationEntity: preparationEntity, spareTime: spareTime, note: note);
await _authenticationRepository.getUSer();
await _authenticationRepository.getUser();
}
}
13 changes: 13 additions & 0 deletions lib/domain/use-cases/sign_out_use_case.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:injectable/injectable.dart';
import 'package:on_time_front/domain/repositories/authentication_repository.dart';

@Injectable()
class SignOutUseCase {
final AuthenticationRepository _authenticationRepository;

SignOutUseCase(this._authenticationRepository);

Future<void> call() async {
return _authenticationRepository.signOut();
}
}
14 changes: 14 additions & 0 deletions lib/domain/use-cases/stream_user_use_case.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import 'package:injectable/injectable.dart';
import 'package:on_time_front/domain/entities/user_entity.dart';
import 'package:on_time_front/domain/repositories/authentication_repository.dart';

@Injectable()
class StreamUserUseCase {
final AuthenticationRepository _authenticationRepository;

StreamUserUseCase(this._authenticationRepository);

Stream<UserEntity> call() {
return _authenticationRepository.userStream;
}
}
18 changes: 12 additions & 6 deletions lib/presentation/app/bloc/app_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,32 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:injectable/injectable.dart';
import 'package:on_time_front/domain/entities/user_entity.dart';
import 'package:on_time_front/domain/repositories/authentication_repository.dart';
import 'package:on_time_front/domain/use-cases/load_user_use_case.dart';
import 'package:on_time_front/domain/use-cases/sign_out_use_case.dart';
import 'package:on_time_front/domain/use-cases/stream_user_use_case.dart';

part 'app_event.dart';
part 'app_state.dart';

@Injectable()
class AppBloc extends Bloc<AppEvent, AppState> {
AppBloc(this._authenticationRepository)
AppBloc(this._streamUserUseCase, this._signOutUseCase, this._loadUserUseCase)
: super(AppState(user: const UserEntity.empty())) {
on<AppUserSubscriptionRequested>(_appUserSubscriptionRequested);
on<AppLogoutPressed>(_appLogoutPressed);
on<AppSignOutPressed>(_appLogoutPressed);
}

final AuthenticationRepository _authenticationRepository;
final StreamUserUseCase _streamUserUseCase;
final LoadUserUseCase _loadUserUseCase;
final SignOutUseCase _signOutUseCase;

Future<void> _appUserSubscriptionRequested(
AppUserSubscriptionRequested event,
Emitter<AppState> emit,
) {
_loadUserUseCase();
return emit.onEach(
_authenticationRepository.userStream,
_streamUserUseCase.call(),
onData: (user) => emit(
state.copyWith(
user: user,
Expand All @@ -38,9 +44,9 @@ class AppBloc extends Bloc<AppEvent, AppState> {
}

void _appLogoutPressed(
AppLogoutPressed event,
AppSignOutPressed event,
Emitter<AppState> emit,
) {
_authenticationRepository.signOut();
_signOutUseCase();
}
}
4 changes: 2 additions & 2 deletions lib/presentation/app/bloc/app_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ final class AppUserSubscriptionRequested extends AppEvent {
const AppUserSubscriptionRequested();
}

final class AppLogoutPressed extends AppEvent {
const AppLogoutPressed();
final class AppSignOutPressed extends AppEvent {
const AppSignOutPressed();
}
6 changes: 5 additions & 1 deletion lib/presentation/home/components/home_app_bar.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:on_time_front/presentation/app/bloc/app_bloc.dart';
import 'package:on_time_front/presentation/shared/constants/constants.dart';

class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
Expand Down Expand Up @@ -30,7 +32,9 @@ class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
[
IconButton(
icon: friendsSvg,
onPressed: () {},
onPressed: () {
context.read<AppBloc>().add(AppSignOutPressed());
},
),
IconButton(
icon: bellSvg,
Expand Down
5 changes: 2 additions & 3 deletions lib/presentation/home/screens/home_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import 'package:on_time_front/presentation/home/components/todays_schedule_tile.
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:on_time_front/presentation/home/components/week_calendar.dart';
import 'package:on_time_front/presentation/shared/components/arc_indicator.dart';
import 'package:on_time_front/presentation/shared/components/bottom_navigation_bar.dart';

class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
Expand Down Expand Up @@ -57,8 +56,8 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
final dateOfToday = DateTime(
DateTime.now().year, DateTime.now().month, DateTime.now().day, 0, 0, 0);
final theme = Theme.of(context);
final double score = context.select(
(AppBloc bloc) => bloc.state.user.mapOrNull((user) => user.score)!);
final double score = context.select((AppBloc bloc) =>
bloc.state.user.mapOrNull((user) => user.score) ?? -1);
_animationController = AnimationController(
duration: const Duration(seconds: 1),
vsync: this,
Expand Down
9 changes: 4 additions & 5 deletions lib/presentation/onboarding/screens/onboarding_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,8 @@ class _OnboardingFormState extends State<OnboardingForm>
if (_tabController.index < _numberOfPages - 1) {
_updateCurrentPageIndex(_tabController.index + 1);
} else {
return await context
.read<OnboardingCubit>()
.onboardingFormSubmitted(preparationFormData.toOnboardingState());
return await context.read<OnboardingCubit>().onboardingFormSubmitted(
preparationFormData.toOnboardingState(spareTime));
}
}

Expand Down Expand Up @@ -278,7 +277,7 @@ class PreparationFormData {
return tmp.map((e) => e.preparationStep).toList();
}

OnboardingState toOnboardingState() {
OnboardingState toOnboardingState(Duration spareTime) {
final sortedList = sortByOrder().preparationStepList;
final steps = sortedList
.mapIndexed((index, step) => OnboardingPreparationStepState(
Expand All @@ -290,7 +289,7 @@ class PreparationFormData {
: null, // if not last step, set next step id
))
.toList();
return OnboardingState(preparationStepList: steps);
return OnboardingState(preparationStepList: steps, spareTime: spareTime);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:on_time_front/domain/entities/preparation_entity.dart';
import 'package:on_time_front/presentation/app/bloc/app_bloc.dart';
import 'package:on_time_front/presentation/schedule_create/bloc/schedule_form/schedule_form_bloc.dart';

class ScheduleSpareAndPreparingTimeForm extends StatefulWidget {
Expand Down Expand Up @@ -62,8 +63,9 @@ class _ScheduleSpareAndPreparingTimeFormState
Expanded(
flex: 1,
child: FormField<Duration>(
initialValue:
widget.initalValue.scheduleSpareTime ?? Duration.zero,
initialValue: widget.initalValue.scheduleSpareTime ??
context.select((AppBloc appBloc) =>
appBloc.state.user.mapOrNull((user) => user.spareTime))!,
builder: (field) => TextField(
readOnly: true,
decoration: InputDecoration(labelText: ''),
Expand Down

0 comments on commit 6372bb7

Please sign in to comment.