Skip to content

Commit

Permalink
feat: add auth module with supabase
Browse files Browse the repository at this point in the history
  • Loading branch information
luisburgos committed Sep 24, 2022
1 parent 5244e74 commit e29c96d
Show file tree
Hide file tree
Showing 14 changed files with 191 additions and 15 deletions.
4 changes: 4 additions & 0 deletions example/lib/get/core_module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:example/shared/app_routes.dart';
import 'package:get/get.dart';

import 'extensions/get_module.dart';
import 'modules/auth_module.dart';
import 'modules/home_module.dart';
import 'modules/join_module.dart';
import 'modules/new_trivia_module.dart';
Expand All @@ -20,6 +21,9 @@ class CoreModule extends GetModule {
newTriviaRoute: AppRoutes.newTrivia,
),
),
GetModuleRoute(
module: AuthModule(),
),
GetModuleRoute(
module: NewTriviaModule(),
),
Expand Down
9 changes: 4 additions & 5 deletions example/lib/get/get_main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import '../bootstrap.dart';
import '../get/core_module.dart';
import '../shared/app_routes.dart';
import '../shared/not_found_page.dart';
import 'modules/auth_module.dart';
import 'overrides/app_navigator.dart';
import 'overrides/feedbacks_executor.dart';

Expand All @@ -14,11 +15,9 @@ Future main() async {
rootAppRoute: '/',
navigator: GetAppNavigator(),
feedbacksExecutor: GetFeedbacksExecutor(),
/*registries: [
ProfileModuleRegistries(
() => Get.find<IProfileRepository>(),
),
],*/
initialRegistries: [
AuthModuleBuzzRegistry(),
],
);

return bootstrap(
Expand Down
31 changes: 31 additions & 0 deletions example/lib/get/modules/auth_module.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'package:buzz/buzz.dart';
import 'package:get/get.dart';

import '../../shared/modules/auth/login.dart';
import '../extensions/get_module.dart';

class AuthModuleBuzzRegistry extends BuzzRegistry {
@override
void register(BuzzBase buzz) {
buzz.on<LoginCommand>().listen(
(event) => LoginCommandHandler().handle(event),
);
}
}

class AuthModule extends GetModule {
@override
List<GetRoute> get routes => [
LoginRoute(),
];
}

class LoginRoute extends GetRoute {
LoginRoute();

@override
GetPage get asGetPage => GetPage(
name: LoginPage.routeName,
page: () => const LoginPage(),
);
}
6 changes: 4 additions & 2 deletions example/lib/shared/app_routes.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:example/shared/modules/auth/login.dart';

import 'modules/home/page.dart';
import 'modules/join/page.dart';
import 'modules/new_trivia/page.dart';
Expand All @@ -6,9 +8,9 @@ import 'modules/trivia/play/page.dart';
import 'modules/trivia/scoreboard/page.dart';

class AppRoutes {
// Home can display Authentication info
// Authentication depends on User information and Sessions
static const root = HomePage.routeName;
static const login = LoginPage.routeName;

static const newTrivia = NewTriviaPage.routeName;
static const trivia = TriviaPage.routeName;
static const triviaPlay = TriviaPlayPage.routeName;
Expand Down
144 changes: 144 additions & 0 deletions example/lib/shared/modules/auth/login.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import 'dart:async';

import 'package:buzz/buzz.dart';
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

class LoginPage extends StatelessWidget {
static const String routeName = '/login';
static const String pageName = 'LoginPage';

const LoginPage({
Key? key,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return const BasePage(
name: pageName,
body: LoginView(),
);
}
}

class LoginView extends StatelessWidget {
const LoginView({
Key? key,
}) : super(key: key);

@override
Widget build(BuildContext context) {
final controller = Get.put(LoginViewController());

return Obx(() {
return Column(
children: [
Padding(
padding: const EdgeInsets.all(16),
child: controller.isLoading()
? const CircularProgressIndicator()
: Text(controller.loginResultString),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: TextField(
controller: controller.emailTextController,
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Email',
hintText: 'Enter valid email id as abc@gmail.com',
),
),
),
Padding(
padding: const EdgeInsets.all(16),
child: MainActionWidget(
action: MainAction(
label: 'Sign In',
onPressed: () => controller.onSignInTap(),
),
),
),
],
);
});
}
}

class LoginViewController extends GetxController {
RxBool isLoading = false.obs;
final emailTextController = TextEditingController();
StreamSubscription? subscription;
Rx<LoginCommandResult?> loginResult = Rxn<LoginCommandResult>();

String get loginResultString {
final result = loginResult();
if (result != null) {
return 'user: ${result.user} – error: ${result.errorMessage}';
}

return 'No login result yet';
}

@override
void onInit() {
subscription = Buzz.on<LoginCommandResult>().listen(_onLoginCommandResult);
super.onInit();
}

void onSignInTap() {
final email = emailTextController.text;
isLoading(true);
Buzz.fire(LoginCommand(email: email));
}

@override
void onClose() {
emailTextController.dispose();
subscription?.cancel();
subscription = null;
super.onClose();
}

void _onLoginCommandResult(LoginCommandResult result) {
isLoading(false);
loginResult(result);
}
}

class LoginCommand extends Command {
LoginCommand({
required this.email,
});
final String email;
}

class LoginCommandHandler extends CommandHandler<LoginCommand> {
@override
void handle(LoginCommand event) async {
final response = await Supabase.instance.client.auth.signIn(
email: event.email,
);

final user = response.data?.user;
final error = response.error;

if (error != null) {
Buzz.fire(LoginCommandResult.failure(error.message));
return;
}

//TODO: Avoid leaking data models
Buzz.fire(LoginCommandResult.success(user));
}
}

class LoginCommandResult {
final User? user;
final String? errorMessage;

LoginCommandResult.success(this.user) : errorMessage = null;
LoginCommandResult.failure(this.errorMessage) : user = null;
}
1 change: 0 additions & 1 deletion example/lib/shared/modules/join/join_view.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:buzz/buzz.dart';
import 'package:core/core.dart';
import 'package:example/shared/components/labeled_section.dart';
import 'package:example/shared/modules/trivia/components/trivia_data_view.dart';
import 'package:example/shared/modules/trivia/page.dart';
import 'package:flutter/material.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:core/core.dart';
import 'package:example/shared/components/labeled_section.dart';
import 'package:flutter/material.dart';
import 'package:universal_html/html.dart' show window;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:example/shared/components/labeled_section.dart';
import 'package:core/components/labeled_section.dart';
import 'package:flutter/material.dart';

class TriviaDataView extends StatelessWidget {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';

import '../../../components/labeled_section.dart';

class TriviaFinishedStatusView extends StatelessWidget {
const TriviaFinishedStatusView({
Key? key,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';

import '../../../components/labeled_section.dart';
import '../components/copy_join_link_view.dart';
import '../components/trivia_data_view.dart';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:core/core.dart';
import 'package:example/shared/components/labeled_section.dart';
import 'package:flutter/material.dart';

class TriviaStartedStatusView extends StatelessWidget {
Expand Down
3 changes: 2 additions & 1 deletion example/packages/core/lib/core.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
library core;

export 'components/labeled_section.dart';
export 'components/named_page.dart';
export 'src/in_memory_store.dart';
export 'src/json_reader.dart';
export 'src/managed_stream_builder.dart';
export 'src/named_page.dart';

0 comments on commit e29c96d

Please sign in to comment.