diff --git a/lib/core/TopScreen.dart b/lib/core/TopScreen.dart index cd3aebd1..a49937b1 100644 --- a/lib/core/TopScreen.dart +++ b/lib/core/TopScreen.dart @@ -1,10 +1,8 @@ -import 'package:blueberry_flutter_template/feature/post/PostScreen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; -import '../feature/admin/AdminUserListPage.dart'; -import '../feature/login/LoginScreen.dart'; -import '../feature/match/MatchScreen.dart'; +import '../utils/AppStringEnglish.dart'; /// TopScreen.dart /// @@ -15,26 +13,25 @@ import '../feature/match/MatchScreen.dart'; final selectedIndexProvider = StateProvider((ref) => 0); +final List routes = [ + '/post', + '/match', + '/mypage', + '/admin', +]; + class TopScreen extends ConsumerWidget { - static const String name = '/TopScreen'; + static const String name = 'TopScreen'; + final Widget child; - const TopScreen({super.key}); + const TopScreen({super.key, required this.child}); @override Widget build(BuildContext context, WidgetRef ref) { final selectedIndex = ref.watch(selectedIndexProvider); - final List pages = [ - const PostScreen(), - const MatchScreen(), - const LoginScreen(), - const AdminUserListPage() - ]; - return Scaffold( - body: Center( - child: pages[selectedIndex], - ), + body: child, bottomNavigationBar: BottomNavigationBar( type: BottomNavigationBarType.fixed, selectedIconTheme: const IconThemeData(color: Colors.black), @@ -44,24 +41,26 @@ class TopScreen extends ConsumerWidget { items: const [ BottomNavigationBarItem( icon: Icon(Icons.podcasts), - label: 'Post', + label: AppStringEnglish.postScreenLabel, ), BottomNavigationBarItem( icon: Icon(Icons.pets), - label: 'match', + label: AppStringEnglish.matchScreenLabel, ), BottomNavigationBarItem( icon: Icon(Icons.account_circle), - label: 'MyPage', + label: AppStringEnglish.myPageScreenLabel, ), BottomNavigationBarItem( icon: Icon(Icons.admin_panel_settings), - label: 'Admin', + label: AppStringEnglish.adminScreenLabel, ), ], currentIndex: selectedIndex, - onTap: (index) => - ref.read(selectedIndexProvider.notifier).state = index, + onTap: (index) { + ref.read(selectedIndexProvider.notifier).state = index; + context.go(routes[index]); + }, ), ); } diff --git a/lib/core/widget/SocialCompanyText.dart b/lib/core/widget/SocialCompanyText.dart new file mode 100644 index 00000000..d85f5e38 --- /dev/null +++ b/lib/core/widget/SocialCompanyText.dart @@ -0,0 +1,22 @@ +import 'package:blueberry_flutter_template/feature/mypage/provider/MyPageSocialLoginCompany,dart.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../../utils/AppStrings.dart'; + +class SocialCompanyTextWidget extends ConsumerWidget { + const SocialCompanyTextWidget({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final socialCompany = ref.watch(myPageSocialLoginCompanyProvider); + return socialCompany.when( + data: (name) => Text( + name, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + loading: () => const Text(''), + error: (e, s) => const Text(AppStrings.nickNameTextWidgetError), + ); + } +} diff --git a/lib/feature/login/LoginScreen.dart b/lib/feature/login/LoginScreen.dart index abf4642e..94e09084 100644 --- a/lib/feature/login/LoginScreen.dart +++ b/lib/feature/login/LoginScreen.dart @@ -5,7 +5,7 @@ import 'package:go_router/go_router.dart'; import '../../core/widget/SquareTitleWidget.dart'; import '../../services/FirebaseAuthServiceProvider.dart'; -import '../../services/SocialAuthService.dart'; +import '../../services/socialauth/SocialAuthService.dart'; import '../../utils/AppStrings.dart'; import '../camera/CameraGalleryScreen.dart'; import '../camera/provider/PageProvider.dart'; diff --git a/lib/feature/login/provider/UserInfoProvider.dart b/lib/feature/login/provider/UserInfoProvider.dart index fcee211e..d3dc4b20 100644 --- a/lib/feature/login/provider/UserInfoProvider.dart +++ b/lib/feature/login/provider/UserInfoProvider.dart @@ -1,4 +1,5 @@ import 'package:blueberry_flutter_template/model/UserDataModel.dart'; +import 'package:blueberry_flutter_template/utils/AppStrings.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -64,6 +65,8 @@ final userInfoNotifierProvider = mbti: 'NULL', profileImageUrl: '', isMemberShip: false, + socialLogin: false, + socialCompany: AppStrings.usingEmailLogin, createdAt: DateTime.now(), userClass: 'user', likeGivens: [""]))); diff --git a/lib/feature/match/MatchScreen.dart b/lib/feature/match/MatchScreen.dart index 2cc9edf3..81152967 100644 --- a/lib/feature/match/MatchScreen.dart +++ b/lib/feature/match/MatchScreen.dart @@ -9,6 +9,7 @@ import 'widget/MatchProfileListWidget.dart'; /// - SwipeButtonWidget: 수동으로 좌/우 스와이프를 할 수 있는 버튼 class MatchScreen extends StatelessWidget { + static const String name = 'MatchScreen'; const MatchScreen({super.key}); @override diff --git a/lib/feature/mypage/MyPageScreen.dart b/lib/feature/mypage/MyPageScreen.dart index da6519ba..febd4ee8 100644 --- a/lib/feature/mypage/MyPageScreen.dart +++ b/lib/feature/mypage/MyPageScreen.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:blueberry_flutter_template/core/widget/SocialCompanyText.dart'; import 'package:blueberry_flutter_template/feature/mypage/provider/ProfileImageProvider.dart'; import 'package:cloud_functions/cloud_functions.dart'; import 'package:easy_engine/easy_engine.dart'; @@ -42,7 +43,7 @@ class MyPageScreen extends ConsumerWidget { mainAxisAlignment: MainAxisAlignment.start, children: [ NickNameTextWidget(), - Text("Google 로그인을 사용 중 입니다.") + SocialCompanyTextWidget(), ], ), ) diff --git a/lib/feature/mypage/provider/MyPageNameProvider.dart b/lib/feature/mypage/provider/MyPageNameProvider.dart index b05e8c42..08d276c3 100644 --- a/lib/feature/mypage/provider/MyPageNameProvider.dart +++ b/lib/feature/mypage/provider/MyPageNameProvider.dart @@ -7,6 +7,6 @@ final myPageNicknameProvider = StreamProvider((ref) { final userId = FirebaseAuth.instance.currentUser!.uid; return firestore.collection('users').doc(userId).snapshots().map((snapshot) { - return snapshot['name'] as String; + return snapshot['nickName'] as String; }); }); diff --git a/lib/feature/mypage/provider/MyPageSocialLoginCompany,dart.dart b/lib/feature/mypage/provider/MyPageSocialLoginCompany,dart.dart new file mode 100644 index 00000000..7f4a09ec --- /dev/null +++ b/lib/feature/mypage/provider/MyPageSocialLoginCompany,dart.dart @@ -0,0 +1,12 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +final myPageSocialLoginCompanyProvider = StreamProvider((ref) { + final firestore = FirebaseFirestore.instance; + final userId = FirebaseAuth.instance.currentUser!.uid; + + return firestore.collection('users').doc(userId).snapshots().map((snapshot) { + return snapshot['socialCompany'] as String; + }); +}); diff --git a/lib/feature/phoneauth/ConfirmationPage.dart b/lib/feature/phoneauth/ConfirmationPage.dart index e9a97393..b632f50e 100644 --- a/lib/feature/phoneauth/ConfirmationPage.dart +++ b/lib/feature/phoneauth/ConfirmationPage.dart @@ -64,6 +64,8 @@ class ConfirmationPage extends ConsumerWidget { // 오류 뱉어내는거 하나 만들어야함 ex ) ID or Password 형식에 문제가 있다라고 쏴야할듯 ? await firebaseService.upDateUserDB(email, name); FirebaseAnalytics.instance.logSignUp(signUpMethod: 'email'); + ref.invalidate(emailProvider); + ref.invalidate(passwordConfirmProvider); if (context.mounted) { context.goNamed(TopScreen.name); } diff --git a/lib/feature/post/PostScreen.dart b/lib/feature/post/PostScreen.dart index 3cc5fe46..b16795b1 100644 --- a/lib/feature/post/PostScreen.dart +++ b/lib/feature/post/PostScreen.dart @@ -15,6 +15,7 @@ import '../chat/ChatRoomScreen.dart'; import 'PostingScreen.dart'; class PostScreen extends StatelessWidget { + static const String name = 'PostScreen'; const PostScreen({super.key}); @override diff --git a/lib/feature/rank/provider/UserRankProvider.dart b/lib/feature/rank/provider/UserRankProvider.dart index 7fc6b2f7..b8731c55 100644 --- a/lib/feature/rank/provider/UserRankProvider.dart +++ b/lib/feature/rank/provider/UserRankProvider.dart @@ -83,6 +83,8 @@ Future> _fetchUsersFromFirestore() async { isMemberShip: data['isMemberShip'] as bool, profileImageUrl: data['profilePicture'] as String?, createdAt: DateTime.parse(data['createdAt'] as String), + socialLogin: data['socialLogin'] as bool, + socialCompany: data['socialCompany'] as String, mbti: data['mbti'] as String, fcmToken: data['fcmToken'] as String?, likeGivens: data["likeGivens"] as List, diff --git a/lib/feature/signup/SignUpScreen.dart b/lib/feature/signup/SignUpScreen.dart index 7ba35920..4a923f60 100644 --- a/lib/feature/signup/SignUpScreen.dart +++ b/lib/feature/signup/SignUpScreen.dart @@ -28,8 +28,6 @@ class SignUpScreen extends ConsumerStatefulWidget { class _SignUpScreenState extends ConsumerState { @override Widget build(BuildContext context) { - ref.watch(emailProvider); - ref.watch(passwordConfirmProvider); return Scaffold( appBar: AppBar( leading: IconButton( diff --git a/lib/feature/signup/provider/SignUpDataProviders.dart b/lib/feature/signup/provider/SignUpDataProviders.dart index c2fb7d3e..7cc34efe 100644 --- a/lib/feature/signup/provider/SignUpDataProviders.dart +++ b/lib/feature/signup/provider/SignUpDataProviders.dart @@ -1,7 +1,7 @@ // 이메일 인증 ( 아이디 ) import 'package:flutter_riverpod/flutter_riverpod.dart'; -final emailProvider = StateProvider.autoDispose((ref) => ''); +final emailProvider = StateProvider((ref) => ''); final emailVerificationCodeProvider = StateProvider((ref) => ''); // 이름, 닉네임 생성 @@ -10,7 +10,7 @@ final nicknameProvider = StateProvider.autoDispose((ref) => ''); // 비밀번호 생성 final passwordProvider = StateProvider.autoDispose((ref) => ''); -final passwordConfirmProvider = StateProvider.autoDispose((ref) => ''); +final passwordConfirmProvider = StateProvider((ref) => ''); // 휴대폰 번호 인증 ( 구매할 때 휴대폰 인증 ) ( 따로 만들기 ) final residentRegistrationNumberProvider = diff --git a/lib/feature/signup/provider/SignUpEmailDuplicationProvider.dart b/lib/feature/signup/provider/SignUpEmailDuplicationProvider.dart index fda1418b..f7dd48b7 100644 --- a/lib/feature/signup/provider/SignUpEmailDuplicationProvider.dart +++ b/lib/feature/signup/provider/SignUpEmailDuplicationProvider.dart @@ -1,8 +1,8 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -final emailDuplicateProvider = - StateNotifierProvider((ref) { +final emailDuplicateProvider = StateNotifierProvider.autoDispose< + EmailDuplicateNotifier, EmailDuplicateState>((ref) { return EmailDuplicateNotifier(); }); diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 0d1ef8bd..2247f029 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -132,8 +132,13 @@ class $AssetsLogoGen { /// File path: assets/logo/logo_5.png AssetGenImage get logo5 => const AssetGenImage('assets/logo/logo_5.png'); + /// File path: assets/logo/mbti_logo.webp + AssetGenImage get mbtiLogo => + const AssetGenImage('assets/logo/mbti_logo.webp'); + /// List of all assets - List get values => [logo1, logo2, logo3, logo4, logo5]; + List get values => + [logo1, logo2, logo3, logo4, logo5, mbtiLogo]; } class Assets { diff --git a/lib/main.dart b/lib/main.dart index 4b81f483..4639e143 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ import 'core/provider/ThemeProvider.dart'; import 'firebase_options.dart'; import 'utils/AppTheme.dart'; import 'utils/Talker.dart'; +import 'package:url_strategy/url_strategy.dart'; Future main() async { runZonedGuarded(() async { @@ -34,6 +35,8 @@ Future main() async { FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } + setPathUrlStrategy(); // Hash URL(#)을 제거하고 Path URL을 사용하도록 설정 + runApp(const ProviderScope( child: MyApp(), )); diff --git a/lib/model/UserModel.dart b/lib/model/UserModel.dart index 10916699..6af0e930 100644 --- a/lib/model/UserModel.dart +++ b/lib/model/UserModel.dart @@ -6,19 +6,20 @@ part 'generated/UserModel.g.dart'; @freezed class UserModel with _$UserModel { - const factory UserModel({ - required String userClass, - required String userId, - required String name, - required String email, - required int age, - required bool isMemberShip, - required String mbti, - required DateTime createdAt, - required List likeGivens, - String? profileImageUrl, - String? fcmToken, - }) = _UserModel; + const factory UserModel( + {required String userClass, + required String userId, + required String name, + required String email, + required int age, + required bool isMemberShip, + required String mbti, + required DateTime createdAt, + required List likeGivens, + String? profileImageUrl, + String? fcmToken, + required bool socialLogin, + required String socialCompany}) = _UserModel; factory UserModel.fromJson(Map json) => _$UserModelFromJson(json); diff --git a/lib/router/RouterProvider.dart b/lib/router/RouterProvider.dart index 251a8327..e859ac94 100644 --- a/lib/router/RouterProvider.dart +++ b/lib/router/RouterProvider.dart @@ -5,30 +5,29 @@ import 'package:blueberry_flutter_template/feature/admin/AdminUserListPage.dart' import 'package:blueberry_flutter_template/feature/camera/CameraGalleryScreen.dart'; import 'package:blueberry_flutter_template/feature/camera/CameraScreen.dart'; import 'package:blueberry_flutter_template/feature/chat/ChatScreen.dart'; +import 'package:blueberry_flutter_template/feature/mbti/MBTITestScreen.dart'; import 'package:blueberry_flutter_template/feature/payment/widget/WebPaymentWidget.dart'; import 'package:blueberry_flutter_template/feature/setting/SettingScreen.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:talker_flutter/talker_flutter.dart'; import '../core/SplashScreen.dart'; import '../core/TopScreen.dart'; import '../feature/chat/ChatRoomScreen.dart'; +import '../feature/camera/SettingInsideAccountManagerWidget.dart'; import '../feature/friend/FriendsListScreen.dart'; -import '../feature/mbti/MBTIScreen.dart'; +import '../feature/match/MatchScreen.dart'; import '../feature/mypage/MyPageScreen.dart'; -import '../feature/post/PostingScreen.dart'; +import '../feature/post/PostScreen.dart'; import '../feature/profile/ProfileDetailScreen.dart'; import '../feature/rank/RankScreen.dart'; import '../feature/signup/SignUpScreen.dart'; import '../utils/ResponsiveLayoutBuilder.dart'; -import '../utils/Talker.dart'; final routerProvider = Provider((ref) { return GoRouter( initialLocation: kIsWeb ? '/' : '/splash', - observers: [TalkerRouteObserver(talker)], routes: [ GoRoute( path: '/splash', @@ -38,96 +37,111 @@ final routerProvider = Provider((ref) { const SplashScreen(), ), ), - GoRoute( - path: '/', - name: TopScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const TopScreen()), + ShellRoute( + builder: (context, state, child) { + return TopScreen(child: child); + }, routes: [ GoRoute( - path: 'signup', - name: SignUpScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const SignUpScreen()), + path: '/', + name: TopScreen.name, + builder: (context, state) => const PostScreen(), // 초기 화면 설정 ), GoRoute( - path: 'setting', - name: SettingScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const SettingScreen()), - ), - GoRoute( - path: 'posting', - name: PostingScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const PostingScreen()), + path: '/chat', + name: ChatScreen.name, + builder: (context, state) => const ChatScreen(), ), GoRoute( - path: 'mypage', - name: MyPageScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const MyPageScreen()), + path: '/friends', + name: FriendsListScreen.name, + builder: (context, state) => const FriendsListScreen(), ), GoRoute( path: 'webpayment', name: WebPaymentWidget.name, builder: (context, state) => ResponsiveLayoutBuilder(context, const WebPaymentWidget()), + path: '/match', + name: MatchScreen.name, + builder: (context, state) => const MatchScreen(), ), GoRoute( - path: 'chat', - name: ChatScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const ChatScreen()), + path: '/mbti', + name: MBTITestScreen.name, + builder: (context, state) => const MBTITestScreen(), ), GoRoute( - path: 'mbti', - name: MBTIScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const MBTIScreen()), + path: '/mypage', + name: MyPageScreen.name, + builder: (context, state) => const MyPageScreen(), ), GoRoute( - path: 'adminloading', - name: AdminLoadingPage.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const AdminLoadingPage()), + path: '/profiledetail', + name: ProfileDetailScreen.name, + builder: (context, state) => const ProfileDetailScreen(), ), GoRoute( - path: 'adminmain', - name: AdminScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const AdminScreen()), + path: '/rank', + name: RankingScreen.name, + builder: (context, state) => const RankingScreen(), ), GoRoute( - path: 'userlistinadmin', + path: '/post', + name: PostScreen.name, + builder: (context, state) => const PostScreen(), + ), + ], + ), + // 바텀 네비게이션바가 필요 없는 루트 + GoRoute( + path: '/signup', + name: SignUpScreen.name, + builder: (context, state) => const SignUpScreen(), + ), + GoRoute( + path: '/setting', + name: SettingScreen.name, + builder: (context, state) => const SettingScreen(), + ), + GoRoute( + path: '/settingaccount', + name: SettingAccountManagerWidget.name, + builder: (context, state) => ResponsiveLayoutBuilder( + context, const SettingAccountManagerWidget()), + ), + GoRoute( + path: '/webpayment', + name: WebPaymentWidget.name, + builder: (context, state) => + ResponsiveLayoutBuilder(context, const WebPaymentWidget()), + ), + //Admin 관련 루트 + GoRoute( + path: '/admin', + name: AdminScreen.name, + builder: (context, state) => + ResponsiveLayoutBuilder(context, const AdminScreen()), + routes: [ + GoRoute( + path: 'userlist', name: AdminUserListPage.name, builder: (context, state) => ResponsiveLayoutBuilder(context, const AdminUserListPage()), ), GoRoute( - path: 'userdetailinadmin', + path: 'userdetail', name: AdminUserDetailPage.name, builder: (context, state) => ResponsiveLayoutBuilder(context, const AdminUserDetailPage()), ), GoRoute( - path: 'chatroom', - name: ChatRoomScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const ChatRoomScreen()), - ), - GoRoute( - path: 'friends', - name: FriendsListScreen.name, - builder: (context, state) => - ResponsiveLayoutBuilder(context, const FriendsListScreen()), - ), - GoRoute( - path: 'ranking', - name: RankingScreen.name, + path: 'loading', + name: AdminLoadingPage.name, builder: (context, state) => - ResponsiveLayoutBuilder(context, const RankingScreen()), + ResponsiveLayoutBuilder(context, const AdminLoadingPage()), ), + GoRoute( path: 'profiledetail', name: ProfileDetailScreen.name, diff --git a/lib/services/FirebaseService.dart b/lib/services/FirebaseService.dart index 287d64e3..c3116c33 100644 --- a/lib/services/FirebaseService.dart +++ b/lib/services/FirebaseService.dart @@ -1,4 +1,6 @@ import 'package:blueberry_flutter_template/model/UserModel.dart'; +import 'package:blueberry_flutter_template/utils/AppStrings.dart'; +import 'package:blueberry_flutter_template/utils/Talker.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_database/firebase_database.dart'; @@ -46,15 +48,17 @@ class FirebaseService { age: 1, isMemberShip: false, profileImageUrl: '', - createdAt: DateTime.now(), mbti: 'NULL', + socialLogin: false, + socialCompany: AppStrings.usingEmailLogin, + createdAt: DateTime.timestamp(), userClass: 'user', likeGivens: [""], ); // 멤버쉽 모델은 추후에 인앱 결제시 유저가 구독하고 있거나 유저 상태에 대한 변경을 주기 위해 추가했음 await _firestore.collection('users').doc(user.uid).set(newUser.toJson()); } catch (e) { - print('Error updating user: $e'); + talker.error('Error updating user: $e'); throw Exception('Failed to update user'); } } @@ -72,7 +76,7 @@ class FirebaseService { 'isMemberShip': true, }); } catch (e) { - print('Error updating user membership: $e'); + talker.error('Error updating user membership: $e'); throw Exception('Failed to update user membership'); } } @@ -85,7 +89,7 @@ class FirebaseService { 'timestamp': DateTime.now(), }); } catch (e) { - print('Error creating chat room: $e'); + talker.error('Error creating chat room: $e'); throw Exception('Failed to create chat room'); } } diff --git a/lib/services/socialauth/RandomUserNickNameGenerator.dart b/lib/services/socialauth/RandomUserNickNameGenerator.dart new file mode 100644 index 00000000..6d156c34 --- /dev/null +++ b/lib/services/socialauth/RandomUserNickNameGenerator.dart @@ -0,0 +1,53 @@ +import 'dart:math'; + +class RandomUserNickNameGenerator { + static final List adjectives = [ + '행복한', + '즐거운', + '신비로운', + '용감한', + '영리한', + '재미있는', + '친절한', + '멋진', + '귀여운', + '활발한', + '섹시한', + '짖궂은', + '똑똑한', + '강인한', + '성실한', + '건강함', + ]; + + static final List nouns = [ + '고양이', + '강아지', + '토끼', + '여우', + '사자', + '호랑이', + '팬더', + '코알라', + '돌고래', + '펭귄', + '도마뱀', + '앵무새', + '악어', + '햄스터', + '늑대', + '원숭이', + '오리', + '닭', + '캥거루', + ]; + + static String generate() { + final random = Random(); + final adjective = adjectives[random.nextInt(adjectives.length)]; + final noun = nouns[random.nextInt(nouns.length)]; + final number = random.nextInt(100); + + return '$adjective$noun$number'; + } +} diff --git a/lib/services/SocialAuthService.dart b/lib/services/socialauth/SocialAuthService.dart similarity index 88% rename from lib/services/SocialAuthService.dart rename to lib/services/socialauth/SocialAuthService.dart index 683793b0..0d2ea822 100644 --- a/lib/services/SocialAuthService.dart +++ b/lib/services/socialauth/SocialAuthService.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'dart:math'; +import 'package:blueberry_flutter_template/services/socialauth/RandomUserNickNameGenerator.dart'; +import 'package:blueberry_flutter_template/utils/AppStrings.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:crypto/crypto.dart'; import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart'; @@ -11,7 +13,7 @@ import 'package:google_sign_in/google_sign_in.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; -import '../utils/Talker.dart'; +import '../../utils/Talker.dart'; class SocialAuthService { get context => null; @@ -29,7 +31,7 @@ class SocialAuthService { ); final userCredential = await FirebaseAuth.instance.signInWithCredential(gCredential); - getAuthenticateWithFirebase(userCredential); + getAuthenticateWithFirebase(userCredential, AppStrings.usingGoogleLogin); } } @@ -55,7 +57,7 @@ class SocialAuthService { final result = await FirebaseAuth.instance.signInWithCredential(credential); - getAuthenticateWithFirebase(result); + getAuthenticateWithFirebase(result, AppStrings.usingAppleLogin); } on SignInWithAppleAuthorizationException catch (e) { // Apple 로그인 관련 오류 처리 talker.error('Apple 로그인 오류: ${e.code}'); @@ -84,11 +86,12 @@ class SocialAuthService { GithubAuthProvider githubAuthProvider = GithubAuthProvider(); final userCredential = await FirebaseAuth.instance.signInWithProvider(githubAuthProvider); - getAuthenticateWithFirebase(userCredential); + getAuthenticateWithFirebase(userCredential, AppStrings.usingGithubLogin); } ///* 인증정보를 바탕으로 firestore에 저장하는 함수 - void getAuthenticateWithFirebase(UserCredential? credential) async { + void getAuthenticateWithFirebase( + UserCredential? credential, String socialCompany) async { if (credential?.user == null) { return null; } @@ -97,6 +100,8 @@ class SocialAuthService { .doc(FirebaseAuth.instance.currentUser!.uid); var snapshot = await ref.get(); if (!snapshot.exists) { + String randomNickname = RandomUserNickNameGenerator.generate(); + return await FirebaseFirestore.instance .collection('users') .doc(FirebaseAuth.instance.currentUser!.uid) @@ -105,7 +110,10 @@ class SocialAuthService { //account_level이 0이되면 Delete timestamp확인하여 14일 뒤 삭제 'email': FirebaseAuth.instance.currentUser!.email, 'name': FirebaseAuth.instance.currentUser!.displayName, + 'nickName': randomNickname, 'age': 0, + 'socialLogin': true, + 'socialCompany': socialCompany, 'createdAt': DateTime.timestamp(), 'profilePicture': "", }); diff --git a/lib/utils/AppStringEnglish.dart b/lib/utils/AppStringEnglish.dart index b2555803..50b1b3ac 100644 --- a/lib/utils/AppStringEnglish.dart +++ b/lib/utils/AppStringEnglish.dart @@ -2,14 +2,10 @@ class AppStringEnglish { static const String appTitle = 'Community App'; //TopScreen.dart - static const String chatScreenLabel = 'Chat'; - static const String friendsScreenLabel = 'Friends'; - static const String matchScreenLabel = 'Match'; - static const String mbtiScreenLabel = 'MBTI'; - static const String myPageScreenLabel = 'My Page'; - static const String profileDetailScreenLabel = 'Profile'; - static const String rankingScreenLabel = 'Rank'; static const String postScreenLabel = 'Post'; + static const String matchScreenLabel = 'Match'; + static const String myPageScreenLabel = 'MyPage'; + static const String adminScreenLabel = 'Admin'; //ChatPage.dart static const String chatPageTitle = 'Chat Page'; diff --git a/lib/utils/AppStrings.dart b/lib/utils/AppStrings.dart index 2d71b5c4..e07623b6 100644 --- a/lib/utils/AppStrings.dart +++ b/lib/utils/AppStrings.dart @@ -65,6 +65,10 @@ class AppStrings { static const String checkVerifyCode = '인증하기'; static const String checkDuplicateEmail = '중복확인'; static const String requiredYourEmail = '이메일 인증을 위해 사용 중인 이메일을 입력해주세요.'; + static const String usingEmailLogin = '이메일 로그인을 사용 중 입니다.'; + static const String usingGithubLogin = 'github 로그인을 사용 중 입니다.'; + static const String usingGoogleLogin = 'google 로그인을 사용 중 입니다.'; + static const String usingAppleLogin = 'apple 로그인을 사용 중 입니다.'; //MBTIScreen.dart static const String titleMBTI = 'MBTI'; diff --git a/pubspec.yaml b/pubspec.yaml index 6db711db..583c54af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -94,6 +94,7 @@ dependencies: # In App Purchase in_app_purchase: ^3.2.0 + url_strategy: ^0.3.0 # Lint @@ -108,6 +109,7 @@ dependencies: # map google_maps_flutter: ^2.9.0 geolocator: ^12.0.0 + intl: ^0.19.0 dev_dependencies: flutter_test: