Skip to content

Commit

Permalink
Email duplicate checker (#49)
Browse files Browse the repository at this point in the history
* ImageUpload 수정

* made an email duplicate checker
  • Loading branch information
AlphanoJack authored Jul 21, 2024
1 parent cac9484 commit f985e37
Show file tree
Hide file tree
Showing 14 changed files with 187 additions and 17 deletions.
6 changes: 3 additions & 3 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ class MyApp extends StatelessWidget {
// 플랫폼에 따른 초기 화면 설정(web은 스플래쉬스크린 없음)
home: kIsWeb
? ResponsiveLayoutBuilder(
context,
const TopScreen(),
)
context,
const TopScreen(),
)
: const SplashScreen(),
);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ class PageState {
class PageProviderNotifier extends StateNotifier<PageState> {
PageProviderNotifier() : super(PageState(pageController: PageController(), pageNumber: 0));

void moveToPAge(int i, {PageController? pageController}) {
state = state.copyWith(pageNumber: i);
state.pageController.animateToPage(i, duration: const Duration(microseconds: 300), curve: Curves.easeInOut);
void moveToPage(int index, {PageController? pageController}) {
state = state.copyWith(pageNumber: index);
state.pageController.animateToPage(index, duration: const Duration(microseconds: 300), curve: Curves.easeInOut);
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/providers/camera/image_quility_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class ImageState {


class ImageQualityStateNotifier extends StateNotifier<ImageState> {
ImageQualityStateNotifier() : super (ImageState(imageQualityLevel: 0));
ImageQualityStateNotifier() : super (ImageState(imageQualityLevel: 100));

void setImageQuality(bool newQuality) {
state = state.copyWith(
Expand Down
41 changes: 41 additions & 0 deletions lib/providers/user/SignUpEmailDuplicationProvider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final emailDuplicateProvider = StateNotifierProvider<EmailDuplicateNotifier, EmailDuplicateState>((ref) {
return EmailDuplicateNotifier();
});

class EmailDuplicateState {
String? email;
bool isDuplication = false;

EmailDuplicateState({this.email, required this.isDuplication});
}

class EmailDuplicateNotifier extends StateNotifier<EmailDuplicateState> {
EmailDuplicateNotifier() : super(EmailDuplicateState(isDuplication: false));

final FirebaseFirestore _firestore = FirebaseFirestore.instance;

Future<bool> isDuplication(String email) async {
try {
QuerySnapshot querySnapshot = await _firestore.collection('users')
.where('email', isEqualTo: email)
.get();
if (querySnapshot.docs.isNotEmpty) {
// 이메일이 이미 존재하는 경우
state = EmailDuplicateState(email: email, isDuplication: true);
return true;
} else {
// 이메일이 존재하지 않는 경우
state = EmailDuplicateState(email: email, isDuplication: false);
return false;
}
} catch(e){
print('$e');
state = EmailDuplicateState(email: email, isDuplication: false);
return false;
}
}

}
2 changes: 1 addition & 1 deletion lib/screens/mypage/LoginScreen.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../../providers/camera/page_provider.dart';
import '../../providers/camera/PageProvider.dart';
import '../../providers/user/FirebaseAuthServiceProvider.dart';
import '../../providers/user/UserInfoProvider.dart';
import '../../services/SocialAuthService.dart';
Expand Down
1 change: 1 addition & 0 deletions lib/screens/mypage/MyPageScreen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -324,3 +324,4 @@ Widget _uploadProfileImageButtons(FirestoreService firestoreService,
icon: const Icon(Icons.settings),
);
}

3 changes: 2 additions & 1 deletion lib/screens/mypage/SignUpScreen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:blueberry_flutter_template/screens/mypage/signup/EmailInputScreen.dart';
import 'package:blueberry_flutter_template/screens/mypage/signup/PasswordInputPage.dart';
import 'package:blueberry_flutter_template/screens/mypage/signup/TermsOfServicePage.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -43,7 +44,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
controller: _pageController,
physics: const NeverScrollableScrollPhysics(),
children: [
EmailInputPage(
EmailInputScreen(
onNext: () => _pageController.nextPage(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
Expand Down
4 changes: 2 additions & 2 deletions lib/screens/mypage/camera/MyPageProfileImagePreview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../../../providers/camera/FirebaseStoreServiceProvider.dart';
import '../../../providers/camera/fireStorageServiceProvider.dart';
import '../../../providers/camera/page_provider.dart';
import '../../../providers/camera/PageProvider.dart';
import '../../../providers/user/ProfileImageProvider.dart';
import '../../../providers/user/UserInfoProvider.dart';

Expand Down Expand Up @@ -50,7 +50,7 @@ class SharePostScreen extends ConsumerWidget {
fixedFileName: _userId);

fireStorage.createProfileIamge(_userId, imageUrl);
pageNotifier.moveToPAge(0);
pageNotifier.moveToPage(0);
});
} catch (e) {
print(e);
Expand Down
4 changes: 2 additions & 2 deletions lib/screens/mypage/camera/ProfileCameraPage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';

import '../../../providers/camera/camera_provider.dart';
import '../../../providers/camera/page_provider.dart';
import '../../../providers/camera/PageProvider.dart';
import 'CameraShadow.dart';
import 'MyPageProfileImagePreview.dart';

Expand Down Expand Up @@ -41,7 +41,7 @@ class _TakePhotoState extends ConsumerState<ProfileCameraPage> {
title: Text('Take Photo'),
leading: IconButton(
onPressed: () {
pageNotifier.moveToPAge(0);
pageNotifier.moveToPage(0);
},
icon: Icon(Icons.arrow_back),
),
Expand Down
8 changes: 4 additions & 4 deletions lib/screens/mypage/camera/SettingsBottomSheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:permission_handler/permission_handler.dart';

import '../../../providers/camera/page_provider.dart';
import '../../../providers/camera/PageProvider.dart';

class SettingsBottomSheet extends ConsumerStatefulWidget {
SettingsBottomSheet({super.key});
Expand Down Expand Up @@ -53,7 +53,7 @@ class _SettingsBottomSheetState extends ConsumerState<SettingsBottomSheet> {
),
TextButton(
onPressed: () async {
pageNotifier.moveToPAge(1);
pageNotifier.moveToPage(1);
Navigator.pop(context);
},
child: Text("직접 촬영 하기"),
Expand All @@ -62,10 +62,10 @@ class _SettingsBottomSheetState extends ConsumerState<SettingsBottomSheet> {
onPressed: () async {
bool hasPermission = await _requestAlbumPermission();
if (hasPermission) {
pageNotifier.moveToPAge(2);
pageNotifier.moveToPage(2);
Navigator.pop(context);
} else {
pageNotifier.moveToPAge(0);
pageNotifier.moveToPage(0);
Navigator.pop(context);
}
},
Expand Down
21 changes: 21 additions & 0 deletions lib/screens/mypage/signup/EmailInputPage.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'dart:ui';


import 'package:blueberry_flutter_template/providers/user/SignUpEmailDuplicationProvider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

Expand Down Expand Up @@ -53,23 +55,42 @@ class EmailVerificationError extends EmailVerificationState {

class EmailInputPage extends ConsumerWidget {
final VoidCallback onNext;
final TextEditingController _emailController = TextEditingController();

EmailInputPage({required this.onNext});

@override
Widget build(BuildContext context, WidgetRef ref) {
final email = ref.read(emailProvider.notifier);
final emailVerification = ref.read(emailVerificationProvider.notifier);
final emailDuplicate = ref.watch(emailDuplicateProvider.notifier);

return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _emailController,
onChanged: (value) => email.state = value,
decoration: InputDecoration(labelText: '이메일 입력'),
),
SizedBox(height: 20),
ElevatedButton(onPressed: () async {
String email = _emailController.text;
bool isDuplicate = await emailDuplicate.isDuplication(email);
if (isDuplicate) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('중복된 이메일입니다.')),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('사용 가능한 이메일입니다.')),
);
}
}, child: Text('중복 확인')
),

SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
Expand Down
12 changes: 12 additions & 0 deletions lib/screens/mypage/signup/EmailInputScreen.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:blueberry_flutter_template/widgets/signup/EmailDuplicateWidget.dart';
import 'package:flutter/material.dart';

class EmailInputScreen extends StatelessWidget {
final VoidCallback onNext;
const EmailInputScreen({super.key, required this.onNext});

@override
Widget build(BuildContext context) {
return EmailDuplicateWidget(onNext: onNext);
}
}
11 changes: 11 additions & 0 deletions lib/screens/mypage/signup/NameInputPage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../SignUpScreen.dart';

class NameInputScreen extends StatelessWidget {
final VoidCallback onNext;
const NameInputScreen({super.key, required this.onNext});

@override
Widget build(BuildContext context) {
return NameInputScreen(onNext: onNext);
}
}


class NameInputPage extends ConsumerWidget {
final VoidCallback onNext;

Expand Down
83 changes: 83 additions & 0 deletions lib/widgets/signup/EmailDuplicateWidget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import 'package:blueberry_flutter_template/providers/user/SignUpEmailDuplicationProvider.dart';
import 'package:blueberry_flutter_template/screens/mypage/SignUpScreen.dart';
import 'package:blueberry_flutter_template/screens/mypage/signup/EmailInputPage.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter/material.dart';

class EmailDuplicateWidget extends ConsumerStatefulWidget {
final VoidCallback onNext;

EmailDuplicateWidget({required this.onNext});

@override
_EmailDuplicateWidgetState createState() => _EmailDuplicateWidgetState();
}

class _EmailDuplicateWidgetState extends ConsumerState<EmailDuplicateWidget> {
final TextEditingController _emailController = TextEditingController();
bool isEmailAvailable = false;

@override
Widget build(BuildContext context) {
final email = ref.read(emailProvider.notifier);
final emailVerification = ref.read(emailVerificationProvider.notifier);
final emailDuplicate = ref.watch(emailDuplicateProvider.notifier);

return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _emailController,
onChanged: (value) => email.state = value,
decoration: InputDecoration(labelText: '이메일 입력'),
),
const SizedBox(height: 20),

_duplicationBtn(emailDuplicate, context),

const SizedBox(height: 20),

_verifyBtn(emailVerification, email),
],
),
);
}

ElevatedButton _verifyBtn(EmailVerificationNotifier emailVerification, StateController<String> email) {
return ElevatedButton(
onPressed: () async {
await emailVerification.sendVerificationCode(email.state);
widget.onNext();
},
child: Text('인증번호 전송'),
);
}

ElevatedButton _duplicationBtn(EmailDuplicateNotifier emailDuplicate, BuildContext context) {
return ElevatedButton(
onPressed: () async {
String email = _emailController.text;
bool isDuplicate = await emailDuplicate.isDuplication(email);
if (isDuplicate) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('중복된 이메일입니다.')),
);
setState(() {
isEmailAvailable = false;
});
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('사용 가능한 이메일입니다.')),
);
setState(() {
isEmailAvailable = true;
});
}
},
child: Text('중복 확인'),
);
}
}

0 comments on commit f985e37

Please sign in to comment.