Skip to content
Draft
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
4 changes: 2 additions & 2 deletions lib/common/util.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ class Util {

static void showAlertDialog(
BuildContext context, String text, String buttonLabel,
[Function? func]) {
[Function? func]) async {
// 現在のテーマからカラースキームを取得
final colorScheme = Theme.of(context).colorScheme;

showDialog(
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
Expand Down
50 changes: 48 additions & 2 deletions lib/const/config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,37 @@ class Config {

// 設定
static const String settingPageTitle = '設定画面';
static const String settingItemAccount = 'アカウント';
static const String accountNewEntry = '新規登録';
static const String accountSignIn = 'ログイン';
static const String accountSignOut = 'ログアウト';
static const String accountNickname = 'ニックネーム';
static const String accountEmail = 'メールアドレス';
static const String settingItemTheme = 'テーマ';
static const String themeLight = 'ライトモード';
static const String themeDark = 'ダークモード';
static const String themeSystemSetting = 'システム設定に従う';

// ユーザー登録
static const String userNewEntryPageTitle = 'アカウント登録';
static const String userEmail = 'メールアドレス';
static const String userPassword = 'パスワード';
static const String userDisplayName = 'ユーザー名';
static const String charactersThatDetermineWhetherAnEmailAddressIsValid = '@';
static const String userInputEnableRegExp = r'[\x20-\x7E]'; // 半角ASCII文字のみ許可
static const String entryNewUser = 'アカウントを登録する';
static const String signIn = 'ログインする';
static const int minimumPasswordLength = 8;
static const int minimumDisplayNameLength = 4;

// ログイン
static const String userSignInPageTitle = 'ログイン';

// メッセージ(成功系)
static const String messageUrlCopied = 'URLをコピーしました';
static const String successEntryNewUser = 'アカウント登録が完了しました';
static const String successSignInUser = 'ログインしました';
static const String successSignOutUser = 'ログアウトしました';

// メッセージ(促進系)
static const String pleaseEnableLocationServices = '位置情報サービスを有効にしてください';
Expand All @@ -122,16 +147,37 @@ class Config {
static const String locationPermissionDenied = '位置情報の権限が拒否されました';
static const String locationPermissionPermanentlyDenied =
'位置情報の権限が永久に拒否されています';
static const String failedToAnonymousLogin = '匿名ログインに失敗しました';
static const String failedToLogout = 'ログアウトに失敗しました';
static const String failedToAnonymousSignIn = '匿名ログインに失敗しました';
static const String failedToSignIn = 'ログインに失敗しました';
static const String failedToSignOut = 'ログアウトに失敗しました';
static const String failedToGetAnonymousUserInformation =
'匿名ユーザー情報の取得に失敗しました';
static const String anonymousUserDoesNotExist = '匿名ユーザーが存在しません';
static const String failedToGetLocationInformation = '位置情報の取得に失敗しました';
static const String failedToGetShopInformation = '店舗情報の取得に失敗しました';
static const String thisEmailAddressIsAlreadyRegistered = '既に登録済みのメールアドレスです';
static const String invalidEmailFormat = '無効なメール形式です';
static const String pleaseEnterAValidEmail = '有効なメールを入力してください';
static const String inputMustBeManyCharacters = '%sは%s文字以上入力してください';
static const String anErrorHasOccurred = 'エラーが発生しました';
static const String error = 'Error';
static const String errorDetail = '%s: %s';

// エラーコード
static const String errorCodeFirebaseAuthErrorFailedSignInAnonymously =
'failed-sign-in-anonymously';
static const String errorCodeFirebaseAuthErrorFailedSignIn = 'failed-sign-in';
static const String errorCodeFirebaseAuthErrorFailedSignOut =
'failed-sign-out';
static const String errorCodeFirebaseAuthErrorFailedGetCurrentUser =
'failed-get-current-user';
static const String errorCodeFirebaseAuthErrorEmailAlreadyInUse =
'email-already-in-use';
static const String errorCodeFirebaseAuthErrorInvalidEmail = 'invalid-email';
static const String errorCodeFirebaseAuthErrorWeakPassword =
'weak-passwordweak-password';
static const String errorCodeFirebaseAuthErrorInvalidDisplayNameLength = 'invalid-display-name-length';

// ボタンのラベル
static const String buttonLabelOk = 'OK';
static const String buttonLabelClose = '閉じる';
Expand Down
4 changes: 4 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'package:egp_client/provider/theme_notifier_provider.dart';
import 'package:egp_client/view/auth_wrapper.dart';
import 'package:egp_client/view/shop_detail_page.dart';
import 'package:egp_client/view/user_signin_page.dart';
import 'package:egp_client/view/user_new_entry_page.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
Expand Down Expand Up @@ -58,6 +60,8 @@ class MyApp extends ConsumerWidget {
shopName: '',
address: '',
),
'/user_new_entry': (_) => UserNewEntryPage(),
'/user_signin': (_) => UserSignInPage(),
},
debugShowCheckedModeBanner: false,
);
Expand Down
65 changes: 54 additions & 11 deletions lib/service/auth_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:firebase_auth/firebase_auth.dart';

import '../common/util.dart';
import '../const/config.dart';
import '../provider/firebase_provider.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'auth_service.g.dart';
Expand All @@ -14,32 +13,76 @@ class AuthService extends _$AuthService {

Future<void> signInAnonymously() async {
try {
final auth = ref.read(firebaseAuthProvider);
await auth.signInAnonymously();
FirebaseAuth.instance.signInAnonymously();
} catch (e) {
print(
Util.sprintf(Config.errorDetail, [Config.failedToAnonymousLogin, e]));
print(Util.sprintf(
Config.errorDetail, [Config.failedToAnonymousSignIn, e]));
throw FirebaseAuthException(
code: Config.errorCodeFirebaseAuthErrorFailedSignInAnonymously,
message: Config.failedToAnonymousSignIn,
);
}
}

Future<void> signIn(String email, String password) async {
try {
await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
} catch (e) {
print(Util.sprintf(Config.errorDetail, [Config.failedToSignIn, e]));
throw FirebaseAuthException(
code: Config.errorCodeFirebaseAuthErrorFailedSignIn,
message: Config.failedToSignIn,
);
}
}

Future<void> signOut() async {
try {
final auth = ref.read(firebaseAuthProvider);
await auth.signOut();
await FirebaseAuth.instance.signOut();
} catch (e) {
print(Util.sprintf(Config.errorDetail, [Config.failedToLogout, e]));
print(Util.sprintf(Config.errorDetail, [Config.failedToSignOut, e]));
throw FirebaseAuthException(
code: Config.errorCodeFirebaseAuthErrorFailedSignOut,
message: Config.failedToSignOut,
);
}
}

// 現在のユーザーを取得
User? getCurrentUser() {
try {
final auth = ref.read(firebaseAuthProvider);
return auth.currentUser;
final currentUser = FirebaseAuth.instance.currentUser;
return currentUser;
} catch (e) {
print(Util.sprintf(
Config.errorDetail, [Config.failedToGetAnonymousUserInformation, e]));
throw FirebaseAuthException(
code: Config.errorCodeFirebaseAuthErrorFailedGetCurrentUser,
message: Config.failedToGetAnonymousUserInformation,
);
}
return null;
}

// 匿名ユーザーから永続ユーザーへの昇格処理
Future<void> convertToPermanentAccount({
required String email,
required String password,
required String displayName,
}) async {
final currentUser = FirebaseAuth.instance.currentUser;

if (currentUser == null || !currentUser.isAnonymous) {
throw Exception(Config.anonymousUserDoesNotExist);
}

final credential = EmailAuthProvider.credential(
email: email,
password: password,
);

await currentUser.linkWithCredential(credential);
await currentUser.updateDisplayName(displayName);
await currentUser.reload();
}
}
2 changes: 1 addition & 1 deletion lib/service/auth_service.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading