Skip to content
Merged
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
57 changes: 26 additions & 31 deletions frontend/ongi/lib/screens/signup/familycode_create_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:ongi/core/app_colors.dart';
import 'package:ongi/screens/signup/ready_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:ongi/services/auth_service.dart';
import 'package:ongi/services/code_service.dart';

class FamilycodeCreateScreen extends StatefulWidget {
const FamilycodeCreateScreen({super.key});
Expand All @@ -13,44 +13,38 @@ class FamilycodeCreateScreen extends StatefulWidget {

class _FamilycodeCreateScreenState extends State<FamilycodeCreateScreen> {
final TextEditingController _familycodeCtrl = TextEditingController();
bool _isCodeGenerated = false;

Future<void> _handleSubmit() async {
final familyCode = _familycodeCtrl.text.trim();

if (_isCodeGenerated) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ReadyScreen()),
);
return;
}

try {
final prefs = await SharedPreferences.getInstance();
final email = prefs.getString('signup_email') ?? '';
final password = prefs.getString('signup_password') ?? '';
final name = prefs.getString('signup_username') ?? '';
final isParent = prefs.getString('user_mode') == 'parent';
final familyName = prefs.getString('family_name') ?? '';

final codeService = CodeService();
final response = await codeService.familyCreate(name: familyName);

if (email.isEmpty || password.isEmpty || name.isEmpty) {
final code = response['code'];
if (code != null) {
setState(() {
_familycodeCtrl.text = code;
_isCodeGenerated = true;
});
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('회원가입 정보가 올바르지 않습니다')),
const SnackBar(content: Text('코드 생성에 실패했습니다.')),
);
return;
}

final authService = AuthService();
await authService.register(
email: email,
password: password,
name: name,
isParent: isParent,
);

// 회원가입 성공 후 준비 완료 화면으로 이동
if (!mounted) return;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const ReadyScreen(),
),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('회원가입 실패: $e')),
SnackBar(content: Text('코드 생성 실패: $e')),
);
}
}
Expand Down Expand Up @@ -116,6 +110,7 @@ class _FamilycodeCreateScreenState extends State<FamilycodeCreateScreen> {
padding: const EdgeInsets.only(left: 40, right: 40, top: 40),
child: TextField(
controller: _familycodeCtrl,
readOnly: true,
keyboardType: TextInputType.text,
style: const TextStyle(
fontSize: 25,
Expand Down Expand Up @@ -159,9 +154,9 @@ class _FamilycodeCreateScreenState extends State<FamilycodeCreateScreen> {
),
),
onPressed: _handleSubmit,
child: const Text(
'생성하기',
style: TextStyle(
child: Text(
_isCodeGenerated ? '함께하기' : '생성하기',
style: const TextStyle(
fontSize: 33,
fontWeight: FontWeight.w400,
color: Colors.white,
Expand Down
88 changes: 44 additions & 44 deletions frontend/ongi/lib/screens/signup/familycode_screen.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import 'package:flutter/material.dart';
import 'package:ongi/core/app_colors.dart';
import 'package:ongi/screens/signup/ready_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:ongi/services/auth_service.dart';
import 'package:ongi/services/family_join_service.dart';

class FamilycodeScreen extends StatefulWidget {
const FamilycodeScreen({super.key});
Expand All @@ -13,50 +12,49 @@ class FamilycodeScreen extends StatefulWidget {

class _FamilycodeScreenState extends State<FamilycodeScreen> {
final TextEditingController _familycodeCtrl = TextEditingController();
final FamilyJoinService _familyJoinService = FamilyJoinService();
bool _isLoading = false;

void _showErrorSnackBar(String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
message,
style: const TextStyle(color: AppColors.ongiOrange),
),
backgroundColor: Colors.white,
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
duration: const Duration(seconds: 2),
),
);
}

Future<void> _handleSubmit() async {
final familyCode = _familycodeCtrl.text.trim();
if (familyCode.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('가족 코드를 입력해주세요')),
);
_showErrorSnackBar('가족코드를 입력해주세요.');
return;
}

try {
final prefs = await SharedPreferences.getInstance();
final email = prefs.getString('signup_email') ?? '';
final password = prefs.getString('signup_password') ?? '';
final name = prefs.getString('signup_username') ?? '';
final isParent = prefs.getString('user_mode') == 'parent';

if (email.isEmpty || password.isEmpty || name.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('회원가입 정보가 올바르지 않습니다')),
);
return;
}
setState(() {
_isLoading = true;
});

final authService = AuthService();
await authService.register(
email: email,
password: password,
name: name,
isParent: isParent,
);

// 회원가입 성공 후 준비 완료 화면으로 이동
if (!mounted) return;
Navigator.push(
try {
final result = await _familyJoinService.familyJoin(code: familyCode);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const ReadyScreen(),
),
MaterialPageRoute(builder: (context) => const ReadyScreen()),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('회원가입 실패: $e')),
);
_showErrorSnackBar('존재하지 않는 가족이에요.');
} finally {
setState(() {
_isLoading = false;
});
}
}

Expand Down Expand Up @@ -163,15 +161,17 @@ class _FamilycodeScreenState extends State<FamilycodeScreen> {
borderRadius: BorderRadius.circular(20),
),
),
onPressed: _handleSubmit,
child: const Text(
'입력하기',
style: TextStyle(
fontSize: 33,
fontWeight: FontWeight.w400,
color: Colors.white,
),
),
onPressed: _isLoading ? null : _handleSubmit,
child: _isLoading
? const CircularProgressIndicator(color: AppColors.ongiOrange)
: const Text(
'입력하기',
style: TextStyle(
fontSize: 33,
fontWeight: FontWeight.w400,
color: Colors.white,
),
),
),
),
),
Expand Down
72 changes: 15 additions & 57 deletions frontend/ongi/lib/screens/signup/familyname_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import 'package:ongi/core/app_colors.dart';
import 'package:ongi/screens/signup/familycode_screen.dart';
import 'package:ongi/screens/signup/familycode_create_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:ongi/services/auth_service.dart';

