Skip to content

Commit

Permalink
Merge branch 'release/2024-summer' into feature/emailVerfity
Browse files Browse the repository at this point in the history
  • Loading branch information
AlphanoJack authored Jul 25, 2024
2 parents 68c4413 + 9baa489 commit a64b81d
Show file tree
Hide file tree
Showing 20 changed files with 231 additions and 85 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ ios/firebase_app_id_file.json
# Ignore Firebase options file
lib/firebase_options.dart
/firebase.json
.firebase/
.firebaserc

# Ignore generated files
/pubspec.lock
Expand Down
4 changes: 1 addition & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@
Which Android application id (or package name) do you want to use for this configuration, e.g. 'com.example.app'
package name
Android : com.blueberry.template
ios : com.example.blueberryTemplate
package name : com.blueberry.template
```
4. google-services.json, GoogleService-Info.plist 파일을 프로젝트에 추가해주세요.
- `파이어베이스 콘솔 접속 > 프로젝트 설정 > 프로젝트 설정 > 아래로 스크롤 > 내 앱` 에서 다운로드 가능합니다.
Expand Down
27 changes: 5 additions & 22 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
import 'package:blueberry_flutter_template/screens/mypage/password/PasswordResetPage.dart';
import 'package:blueberry_flutter_template/screens/TopScreen.dart';
import 'package:blueberry_flutter_template/router/RouterProvider.dart';
import 'package:blueberry_flutter_template/utils/AppStrings.dart';
import 'package:blueberry_flutter_template/utils/ResponsiveLayoutBuilder.dart';
import 'package:dart_openai/dart_openai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'firebase_options.dart';
import 'providers/ThemeProvider.dart';
import 'screens/SplashScreen.dart';
import 'utils/AppTheme.dart';

Future<void> main() async {
OpenAI.apiKey = ""; // OpenAI API Key를 넣어주세요.
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
Expand All @@ -26,32 +20,21 @@ Future<void> main() async {
class MyApp extends StatelessWidget {
const MyApp({super.key});

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return ProviderScope(
child: Consumer(
builder: (context, ref, child) {
// ThemeProvider를 구독하여 다크모드 상태를 가져옴
final themeMode = ref.watch(themeNotifierProvider);
final themeMode = ref.watch(themeNotifierProvider); // 테마 모드 상태 관리 객체
final router = ref.watch(routerProvider); // 라우터 객체

return MaterialApp(
navigatorKey: navigatorKey,
return MaterialApp.router(
routerConfig: router,
debugShowCheckedModeBanner: false,
title: AppStrings.appTitle,
// 라이트 모드 테마 설정
theme: lightTheme,
// 다크 모드 테마 설정
darkTheme: darkTheme,
// 현재 테마 모드 설정
themeMode: themeMode,
// 플랫폼에 따른 초기 화면 설정(web은 스플래쉬스크린 없음)
home: kIsWeb
? ResponsiveLayoutBuilder(
context,
const TopScreen(),
)
: const SplashScreen(),
);
},
),
Expand Down
10 changes: 6 additions & 4 deletions lib/model/UserModel.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import 'package:freezed_annotation/freezed_annotation.dart';

part 'generated/UserModel.freezed.dart';
part 'generated/UserModel.g.dart';

// TODO : User Class 추가
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 String profileImageUrl,
required DateTime createdAt,
String? profileImageUrl,
String? fcmToken,
}) = _UserModel;

factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
factory UserModel.fromJson(Map<String, dynamic> json) =>
_$UserModelFromJson(json);
}
16 changes: 16 additions & 0 deletions lib/providers/MyPageNameProvider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final myPageNicknameProvider = StreamProvider<String>((ref) {
final firestore = FirebaseFirestore.instance;
final userId = FirebaseAuth.instance.currentUser!.uid;

return firestore
.collection('users')
.doc(userId)
.snapshots()
.map((snapshot) {
return snapshot['name'] as String;
});
});
3 changes: 2 additions & 1 deletion lib/providers/user/UserInfoProvider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ final userInfoNotifierProvider =
email: '',
age: 123,
profileImageUrl: '',
createdAt: DateTime.now())));
createdAt: DateTime.now(),
userClass: 'user')));
});

// 유저 정보 업데이트를 위한 노티파이어
Expand Down
40 changes: 40 additions & 0 deletions lib/router/RouterProvider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'package:blueberry_flutter_template/screens/SettingScreen.dart';
import 'package:blueberry_flutter_template/screens/TopScreen.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';

import '../screens/SplashScreen.dart';
import '../screens/mypage/SignUpScreen.dart';
import '../utils/ResponsiveLayoutBuilder.dart';

final routerProvider = Provider<GoRouter>((ref) {
return GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => ResponsiveLayoutBuilder(
context,
kIsWeb ? const TopScreen() : const SplashScreen(),
)),
GoRoute(
path: '/TopScreen',
name: TopScreen.name,
builder: (context, state) =>
ResponsiveLayoutBuilder(context, const TopScreen()),
),
GoRoute(
path: '/SignUpScreen',
name: SignUpScreen.name,
builder: (context, state) =>
ResponsiveLayoutBuilder(context, const SignUpScreen()),
),
GoRoute(
path: '/SettingsScreen',
name: SettingScreen.name,
builder: (context, state) =>
ResponsiveLayoutBuilder(context, const SettingScreen()),
)
],
);
});
1 change: 1 addition & 0 deletions lib/screens/SettingScreen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import '../providers/NotificationProvider.dart';
import '../providers/ThemeProvider.dart';

class SettingScreen extends ConsumerWidget {
static const String name = 'SettingsScreen';
const SettingScreen({super.key});

@override
Expand Down
19 changes: 6 additions & 13 deletions lib/screens/SplashScreen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart'; // kIsWeb 상수 사용
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../utils/ResponsiveLayoutBuilder.dart';

/// 작성일: 2024-07-01
/// 작성자: 오물개
/// 내용: 앱 초기화와 필수 자원 로딩을 관리하는 스플래쉬 스크린 구현
import 'package:go_router/go_router.dart';

class SplashScreen extends ConsumerStatefulWidget {
static const String routeName = '/SplashScreen';

const SplashScreen({super.key});

@override
Expand Down Expand Up @@ -43,13 +40,9 @@ class _SplashScreenState extends ConsumerState<SplashScreen> {
// 스플레쉬 스크린 확인을 위한 3초 지연
await Future.delayed(const Duration(seconds: 3));
// 초기화 완료 후 메인 화면으로 전환
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => ResponsiveLayoutBuilder(
context,
const TopScreen(),
)),
);
if (mounted) {
context.goNamed(TopScreen.name);
}
} catch (e) {
// 초기화 중 발생한 오류 처리
print('초기화 오류: $e');
Expand Down
7 changes: 7 additions & 0 deletions lib/screens/TopScreen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:blueberry_flutter_template/screens/chat/ChatScreen.dart';
import 'package:blueberry_flutter_template/screens/mbti/MBTIScreen.dart';
import 'package:blueberry_flutter_template/screens/profileDetail/ProfileDetailScreen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

Expand All @@ -17,6 +18,7 @@ import 'friendsList/FriendsListScreen.dart';
final selectedIndexProvider = StateProvider<int>((ref) => 0);

class TopScreen extends ConsumerWidget {
static const String name = '/TopScreen';
const TopScreen({super.key});

@override
Expand All @@ -29,6 +31,7 @@ class TopScreen extends ConsumerWidget {
const MatchScreen(),
const MBTIScreen(),
const LoginScreen(),
const ProfileDetailScreen(),
];

return Scaffold(
Expand Down Expand Up @@ -62,6 +65,10 @@ class TopScreen extends ConsumerWidget {
icon: Icon(Icons.account_circle),
label: 'MyPage',
),
BottomNavigationBarItem(
icon: Icon(Icons.supervised_user_circle_rounded),
label: 'ProfileDetail',
),
],
currentIndex: selectedIndex,
onTap: (index) =>
Expand Down
9 changes: 4 additions & 5 deletions lib/screens/mypage/LoginScreen.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import 'package:blueberry_flutter_template/screens/mypage/SignUpScreen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';

import '../../providers/camera/PageProvider.dart';
import '../../providers/user/FirebaseAuthServiceProvider.dart';
import '../../providers/user/UserInfoProvider.dart';
import '../../services/SocialAuthService.dart';
import '../../utils/AppStrings.dart';
import '../../widgets/SquareTitleWidget.dart';
import '../TopScreen.dart';
import 'MyPageScreen.dart';
import 'SignUpScreen.dart';
import 'camera/ProfileCameraPage.dart';
import 'camera/ProfileGalleryPage.dart';

Expand Down Expand Up @@ -153,10 +155,7 @@ Widget _buildLogin(BuildContext context, WidgetRef ref) {
child: const Text(AppStrings.loginButtonText),
),
TextButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SignUpScreen()),
),
onPressed: () => context.goNamed(SignUpScreen.name),
child: const Text(
AppStrings.signUpButtonText,
style: TextStyle(color: Colors.blue),
Expand Down
16 changes: 6 additions & 10 deletions lib/screens/mypage/MyPageScreen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:image_picker/image_picker.dart';
import '../../providers/camera/FirebaseStoreServiceProvider.dart';
import '../../providers/camera/fireStorageServiceProvider.dart';
import '../../providers/user/FirebaseAuthServiceProvider.dart';
import '../../providers/user/ProfileImageProvider.dart';
import '../../utils/AppStrings.dart';
import '../../widgets/CustomDividerWidget.dart';
import '../../widgets/NickNameTextWidget.dart';
import '../SettingScreen.dart';
import 'camera/SettingsBottomSheet.dart';

Expand All @@ -25,7 +28,7 @@ class MyPageScreen extends ConsumerWidget {

return Scaffold(
appBar: AppBar(
title: const Text('My Page'),
title: const Text(AppStrings.myPageTitle),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
Expand All @@ -39,11 +42,7 @@ class MyPageScreen extends ConsumerWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
"userID or userNickName",
style: TextStyle(
fontSize: 20, fontWeight: FontWeight.bold),
),
NickNameTextWidget(),
Text("Google 로그인을 사용 중 입니다.")
],
),
Expand Down Expand Up @@ -133,9 +132,7 @@ class MyPageScreen extends ConsumerWidget {
const CustomDividerWidget(),
GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return const SettingScreen();
}));
context.goNamed(SettingScreen.name);
},
child: const ListTile(
leading: Icon(Icons.notifications),
Expand Down Expand Up @@ -321,4 +318,3 @@ Widget _uploadProfileImageButtons(FirestoreService firestoreService,
icon: const Icon(Icons.settings),
);
}

2 changes: 1 addition & 1 deletion lib/screens/mypage/SignUpScreen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ final PageController _pageController = PageController();


class SignUpScreen extends StatefulWidget {
static const String name = 'SignUpScreen';
const SignUpScreen({super.key});


@override
State<SignUpScreen> createState() => _SignUpScreenState();
}
Expand Down
2 changes: 0 additions & 2 deletions lib/screens/mypage/signup/ConfirmationPage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,4 @@ class ConfirmationPage extends ConsumerWidget {
),
);
}


}
11 changes: 11 additions & 0 deletions lib/screens/profileDetail/ProfileDetailScreen.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:flutter/material.dart';
import '../../widgets/profileDetail/ProfileDetailWidget.dart';

class ProfileDetailScreen extends StatelessWidget {
const ProfileDetailScreen({super.key});

@override
Widget build(BuildContext context) {
return ProfileDetailWidget();
}
}
Loading

0 comments on commit a64b81d

Please sign in to comment.