class FamilynameScreen extends StatefulWidget {
const FamilynameScreen({super.key});
Expand All @@ -20,32 +19,25 @@ class _FamilynameScreenState extends State<FamilynameScreen> {
final familyName = _familynameCtrl.text.trim();
if (familyName.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('가족 이름을 입력해주세요')),
SnackBar(
content: const Text(
'가족이름을 입력해주세요.',
style: TextStyle(color: AppColors.ongiOrange),
),
backgroundColor: Colors.white,
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
duration: const Duration(seconds: 2),
),
);
return;
}

try {
final prefs = await SharedPreferences.getInstance();
final email = prefs.getString('signup_email') ?? '';
final password = prefs.getString('signup_password') ?? '';
final name = prefs.getString('signup_username') ?? '';
final isParent = prefs.getString('user_mode') == 'parent';

if (email.isEmpty || password.isEmpty || name.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('회원가입 정보가 올바르지 않습니다')),
);
return;
}

final authService = AuthService();
await authService.register(
email: email,
password: password,
name: name,
isParent: isParent,
);
await prefs.setString('family_name', familyName);

if (!mounted) return;
Navigator.push(
Expand All @@ -56,7 +48,7 @@ class _FamilynameScreenState extends State<FamilynameScreen> {
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('회원가입 실패: $e')),
SnackBar(content: Text('오류가 발생했습니다: $e')),
);
}
}
Expand Down Expand Up @@ -119,41 +111,7 @@ class _FamilynameScreenState extends State<FamilynameScreen> {
),
),
Padding(

padding: const EdgeInsets.only(left: 40, right: 40, top: 40),
child: Row(
children: [
Checkbox(
value: _isChecked,
activeColor: AppColors.ongiOrange,
onChanged: (bool? value) {
if (value == null) return;
setState(() => _isChecked = value);

if (value) {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const FamilycodeScreen(),
),
).then((_) => setState(() => _isChecked = false));
}
},
),
const Text(
'이미 가입한 가족이 있어요!',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w400,
height: 1.2,
color: AppColors.ongiOrange,
),
),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 40, right: 40, top: 5),
padding: const EdgeInsets.only(left: 40, right: 40, top: 30),
child: TextField(
controller: _familynameCtrl,
keyboardType: TextInputType.text,
Expand Down
Loading
Loading