From 160fcd036f4f2003d4e0ca95b96d428948985e65 Mon Sep 17 00:00:00 2001 From: youngbeom Date: Tue, 27 Jan 2026 17:14:35 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=BC=EC=A0=95=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20UI,=20=ED=95=98=EB=8B=A8=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20=EB=8B=A4=EB=A5=B8=20ID=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20ID=EC=9D=98=20=EB=93=B1=EB=A1=9D=EB=90=9C?= =?UTF-8?q?=20=EB=B0=98=EB=A0=A4=20=EB=8F=99=EB=AC=BC=20=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95,=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20=EC=8A=A4=EC=BC=80=EC=A5=B4=20DB=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EB=8B=A4=20=EC=82=AC=EB=A7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/.metadata | 19 +- .../kotlin/com/daoblock/app/MainActivity.kt | 5 + app/assets/icons/add_icon.svg | 3 + app/assets/icons/appointment_icon.svg | 3 - app/assets/icons/card_icon.svg | 12 + app/assets/icons/dashboard_icon.svg | 10 + app/assets/icons/female_icon.svg | 10 + app/assets/icons/home_icon.svg | 12 +- app/assets/icons/male_icon.svg | 10 + app/assets/icons/my_icon.svg | 6 +- app/assets/icons/stamp_icon.svg | 3 + app/assets/img/bad.png | Bin 0 -> 708 bytes app/assets/img/badicon.png | Bin 703 -> 0 bytes app/assets/img/good.png | Bin 0 -> 857 bytes app/assets/img/goodicon.png | Bin 862 -> 0 bytes app/lib/main.dart | 17 +- app/lib/models/schedule_model.dart | 71 ++ app/lib/providers/pet_provider.dart | 93 ++ app/lib/screens/daily_care_screen.dart | 596 +++++----- app/lib/screens/home_screen.dart | 330 ++---- .../screens/identity_verification_screen.dart | 20 +- app/lib/screens/login_screen.dart | 24 +- app/lib/screens/main_screen.dart | 48 +- app/lib/screens/my_info_screen.dart | 9 + app/lib/screens/pet_form_screen.dart | 380 +++--- app/lib/screens/pet_registration_screen.dart | 21 +- app/lib/screens/schedule_form_screen.dart | 1040 +++++++++++++++++ app/lib/screens/terms_agreement_screen.dart | 20 +- app/lib/services/api_service.dart | 175 ++- app/lib/services/firestore_service.dart | 76 ++ app/lib/widgets/common/custom_app_bar.dart | 59 + .../widgets/common/custom_time_picker.dart | 366 ++++++ .../widgets/common/pet_selection_header.dart | 256 ++++ .../daily_care/schedule_form_sheet.dart | 252 ++++ app/lib/widgets/home/pet_profile_card.dart | 43 +- app/pubspec.lock | 16 + app/pubspec.yaml | 1 + backend/index.js | 2 + backend/models/Schedule.js | 59 + backend/models/index.js | 6 + backend/routes/pets.js | 10 + backend/routes/schedules.js | 108 ++ graphic_images.jpg | Bin 0 -> 225989 bytes 43 files changed, 3230 insertions(+), 961 deletions(-) create mode 100644 app/android/app/src/main/kotlin/com/daoblock/app/MainActivity.kt create mode 100644 app/assets/icons/add_icon.svg delete mode 100644 app/assets/icons/appointment_icon.svg create mode 100644 app/assets/icons/card_icon.svg create mode 100644 app/assets/icons/dashboard_icon.svg create mode 100644 app/assets/icons/female_icon.svg create mode 100644 app/assets/icons/male_icon.svg create mode 100644 app/assets/icons/stamp_icon.svg create mode 100644 app/assets/img/bad.png delete mode 100644 app/assets/img/badicon.png create mode 100644 app/assets/img/good.png delete mode 100644 app/assets/img/goodicon.png create mode 100644 app/lib/models/schedule_model.dart create mode 100644 app/lib/providers/pet_provider.dart create mode 100644 app/lib/screens/schedule_form_screen.dart create mode 100644 app/lib/widgets/common/custom_app_bar.dart create mode 100644 app/lib/widgets/common/custom_time_picker.dart create mode 100644 app/lib/widgets/common/pet_selection_header.dart create mode 100644 app/lib/widgets/daily_care/schedule_form_sheet.dart create mode 100644 backend/models/Schedule.js create mode 100644 backend/routes/schedules.js create mode 100644 graphic_images.jpg diff --git a/app/.metadata b/app/.metadata index 6650897..00b74be 100644 --- a/app/.metadata +++ b/app/.metadata @@ -18,21 +18,6 @@ migration: - platform: android create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - - platform: ios - create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - - platform: linux - create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - - platform: macos - create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - - platform: web - create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - - platform: windows - create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 # User provided section @@ -41,5 +26,5 @@ migration: # # Files that are not part of the templates will be ignored by default. unmanaged_files: - - "lib/main.dart" - - "ios/Runner.xcodeproj/project.pbxproj" + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/app/android/app/src/main/kotlin/com/daoblock/app/MainActivity.kt b/app/android/app/src/main/kotlin/com/daoblock/app/MainActivity.kt new file mode 100644 index 0000000..a53509f --- /dev/null +++ b/app/android/app/src/main/kotlin/com/daoblock/app/MainActivity.kt @@ -0,0 +1,5 @@ +package com.daoblock.app + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/app/assets/icons/add_icon.svg b/app/assets/icons/add_icon.svg new file mode 100644 index 0000000..4ebd105 --- /dev/null +++ b/app/assets/icons/add_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/icons/appointment_icon.svg b/app/assets/icons/appointment_icon.svg deleted file mode 100644 index eaef2b8..0000000 --- a/app/assets/icons/appointment_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/assets/icons/card_icon.svg b/app/assets/icons/card_icon.svg new file mode 100644 index 0000000..95c4858 --- /dev/null +++ b/app/assets/icons/card_icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/app/assets/icons/dashboard_icon.svg b/app/assets/icons/dashboard_icon.svg new file mode 100644 index 0000000..8b4141d --- /dev/null +++ b/app/assets/icons/dashboard_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/assets/icons/female_icon.svg b/app/assets/icons/female_icon.svg new file mode 100644 index 0000000..35eda51 --- /dev/null +++ b/app/assets/icons/female_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/assets/icons/home_icon.svg b/app/assets/icons/home_icon.svg index fc6de4c..46ea901 100644 --- a/app/assets/icons/home_icon.svg +++ b/app/assets/icons/home_icon.svg @@ -1,3 +1,11 @@ - - + + + + + + + + + + diff --git a/app/assets/icons/male_icon.svg b/app/assets/icons/male_icon.svg new file mode 100644 index 0000000..f1ecdd3 --- /dev/null +++ b/app/assets/icons/male_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/assets/icons/my_icon.svg b/app/assets/icons/my_icon.svg index 2253fb4..124e5ba 100644 --- a/app/assets/icons/my_icon.svg +++ b/app/assets/icons/my_icon.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/app/assets/icons/stamp_icon.svg b/app/assets/icons/stamp_icon.svg new file mode 100644 index 0000000..f759629 --- /dev/null +++ b/app/assets/icons/stamp_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/img/bad.png b/app/assets/img/bad.png new file mode 100644 index 0000000000000000000000000000000000000000..a89bbe8c49e9f847be233df34f7252bddcd35c05 GIT binary patch literal 708 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 diff --git a/app/lib/main.dart b/app/lib/main.dart index aacc0e1..2ac53cc 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -1,18 +1,21 @@ -import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:firebase_core/firebase_core.dart'; -import 'package:intl/date_symbol_data_local.dart'; // Import here +import 'package:intl/date_symbol_data_local.dart'; import 'dart:developer'; +import 'package:provider/provider.dart'; + import 'screens/splash_screen.dart'; import 'screens/register_complete_screen.dart'; import 'utils/log_manager.dart'; +import 'providers/pet_provider.dart'; final GlobalKey navigatorKey = GlobalKey(); void main() async { WidgetsFlutterBinding.ensureInitialized(); - await initializeDateFormatting('ko_KR', null); // Add this line + await initializeDateFormatting('ko_KR', null); // 글로벌 에러 핸들링 FlutterError.onError = (FlutterErrorDetails details) { @@ -31,7 +34,13 @@ void main() async { log('Firebase initialization failed: $e'); LogManager().addLog('[Firebase Init Error] $e'); } - runApp(const RupApp()); + + runApp( + MultiProvider( + providers: [ChangeNotifierProvider(create: (_) => PetProvider())], + child: const RupApp(), + ), + ); } class RupApp extends StatelessWidget { diff --git a/app/lib/models/schedule_model.dart b/app/lib/models/schedule_model.dart new file mode 100644 index 0000000..da93662 --- /dev/null +++ b/app/lib/models/schedule_model.dart @@ -0,0 +1,71 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; + +class Schedule { + final String id; + final String petId; + final DateTime date; + final String type; // 'general', 'important' + final bool isCompleted; + final String title; + final String? note; + final DateTime createdAt; + final int? repeatInterval; // 반복 간격 (1, 2, ...) + final String? repeatUnit; // 반복 단위 ('day', 'week', 'month', 'year') + final bool isAlarmOn; // 알림 설정 여부 + final DateTime? alarmTime; // 알림 시간 + + Schedule({ + required this.id, + required this.petId, + required this.date, + required this.type, + required this.isCompleted, + required this.title, + this.note, + required this.createdAt, + this.repeatInterval, + this.repeatUnit, + this.isAlarmOn = false, + this.alarmTime, + }); + + Map toMap() { + return { + 'id': id, + 'petId': petId, + 'date': Timestamp.fromDate(date), + 'type': type, + 'isCompleted': isCompleted, + 'title': title, + 'note': note, + 'createdAt': Timestamp.fromDate(createdAt), + 'repeatInterval': repeatInterval, + 'repeatUnit': repeatUnit, + 'isAlarmOn': isAlarmOn, + 'alarmTime': alarmTime != null ? Timestamp.fromDate(alarmTime!) : null, + }; + } + + factory Schedule.fromMap(Map map) { + DateTime parseDate(dynamic value) { + if (value is Timestamp) return value.toDate(); + if (value is String) return DateTime.tryParse(value) ?? DateTime.now(); + return DateTime.now(); + } + + return Schedule( + id: map['id']?.toString() ?? '', + petId: map['petId']?.toString() ?? '', + date: parseDate(map['date']), + type: map['type']?.toString() ?? 'general', + isCompleted: map['isCompleted'] == true, + title: map['title']?.toString() ?? '', + note: map['note']?.toString(), + createdAt: parseDate(map['createdAt']), + repeatInterval: map['repeatInterval'] as int?, + repeatUnit: map['repeatUnit']?.toString(), + isAlarmOn: map['isAlarmOn'] == true, + alarmTime: map['alarmTime'] != null ? parseDate(map['alarmTime']) : null, + ); + } +} diff --git a/app/lib/providers/pet_provider.dart b/app/lib/providers/pet_provider.dart new file mode 100644 index 0000000..6d2b7a6 --- /dev/null +++ b/app/lib/providers/pet_provider.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import '../models/pet_model.dart'; +import '../services/api_service.dart'; +import '../services/auth_service.dart'; + +class PetProvider with ChangeNotifier { + final ApiService _apiService = ApiService(); + final AuthService _authService = AuthService(); + + List _pets = []; + Pet? _selectedPet; + bool _isLoading = false; + int? _userId; + + List get pets => _pets; + Pet? get selectedPet => _selectedPet; + bool get isLoading => _isLoading; + int? get userId => _userId; + + // Load user and then pets + Future loadUserAndPets() async { + _isLoading = true; + // notifyListeners(); // Avoid notifying during build if called from init + + try { + final userInfo = await _authService.getUserInfo(); + if (userInfo != null) { + _userId = userInfo['id'] is int + ? userInfo['id'] + : int.tryParse(userInfo['id'].toString()); + + if (_userId != null) { + await _fetchPets(); + } + } + } catch (e) { + debugPrint('Error loading user/pets in provider: $e'); + } finally { + _isLoading = false; + notifyListeners(); + } + } + + // Fetch pets from API + Future _fetchPets() async { + if (_userId == null) return; + try { + final petsData = await _apiService.getPets(_userId!); + _pets = petsData.map((e) => Pet.fromMap(e)).toList(); + + // Set default selected pet if needed + if (_pets.isNotEmpty) { + if (_selectedPet == null) { + _selectedPet = _pets.first; + } else { + // Verify if currently selected pet still exists (e.g. after update) + final exists = _pets.any((p) => p.id == _selectedPet!.id); + if (exists) { + // Update the object to get latest data + _selectedPet = _pets.firstWhere((p) => p.id == _selectedPet!.id); + } else { + _selectedPet = _pets.first; + } + } + } else { + _selectedPet = null; + } + } catch (e) { + debugPrint('Error fetching pets: $e'); + _pets = []; + } + } + + // Refresh data (e.g. after add/edit) + Future refreshPets() async { + await _fetchPets(); + notifyListeners(); + } + + // Select a pet + void selectPet(Pet pet) { + _selectedPet = pet; + notifyListeners(); + } + + // Clear state (e.g. on logout) + void clearState() { + _userId = null; + _pets = []; + _selectedPet = null; + notifyListeners(); + } +} diff --git a/app/lib/screens/daily_care_screen.dart b/app/lib/screens/daily_care_screen.dart index f2f70d8..00c7c9a 100644 --- a/app/lib/screens/daily_care_screen.dart +++ b/app/lib/screens/daily_care_screen.dart @@ -3,9 +3,14 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:intl/intl.dart'; -import '../models/pet_model.dart'; -import '../services/firestore_service.dart'; +import 'package:provider/provider.dart'; +import '../models/schedule_model.dart'; +import '../services/api_service.dart'; import '../theme/app_colors.dart'; +import '../widgets/common/pet_selection_header.dart'; +import 'schedule_form_screen.dart'; +import '../providers/pet_provider.dart'; +import 'pet_form_screen.dart'; class DailyCareScreen extends StatefulWidget { const DailyCareScreen({super.key}); @@ -15,11 +20,10 @@ class DailyCareScreen extends StatefulWidget { } class _DailyCareScreenState extends State { - final FirestoreService _firestoreService = FirestoreService(); DateTime _focusedDay = DateTime.now(); DateTime _selectedDay = DateTime.now(); - String? _userId; - Pet? _selectedPet; + bool _isStampMode = false; + final DraggableScrollableController _sheetController = DraggableScrollableController(); @@ -29,77 +33,161 @@ class _DailyCareScreenState extends State { super.dispose(); } + // 날짜 정규화 (시간 제거) DateTime _normalizeDate(DateTime date) { return DateTime(date.year, date.month, date.day); } - late final Map> _events; - @override void initState() { super.initState(); - _userId = _firestoreService.getCurrentUserId(); - - final today = _normalizeDate(DateTime.now()); - _events = { - today: [ - 'flower', - 'flower', - 'flower', - 'flower', - 'incomplete', - 'flower', - 'important', - 'general', - 'general', - ], // 오늘: 9개 (3x3 테스트) - today.subtract(const Duration(days: 1)): [ - 'flower', - 'flower', - 'flower', - ], // 어제: 완료3 - today.subtract(const Duration(days: 2)): ['general'], // 2일전: 일반1 - today.subtract(const Duration(days: 3)): [ - 'incomplete', - 'flower', - ], // 3일전: 실패1, 완료1 - today.subtract(const Duration(days: 5)): [ - 'flower', - 'flower', - 'flower', - ], // 5일전: 완료3 - today.subtract(const Duration(days: 7)): [ - 'incomplete', - 'incomplete', - ], // 7일전: 실패2 - today.subtract(const Duration(days: 10)): [ - 'important', - 'general', - ], // 10일전: 중요1, 일반1 - }; + WidgetsBinding.instance.addPostFrameCallback((_) { + final provider = context.read(); + if (provider.userId == null) { + provider.loadUserAndPets(); + } + }); } - List _getEventsForDay(DateTime day) { - return _events[_normalizeDate(day)] ?? []; + List _getSchedulesForDay( + DateTime day, + Map> scheduleMap, + ) { + return scheduleMap[_normalizeDate(day)] ?? []; + } + + // Data Variables + List _schedules = []; + bool _isLoadingSchedules = false; + String? _lastPetId; + DateTime? _lastFocusedMonth; + final ApiService _apiService = ApiService(); + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _fetchSchedulesIfNeeded(); + } + + Future _fetchSchedulesIfNeeded() async { + final petProvider = context.read(); + final selectedPet = petProvider.selectedPet; + + if (selectedPet == null) { + setState(() { + _schedules = []; + _lastPetId = null; + }); + return; + } + + bool shouldUpdate = false; + // Check if Pet Changed + if (_lastPetId != selectedPet.id) { + shouldUpdate = true; + } + // Check if Month Changed (only year/month matters) + if (_lastFocusedMonth == null || + _lastFocusedMonth!.year != _focusedDay.year || + _lastFocusedMonth!.month != _focusedDay.month) { + shouldUpdate = true; + } + + if (shouldUpdate) { + _lastPetId = selectedPet.id; + _lastFocusedMonth = _focusedDay; + await _fetchSchedules(selectedPet.id, _focusedDay); + } + } + + Future _fetchSchedules(String petId, DateTime date) async { + setState(() { + _isLoadingSchedules = true; + }); + + try { + final data = await _apiService.getSchedules( + petId: petId, + year: date.year, + month: date.month, + ); + + final List fetchedSchedules = data + .map((item) => Schedule.fromMap(item)) + .toList(); + + if (mounted) { + setState(() { + _schedules = fetchedSchedules; + _isLoadingSchedules = false; + }); + } + } catch (e) { + debugPrint('Error fetching schedules: $e'); + if (mounted) { + setState(() { + _isLoadingSchedules = false; + // Optional: Show error + }); + } + } + } + + void _onMonthChanged(DateTime focusedDay) { + setState(() { + _focusedDay = focusedDay; + }); + // Trigger fetch manually since state updated + final petProvider = context.read(); + if (petProvider.selectedPet != null) { + _fetchSchedules(petProvider.selectedPet!.id, focusedDay); + _lastFocusedMonth = focusedDay; // Update cache key + } } @override Widget build(BuildContext context) { + final petProvider = context.watch(); + final selectedPet = petProvider.selectedPet; + return Scaffold( backgroundColor: Colors.white, body: SafeArea( child: Stack( children: [ Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildHeader(), - SizedBox(height: 30.h), // Equal spacing 1 - _buildCustomCalendarHeader(), // Custom Header - SizedBox(height: 30.h), // Equal spacing 2 + _buildHeader(petProvider), + SizedBox(height: 10.h), + _buildCustomCalendarHeader(), + SizedBox(height: 30.h), Expanded( child: Padding( padding: EdgeInsets.symmetric(horizontal: 20.w), - child: _buildCalendar(), + child: selectedPet == null + ? const Center(child: Text("반려동물을 선택해주세요")) + : Builder( + builder: (context) { + if (_isLoadingSchedules && _schedules.isEmpty) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + // 데이터 처리: List -> Map> + Map> scheduleMap = {}; + for (var schedule in _schedules) { + final date = _normalizeDate(schedule.date); + if (scheduleMap[date] == null) { + scheduleMap[date] = []; + } + scheduleMap[date]!.add(schedule); + } + + return _buildCalendar(scheduleMap); + }, + ), ), ), ], @@ -111,76 +199,63 @@ class _DailyCareScreenState extends State { floatingActionButton: FloatingActionButton( heroTag: 'daily_care_fab', onPressed: () { - // 일정 추가 로직 (추후 구현) - ScaffoldMessenger.of( + if (petProvider.selectedPet == null) { + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('반려동물을 먼저 선택해주세요.'))); + return; + } + + Navigator.push( context, - ).showSnackBar(const SnackBar(content: Text('일정 추가 기능은 준비 중입니다.'))); + MaterialPageRoute( + builder: (context) => + ScheduleFormScreen(selectedDate: _selectedDay), + ), + ); }, backgroundColor: AppColors.highlight, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16.r), + borderRadius: BorderRadius.circular(12.r), + ), + child: SvgPicture.asset( + 'assets/icons/add_icon.svg', + width: 24.w, + height: 24.w, ), - child: const Icon(Icons.add, color: Colors.white), ), ); } - Widget _buildHeader() { + Widget _buildHeader(PetProvider petProvider) { return Padding( - padding: EdgeInsets.only(left: 20.w, right: 20.w, top: 10.h, bottom: 0), - child: StreamBuilder>( - stream: _userId != null - ? _firestoreService.getPets(_userId!) - : const Stream.empty(), - builder: (context, snapshot) { - if (!snapshot.hasData || snapshot.data!.isEmpty) { + padding: EdgeInsets.only(left: 10.w, right: 20.w, top: 6.h, bottom: 0), + child: Builder( + builder: (context) { + final pets = petProvider.pets; + final selectedPet = petProvider.selectedPet; + final isLoading = petProvider.isLoading; + + if (isLoading) { return const SizedBox.shrink(); } - final pets = snapshot.data!; - if (_selectedPet == null || - !pets.any((p) => p.id == _selectedPet!.id)) { - _selectedPet = pets.first; - } - - return Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - InkWell( - onTap: () {}, - child: Row( - children: [ - CircleAvatar( - radius: 20.r, - backgroundColor: Colors.grey[200], - backgroundImage: _selectedPet!.profileImageUrl != null - ? NetworkImage(_selectedPet!.profileImageUrl!) - : null, - child: _selectedPet!.profileImageUrl == null - ? SvgPicture.asset( - 'assets/icons/profile_icon.svg', - width: 20.w, - colorFilter: ColorFilter.mode( - Colors.grey[400]!, - BlendMode.srcIn, - ), - ) - : null, - ), - SizedBox(width: 8.w), - Text( - _selectedPet!.name, - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 18.sp, - fontWeight: FontWeight.bold, - ), - ), - Icon(Icons.keyboard_arrow_down, size: 24.w), - ], - ), - ), - ], + return PetSelectionHeader( + pets: pets, + selectedPet: selectedPet, + onPetSelected: (value) { + context.read().selectPet(value); + }, + onAddPetPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const PetFormScreen()), + ).then((value) { + if (value == true) { + context.read().refreshPets(); + } + }); + }, ); }, ), @@ -189,9 +264,7 @@ class _DailyCareScreenState extends State { Widget _buildCustomCalendarHeader() { return Padding( - padding: EdgeInsets.symmetric( - horizontal: 20.w, - ), // Removed vertical padding + padding: EdgeInsets.symmetric(horizontal: 20.w), child: Stack( alignment: Alignment.center, children: [ @@ -200,16 +273,13 @@ class _DailyCareScreenState extends State { children: [ InkWell( onTap: () { - setState(() { - _focusedDay = DateTime( - _focusedDay.year, - _focusedDay.month - 1, - ); - }); + _onMonthChanged( + DateTime(_focusedDay.year, _focusedDay.month - 1), + ); }, child: SvgPicture.asset( 'assets/icons/left_icon.svg', - width: 12.w, // Changed to 12px + width: 12.w, height: 12.w, ), ), @@ -225,16 +295,13 @@ class _DailyCareScreenState extends State { SizedBox(width: 30.w), InkWell( onTap: () { - setState(() { - _focusedDay = DateTime( - _focusedDay.year, - _focusedDay.month + 1, - ); - }); + _onMonthChanged( + DateTime(_focusedDay.year, _focusedDay.month + 1), + ); }, child: SvgPicture.asset( 'assets/icons/right_icon.svg', - width: 12.w, // Changed to 12px + width: 12.w, height: 12.w, ), ), @@ -242,14 +309,23 @@ class _DailyCareScreenState extends State { ), Positioned( right: 0, - child: Container( - width: 40.w, - height: 40.w, - decoration: BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(12.r), + child: InkWell( + onTap: () { + setState(() { + _isStampMode = !_isStampMode; + }); + }, + borderRadius: BorderRadius.circular(20), + child: Padding( + padding: EdgeInsets.all(4.w), + child: SvgPicture.asset( + _isStampMode + ? 'assets/icons/dashboard_icon.svg' + : 'assets/icons/stamp_icon.svg', + width: 24.w, + height: 24.w, + ), ), - child: const Icon(Icons.download, color: Colors.white, size: 20), ), ), ], @@ -257,26 +333,43 @@ class _DailyCareScreenState extends State { ); } - Widget _buildCalendar() { - return TableCalendar( + Widget _buildCalendar(Map> scheduleMap) { + return TableCalendar( shouldFillViewport: false, locale: 'ko_KR', - rowHeight: 85 - .h, // Increased to fit 3 rows of icons (approx 40px + 32px top offset) + rowHeight: 85.h, daysOfWeekHeight: 30.h, firstDay: DateTime.utc(2020, 1, 1), lastDay: DateTime.utc(2030, 12, 31), focusedDay: _focusedDay, selectedDayPredicate: (day) => isSameDay(_selectedDay, day), - headerVisible: false, // Hide default header + headerVisible: false, onDaySelected: (selectedDay, focusedDay) { - setState(() { - _selectedDay = selectedDay; - _focusedDay = focusedDay; - }); + // Update selection + if (!isSameDay(_selectedDay, selectedDay)) { + setState(() { + _selectedDay = selectedDay; + }); + } + + // Update focused month if changed (triggers stream update) + if (focusedDay.month != _focusedDay.month || + focusedDay.year != _focusedDay.year) { + _onMonthChanged(focusedDay); + } else { + // Just update focused day references without stream update + if (!isSameDay(_focusedDay, focusedDay)) { + setState(() { + _focusedDay = focusedDay; + }); + } + } }, onPageChanged: (focusedDay) { - _focusedDay = focusedDay; + if (focusedDay.month != _focusedDay.month || + focusedDay.year != _focusedDay.year) { + _onMonthChanged(focusedDay); + } }, calendarStyle: CalendarStyle( defaultTextStyle: TextStyle( @@ -306,24 +399,40 @@ class _DailyCareScreenState extends State { selectedTextStyle: const TextStyle( color: Colors.black, fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, ), - outsideDaysVisible: true, // Show outside days + outsideDaysVisible: true, ), - eventLoader: _getEventsForDay, // 이벤트 로더 + eventLoader: (day) => _getSchedulesForDay(day, scheduleMap), calendarBuilders: CalendarBuilders( - // 마커 커스텀 빌더 markerBuilder: (context, day, events) { if (events.isEmpty) return null; - // 외부 날짜인지 확인 (투명도 적용을 위해) - // 주의: _focusedDay는 페이지가 바뀔 때만 업데이트되므로, - // 달력의 현재 페이지 월과 day의 월을 비교해야 함. - // 하지만 markerBuilder는 페이징 중에 다시 빌드될 수 있음. bool isOutside = day.month != _focusedDay.month; - double opacity = isOutside ? 0.5 : 1.0; + double opacity = isOutside ? 0.3 : 1.0; + + if (_isStampMode) { + int total = events.length; + int successCount = events.where((s) => s.isCompleted).length; + bool isGood = (successCount / total) >= 0.5; + + return Positioned( + top: 40.h, + left: 0, + right: 0, + child: Center( + child: Opacity( + opacity: opacity, + child: Image.asset( + isGood ? 'assets/img/good.png' : 'assets/img/bad.png', + width: 24.w, + height: 24.w, + fit: BoxFit.contain, + ), + ), + ), + ); + } - // 이벤트가 있으면 아이콘 표시 (최대 9개 등 제한 가능) return Positioned( top: 32.h, left: 0, @@ -332,28 +441,25 @@ class _DailyCareScreenState extends State { opacity: opacity, child: Center( child: Container( - width: - 40.w, // Exact width: 12*3 + 2*2 = 40. Centers perfectly. + width: 40.w, child: Wrap( - alignment: WrapAlignment.start, // Left aligned - spacing: 2.w, // Horizontal spacing - runSpacing: 2.h, // Vertical spacing - children: events.take(9).map((event) { + alignment: WrapAlignment.start, + spacing: 2.w, + runSpacing: 2.h, + children: events.take(9).map((schedule) { String iconPath = 'assets/icons/general_schedule_icon.svg'; - switch (event) { - case 'flower': - iconPath = 'assets/icons/flower_icon.svg'; - break; - case 'incomplete': - iconPath = 'assets/icons/incomplete_icon.svg'; - break; - case 'important': + + // 상태/타입에 따른 아이콘 결정 + if (schedule.isCompleted) { + iconPath = 'assets/icons/flower_icon.svg'; + } else { + if (schedule.type == 'important') { iconPath = 'assets/icons/important_schedule_icon.svg'; - break; - case 'general': - iconPath = 'assets/icons/general_schedule_icon.svg'; - break; + } else { + // 일반 일정 미완료 + iconPath = 'assets/icons/incomplete_icon.svg'; + } } return SvgPicture.asset( @@ -368,16 +474,12 @@ class _DailyCareScreenState extends State { ), ); }, - // 요일 헤더 커스텀 dowBuilder: (context, day) { final text = DateFormat.E('ko_KR').format(day); - // 요일 헤더는 '현재 달' 개념이 모호하므로(항상 보임) 기본 색상 사용 Color color = const Color(0xFF939393); - if (day.weekday == DateTime.sunday) - color = const Color(0xFFFF3F3F); // 일요일 #FF3F3F로 복귀 + if (day.weekday == DateTime.sunday) color = const Color(0xFFFF3F3F); return Container( - // Removed bottom border to avoid double border with first row's top border padding: EdgeInsets.only(bottom: 10.h), alignment: Alignment.bottomCenter, child: Text( @@ -391,113 +493,59 @@ class _DailyCareScreenState extends State { ), ); }, - // 외부 날짜 (지난달/다음달) 커스텀 outsideBuilder: (context, day, focusedDay) { - // 기본 색상에서 투명도 50% 적용 - Color color = const Color(0xFF1F1F1F).withOpacity(0.5); // 평일 50% + Color color = const Color(0xFF1F1F1F).withOpacity(0.5); if (day.weekday == DateTime.sunday) { - color = const Color(0xFFFF3F3F).withOpacity(0.5); // 일요일 50% + color = const Color(0xFFFF3F3F).withOpacity(0.5); } - - return Container( - decoration: const BoxDecoration( - border: Border( - top: BorderSide( - color: Color(0xFFE0E0E0), - width: 1, - ), // Changed to top - ), - ), - padding: EdgeInsets.only(top: 8.h), - alignment: Alignment.topCenter, - child: Text( - day.day.toString().padLeft(2, '0'), - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 15.sp, - fontWeight: FontWeight.w500, - color: color, - ), - ), - ); + return _buildDayCell(day, color); }, - // 날짜 셀 커스텀 defaultBuilder: (context, day, focusedDay) { - // 현재 달 날짜 색상 Color color = const Color(0xFF1F1F1F); if (day.weekday == DateTime.sunday) { color = const Color(0xFFFF3F3F); } - - return Container( - decoration: const BoxDecoration( - border: Border( - top: BorderSide( - color: Color(0xFFE0E0E0), - width: 1, - ), // Changed to top - ), - ), - padding: EdgeInsets.only(top: 8.h), // Move closer to top line - alignment: Alignment.topCenter, // Align to top - child: Text( - day.day.toString().padLeft(2, '0'), - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 15.sp, - fontWeight: FontWeight.w500, - color: color, - ), - ), - ); + return _buildDayCell(day, color); }, - // 오늘/선택 날짜 커스텀 prioritizedBuilder: (context, day, focusedDay) { final isToday = isSameDay(day, DateTime.now()); final isSelected = isSameDay(day, _selectedDay); - // 우선순위가 없는 날짜는 null을 반환하여 default/outsideBuilder가 실행되도록 함 if (!isToday && !isSelected) return null; final isSunday = day.weekday == DateTime.sunday; - - // 텍스트 색상 결정 - Color textColor = const Color(0xFF1F1F1F); // 기본 검정 + Color textColor = const Color(0xFF1F1F1F); if (isToday) { - textColor = const Color(0xFFFF9500); // 오늘: #FF9500 (유지) + textColor = const Color(0xFFFF9500); } else if (isSunday) { - textColor = const Color(0xFFFF3F3F); // 일요일: #FF3F3F + textColor = const Color(0xFFFF3F3F); } - // 배경 색상/데코레이션 결정 (선택된 경우) BoxDecoration? innerDecoration; if (isSelected) { innerDecoration = BoxDecoration( - color: const Color(0xFFFFEDBC), // 선택 배경: #FFEDBC - borderRadius: BorderRadius.circular(6.r), // 모서리 덜 둥글게 (6) + color: const Color(0xFFFFEDBC), + borderRadius: BorderRadius.circular(6.r), ); } return Container( - // 바깥 컨테이너: 행 구분선 담당 decoration: const BoxDecoration( border: Border( top: BorderSide(color: Color(0xFFE0E0E0), width: 1), ), ), child: Container( - // 내부 컨테이너: 선택 배경 담당 (가로 여백 제거로 넓게) margin: EdgeInsets.symmetric(vertical: 2.h), decoration: innerDecoration, - alignment: Alignment.topCenter, // 상단 정렬 - padding: EdgeInsets.only(top: 6.h), // 텍스트 위 여백 + alignment: Alignment.topCenter, + padding: EdgeInsets.only(top: 6.h), child: Text( day.day.toString().padLeft(2, '0'), style: TextStyle( fontFamily: 'SCDream', fontSize: 15.sp, - fontWeight: FontWeight.bold, // 오늘/선택은 강조 - decoration: isSelected ? null : null, + fontWeight: FontWeight.bold, color: textColor, ), ), @@ -508,9 +556,30 @@ class _DailyCareScreenState extends State { ); } + Widget _buildDayCell(DateTime day, Color textColor) { + return Container( + decoration: const BoxDecoration( + border: Border(top: BorderSide(color: Color(0xFFE0E0E0), width: 1)), + ), + padding: EdgeInsets.only(top: 8.h), + alignment: Alignment.topCenter, + child: Text( + day.day.toString().padLeft(2, '0'), + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 15.sp, + fontWeight: FontWeight.w500, + color: textColor, + ), + ), + ); + } + Widget _buildBottomSheet() { + // 임시로 비워둠 (실제 리스트 구현 시 채울 예정) + // 현재는 일정 추가만 구현 return DraggableScrollableSheet( - controller: _sheetController, // 컨트롤러 연결 + controller: _sheetController, initialChildSize: 0.08, minChildSize: 0.08, maxChildSize: 0.8, @@ -522,9 +591,9 @@ class _DailyCareScreenState extends State { borderRadius: BorderRadius.vertical(top: Radius.circular(24.r)), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), // Lighter shadow - blurRadius: 5, // Tighter blur - offset: const Offset(0, -3), // Closer offset + color: Colors.black.withOpacity(0.05), + blurRadius: 5, + offset: const Offset(0, -3), ), ], ), @@ -534,10 +603,8 @@ class _DailyCareScreenState extends State { padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h), child: Column( children: [ - // 헤더 (터치 영역) GestureDetector( onTap: () { - // 현재 높이에 따라 토글 if (_sheetController.size > 0.4) { _sheetController.animateTo( 0.08, @@ -553,31 +620,14 @@ class _DailyCareScreenState extends State { } }, child: Container( - color: Colors.transparent, // 터치 영역 확장 + color: Colors.transparent, width: double.infinity, child: Column( children: [ - AnimatedBuilder( - animation: _sheetController, - builder: (context, child) { - // 0.08 ~ 0.8 사이 값에서 회전 각도 계산 - // 0.4 이상이면 완전히 회전하도록 설정하거나, 비례해서 회전 - // 간단하게 0.4 기준으로 상태 판단 - final double angle = - _sheetController.isAttached && - _sheetController.size > 0.4 - ? 3.14159 - : 0.0; - - return Transform.rotate( - angle: angle, - child: Icon( - Icons.keyboard_arrow_up_rounded, - color: Colors.grey[400], - size: 24.w, - ), - ); - }, + Icon( + Icons.keyboard_arrow_up_rounded, + color: Colors.grey[400], + size: 24.w, ), SizedBox(height: 20.h), ], @@ -587,7 +637,7 @@ class _DailyCareScreenState extends State { Align( alignment: Alignment.centerLeft, child: Text( - '중요 일정 1', + '일정 리스트 준비 중...', // TODO: Implement list style: TextStyle( fontFamily: 'SCDream', fontSize: 14.sp, @@ -595,7 +645,7 @@ class _DailyCareScreenState extends State { ), ), ), - SizedBox(height: 50.h), // 스크롤 테스트용 여백 + SizedBox(height: 50.h), ], ), ), diff --git a/app/lib/screens/home_screen.dart b/app/lib/screens/home_screen.dart index 0ced3fc..19099de 100644 --- a/app/lib/screens/home_screen.dart +++ b/app/lib/screens/home_screen.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:provider/provider.dart'; import 'pet_form_screen.dart'; -import '../services/api_service.dart'; -import '../services/auth_service.dart'; import '../models/pet_model.dart'; import '../theme/app_colors.dart'; import '../widgets/home/pet_profile_card.dart'; +import '../widgets/common/pet_selection_header.dart'; +import '../providers/pet_provider.dart'; class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @@ -16,124 +17,68 @@ class HomeScreen extends StatefulWidget { } class _HomeScreenState extends State { - final ApiService _apiService = ApiService(); - final AuthService _authService = AuthService(); - int? _userId; - Pet? _selectedPet; - Future>? _petsFuture; - @override void initState() { super.initState(); - _loadUserAndPets(); - } - - Future _loadUserAndPets() async { - final userInfo = await _authService.getUserInfo(); - if (userInfo != null) { - setState(() { - _userId = userInfo['id'] is int - ? userInfo['id'] - : int.tryParse(userInfo['id'].toString()); - _petsFuture = _fetchPets(); - }); - } - } - - Future> _fetchPets() async { - if (_userId == null) return []; - try { - final petsData = await _apiService.getPets(_userId!); - return petsData.map((e) => Pet.fromMap(e)).toList(); - } catch (e) { - debugPrint('Error loading pets: $e'); - return []; - } - } - - void _refreshPets() { - if (_userId != null) { - setState(() { - _petsFuture = _fetchPets(); - }); - } + WidgetsBinding.instance.addPostFrameCallback((_) { + final provider = context.read(); + if (provider.userId == null) { + provider.loadUserAndPets(); + } + }); } @override Widget build(BuildContext context) { - if (_userId == null) { + final petProvider = context.watch(); + final pets = petProvider.pets; + final displayPet = petProvider.selectedPet; + final isLoading = petProvider.isLoading; + + if (isLoading) { + return const Scaffold( + backgroundColor: Colors.white, + body: Center(child: CircularProgressIndicator()), + ); + } + + // Check login + if (petProvider.userId == null && !isLoading) { return const Scaffold(body: Center(child: Text('로그인이 필요합니다.'))); } return Scaffold( backgroundColor: Colors.white, body: SafeArea( - child: FutureBuilder>( - future: _petsFuture, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } - - if (snapshot.hasError) { - return Center(child: Text('오류가 발생했습니다: ${snapshot.error}')); - } - - final pets = snapshot.data ?? []; - - // 등록된 반려동물이 없을 때: 기존 UI 유지 (등록 버튼 강조) + child: Builder( + builder: (context) { if (pets.isEmpty) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.symmetric( - horizontal: 20.w, - vertical: 20.h, + padding: EdgeInsets.only( + left: 20.w, + right: 20.w, + top: 6.h, + bottom: 20.h, ), - child: Material( - color: Colors.transparent, - child: InkWell( - borderRadius: BorderRadius.circular(8.r), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const PetFormScreen(), - ), - ).then((value) { - if (value == true) _refreshPets(); - }); - }, - child: Padding( - padding: EdgeInsets.only( - top: 4.h, - bottom: 4.h, - right: 12.w, - ), // Added right padding - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset( - 'assets/img/profile.png', - width: 40.w, - height: 40.h, - ), - SizedBox(width: 6.w), // Reduced spacing - Text( - '반려동물 등록 +', - style: TextStyle( - fontFamily: 'SCDream', - fontWeight: FontWeight.w500, - fontSize: 15.sp, - letterSpacing: 0.45.sp, - color: const Color(0xFF1f1f1f), - ), - ), - ], + child: PetSelectionHeader( + pets: [], + selectedPet: null, + onPetSelected: (_) {}, + onAddPetPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const PetFormScreen(), ), - ), - ), + ).then((value) { + if (value == true) { + context.read().refreshPets(); + } + }); + }, ), ), Expanded( @@ -154,172 +99,37 @@ class _HomeScreenState extends State { } // 등록된 반려동물이 있을 때 - // 선택된 펫이 없거나 리스트에 없으면 첫 번째 펫 선택 - // 등록된 반려동물이 있을 때 - Pet displayPet; - - // 선택된 펫이 없거나 리스트에 없으면 첫 번째 펫 선택 (State 변경 없이 화면 표시만 처리) - if (_selectedPet != null && - pets.any((p) => p.id == _selectedPet!.id)) { - displayPet = pets.firstWhere((p) => p.id == _selectedPet!.id); - } else { - displayPet = pets.first; - } + // displayPet derived from provider (already defined above) + final currentPet = displayPet ?? pets.first; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.symmetric( - horizontal: 20.w, - vertical: 20.h, + padding: EdgeInsets.only( + left: 10.w, + right: 20.w, + top: 6.h, + bottom: 0, ), - child: PopupMenuButton( - offset: Offset(0, 50.h), // 헤더 바로 아래에 위치하도록 조정 - elevation: 3, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.r), - ), - color: Colors.white, - surfaceTintColor: Colors.white, - onSelected: (value) { - if (value is Pet) { - setState(() { - _selectedPet = value; - }); - } else if (value == 'add_pet') { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const PetFormScreen(), - ), - ).then((value) { - if (value == true) _refreshPets(); - }); - } + child: PetSelectionHeader( + pets: pets, + selectedPet: displayPet, // displayPet comes from provider + onPetSelected: (value) { + context.read().selectPet(value); }, - itemBuilder: (context) { - return [ - ...pets.map( - (pet) => PopupMenuItem( - value: pet, - child: Row( - children: [ - CircleAvatar( - radius: 16.r, - backgroundColor: Colors.grey[200], - backgroundImage: pet.profileImageUrl != null - ? NetworkImage(pet.profileImageUrl!) - : null, - child: pet.profileImageUrl == null - ? SvgPicture.asset( - 'assets/icons/profile_icon.svg', - width: 16.w, - colorFilter: ColorFilter.mode( - Colors.grey[400]!, - BlendMode.srcIn, - ), - ) - : null, - ), - SizedBox(width: 10.w), - Text( - pet.name, - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 14.sp, - fontWeight: pet.id == displayPet.id - ? FontWeight.bold - : FontWeight.normal, - color: pet.id == displayPet.id - ? AppColors.highlight - : Colors.black, - ), - ), - if (pet.id == displayPet.id) ...[ - const Spacer(), - const Icon( - Icons.check, - color: AppColors.highlight, - size: 16, - ), - ], - ], - ), - ), + onAddPetPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const PetFormScreen(), ), - const PopupMenuDivider(), - PopupMenuItem( - value: 'add_pet', - child: Row( - children: [ - Container( - padding: EdgeInsets.all(4.w), - decoration: BoxDecoration( - color: Colors.grey[100], - shape: BoxShape.circle, - ), - child: Icon( - Icons.add, - size: 16.w, - color: Colors.black54, - ), - ), - SizedBox(width: 10.w), - Text( - '반려동물 추가하기', - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - ), - ]; + ).then((value) { + if (value == true) { + context.read().refreshPets(); + } + }); }, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - // 프로필 이미지 - CircleAvatar( - radius: 20.r, - backgroundColor: Colors.grey[200], - backgroundImage: displayPet.profileImageUrl != null - ? NetworkImage(displayPet.profileImageUrl!) - : null, - child: displayPet.profileImageUrl == null - ? SvgPicture.asset( - 'assets/icons/profile_icon.svg', - width: 20.w, - colorFilter: ColorFilter.mode( - Colors.grey[400]!, - BlendMode.srcIn, - ), - ) - : null, - ), - SizedBox(width: 10.w), - // 이름 - Text( - displayPet.name, - style: TextStyle( - fontFamily: 'SCDream', - fontWeight: FontWeight.bold, - fontSize: 18.sp, - color: Colors.black, - ), - ), - SizedBox(width: 4.w), - // 드롭다운 화살표 - Icon( - Icons.keyboard_arrow_down, - size: 24.w, - color: Colors.black, - ), - ], - ), ), ), Expanded( @@ -327,8 +137,10 @@ class _HomeScreenState extends State { child: Column( children: [ PetProfileCard( - pet: displayPet, - onPetUpdated: _refreshPets, + pet: currentPet, // Use safe currentPet + onPetUpdated: () { + context.read().refreshPets(); + }, ), ], ), diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index d6a8d55..bc6e37a 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; // Import screenutil import 'main_screen.dart'; +import '../widgets/common/custom_app_bar.dart'; class IdentityVerificationScreen extends StatelessWidget { const IdentityVerificationScreen({super.key}); @@ -9,24 +10,7 @@ class IdentityVerificationScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - appBar: AppBar( - backgroundColor: Colors.white, - elevation: 0, - leading: IconButton( - icon: Icon(Icons.arrow_back_ios, color: Colors.black, size: 20.w), - onPressed: () => Navigator.pop(context), - ), - title: Text( - '본인 인증', - style: TextStyle( - fontSize: 15.sp, - fontFamily: 'SCDream', - fontWeight: FontWeight.w500, - color: Colors.black, - ), - ), - centerTitle: true, - ), + appBar: const CustomAppBar(title: '본인 인증'), body: Padding( padding: EdgeInsets.all(20.0.w), child: Column( diff --git a/app/lib/screens/login_screen.dart b/app/lib/screens/login_screen.dart index 65f7b1a..c3d739e 100644 --- a/app/lib/screens/login_screen.dart +++ b/app/lib/screens/login_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; // Import screenuti import '../services/auth_service.dart'; import 'main_screen.dart'; import 'terms_agreement_screen.dart'; // Import TermsAgreementScreen +import '../widgets/common/custom_app_bar.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @@ -68,28 +69,7 @@ class _LoginScreenState extends State { children: [ Scaffold( backgroundColor: Colors.white, - appBar: AppBar( - backgroundColor: Colors.white, - elevation: 0, - leading: IconButton( - icon: Icon( - Icons.arrow_back_ios, - color: Colors.black, - size: 16.w, // Responsive size - ), - onPressed: () => Navigator.pop(context), - ), - title: Text( - '간편 로그인', - style: TextStyle( - fontSize: 15.sp, // Responsive font size - fontFamily: 'SCDream', - fontWeight: FontWeight.w500, - color: Colors.black, - ), - ), - centerTitle: true, - ), + appBar: const CustomAppBar(title: '간편 로그인'), body: Padding( padding: EdgeInsets.fromLTRB( 20.w, diff --git a/app/lib/screens/main_screen.dart b/app/lib/screens/main_screen.dart index a862b64..4a7c62b 100644 --- a/app/lib/screens/main_screen.dart +++ b/app/lib/screens/main_screen.dart @@ -6,8 +6,6 @@ import 'daily_care_screen.dart'; import 'mungnyangz_screen.dart'; import 'my_info_screen.dart'; -import '../theme/app_colors.dart'; - class MainScreen extends StatefulWidget { const MainScreen({super.key}); @@ -22,7 +20,7 @@ class _MainScreenState extends State { final List _screens = [ const HomeScreen(), const DailyCareScreen(), - const MungNyangzScreen(), // 멍냥즈 (샵 대신) + const MungNyangzScreen(), const MyInfoScreen(), ]; @@ -39,9 +37,7 @@ class _MainScreenState extends State { width: 24.w, height: 24.h, colorFilter: ColorFilter.mode( - _selectedIndex == index - ? AppColors.highlight - : AppColors.inactive, // 선택됨: 강조색, 안됨: 비활성화색 + _selectedIndex == index ? Colors.black : Colors.grey, BlendMode.srcIn, ), ); @@ -64,59 +60,51 @@ class _MainScreenState extends State { ), child: BottomNavigationBar( backgroundColor: Colors.white, - elevation: 0, // Remove default shadow since we have a border + elevation: 0, currentIndex: _selectedIndex, onTap: _onItemTapped, type: BottomNavigationBarType.fixed, - selectedItemColor: AppColors.highlight, - unselectedItemColor: AppColors.inactive, + selectedItemColor: Colors.black, + unselectedItemColor: Colors.grey, selectedLabelStyle: TextStyle( fontFamily: 'SCDream', - fontSize: 12.sp, - fontWeight: FontWeight.w500, // Medium + fontSize: 14.sp, + fontWeight: FontWeight.bold, + color: Colors.black, ), unselectedLabelStyle: TextStyle( fontFamily: 'SCDream', - fontSize: 12.sp, - fontWeight: FontWeight.w400, // Regular + fontSize: 14.sp, + fontWeight: FontWeight.w500, + color: Colors.grey, ), showUnselectedLabels: true, items: [ BottomNavigationBarItem( icon: Padding( - padding: EdgeInsets.only(bottom: 10.h), + padding: EdgeInsets.only(bottom: 8.h), child: _buildSvgIcon('assets/icons/home_icon.svg', 0), ), label: '홈', ), BottomNavigationBarItem( icon: Padding( - padding: EdgeInsets.only(bottom: 10.h), + padding: EdgeInsets.only(bottom: 8.h), child: _buildSvgIcon('assets/icons/calendar_icon.svg', 1), ), label: '데일리케어', ), BottomNavigationBarItem( icon: Padding( - padding: EdgeInsets.only(bottom: 10.h), - child: Image.asset( - _selectedIndex == 2 - ? 'assets/img/catdog_on.png' - : 'assets/img/catdog_off.png', - width: 29.w, - height: 26.h, - fit: BoxFit.cover, - ), + padding: EdgeInsets.only(bottom: 8.h), + child: _buildSvgIcon('assets/icons/card_icon.svg', 2), ), - label: '멍냥즈', + label: '펫 명함함', ), BottomNavigationBarItem( icon: Padding( - padding: EdgeInsets.only(bottom: 10.h), - child: _buildSvgIcon( - 'assets/icons/my_icon.svg', - 3, - ), // Index adjusted + padding: EdgeInsets.only(bottom: 8.h), + child: _buildSvgIcon('assets/icons/my_icon.svg', 3), ), label: '내 정보', ), diff --git a/app/lib/screens/my_info_screen.dart b/app/lib/screens/my_info_screen.dart index dd53ce9..085adff 100644 --- a/app/lib/screens/my_info_screen.dart +++ b/app/lib/screens/my_info_screen.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../services/auth_service.dart'; +import '../providers/pet_provider.dart'; import 'welcome_screen.dart'; import 'notice_screen.dart'; import '../data/terms_data.dart'; @@ -46,6 +48,10 @@ class _MyInfoScreenState extends State { } Future _handleLogout() async { + // Clear Provider State before logging out (to prevent data leak) + if (mounted) { + context.read().clearState(); + } await _authService.signOut(); if (mounted) { Navigator.of(context).pushAndRemoveUntil( @@ -76,6 +82,9 @@ class _MyInfoScreenState extends State { if (confirm == true) { if (!mounted) return; + // Clear Provider State before withdrawal + context.read().clearState(); + final success = await _authService.withdrawAccount(); if (success && mounted) { Navigator.of(context).pushAndRemoveUntil( diff --git a/app/lib/screens/pet_form_screen.dart b/app/lib/screens/pet_form_screen.dart index 0ed1604..6a4a743 100644 --- a/app/lib/screens/pet_form_screen.dart +++ b/app/lib/screens/pet_form_screen.dart @@ -11,6 +11,7 @@ import '../models/pet_model.dart'; import '../services/api_service.dart'; import '../services/auth_service.dart'; import '../widgets/pet_registration/input_formatters.dart'; +import '../widgets/common/custom_app_bar.dart'; class PetFormScreen extends StatefulWidget { final Pet? petToEdit; @@ -387,25 +388,20 @@ class _PetFormScreenState extends State { ); } - List finalDiseases = List.from(_selectedDiseases); - if (finalDiseases.contains('기타') && _otherDiseaseText.isNotEmpty) { - finalDiseases.remove('기타'); - finalDiseases.add('기타($_otherDiseaseText)'); - } + List finalDiseases = _processSelectionForSubmit( + _selectedDiseases, + _otherDiseaseText, + ); - List finalPastDiseases = List.from(_selectedPastDiseases); - if (finalPastDiseases.contains('기타') && - _otherPastDiseaseText.isNotEmpty) { - finalPastDiseases.remove('기타'); - finalPastDiseases.add('기타($_otherPastDiseaseText)'); - } + List finalPastDiseases = _processSelectionForSubmit( + _selectedPastDiseases, + _otherPastDiseaseText, + ); - List finalHealthConcerns = List.from(_selectedHealthConcerns); - if (finalHealthConcerns.contains('기타') && - _otherHealthConcernText.isNotEmpty) { - finalHealthConcerns.remove('기타'); - finalHealthConcerns.add('기타($_otherHealthConcernText)'); - } + List finalHealthConcerns = _processSelectionForSubmit( + _selectedHealthConcerns, + _otherHealthConcernText, + ); // 수정 모드 if (widget.petToEdit != null) { @@ -823,72 +819,24 @@ class _PetFormScreenState extends State { child: showInput ? Padding( padding: EdgeInsets.all(20.w), - child: Column( - children: [ - Text( - '반려동물의 종을 직접 입력해주세요.', - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 16.sp, - color: Colors.black87, - ), - ), - SizedBox(height: 20.h), - TextField( - controller: speciesInputController, - autofocus: true, - decoration: const InputDecoration( - hintText: '예: 미어캣, 라쿤 등', - border: OutlineInputBorder(), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: AppColors.highlight, - ), - ), - ), - ), - const Spacer(), - SizedBox( - width: double.infinity, - height: 52.h, - child: ElevatedButton( - onPressed: () { - if (speciesInputController - .text - .isNotEmpty) { - setState(() { - _speciesController.text = - speciesInputController.text; - // 직접 입력 시 카테고리 정보 초기화 (품종 선택 불가 또는 직접 입력) - _currentMajorCategory = null; - _currentMinorCategory = null; - _breedController.clear(); - }); - Navigator.pop(context); - } - }, - style: ElevatedButton.styleFrom( - backgroundColor: AppColors.highlight, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - 12.r, - ), - ), - ), - child: Text( - '완료', - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 16.sp, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ), - ), - SizedBox(height: bottomInset), - ], + child: _buildDirectInputContent( + title: '반려동물의 종을 직접 입력해주세요.', + hintText: '예: 미어캣, 라쿤 등', + controller: speciesInputController, + bottomInset: bottomInset, + onComplete: () { + if (speciesInputController.text.isNotEmpty) { + setState(() { + _speciesController.text = + speciesInputController.text; + // 직접 입력 시 카테고리 정보 초기화 + _currentMajorCategory = null; + _currentMinorCategory = null; + _breedController.clear(); + }); + Navigator.pop(context); + } + }, ), ) : (selectedMajor == null @@ -1116,68 +1064,20 @@ class _PetFormScreenState extends State { child: showInput ? Padding( padding: EdgeInsets.all(20.w), - child: Column( - children: [ - Text( - '반려동물의 품종을 직접 입력해주세요.', - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 16.sp, - color: Colors.black87, - ), - ), - SizedBox(height: 20.h), - TextField( - controller: manualInputController, - autofocus: true, - decoration: const InputDecoration( - hintText: '예: 믹스, 시고르자브종 등', - border: OutlineInputBorder(), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: AppColors.highlight, - ), - ), - ), - ), - const Spacer(), - SizedBox( - width: double.infinity, - height: 52.h, - child: ElevatedButton( - onPressed: () { - if (manualInputController - .text - .isNotEmpty) { - setState(() { - _breedController.text = - manualInputController.text; - }); - Navigator.pop(context); - } - }, - style: ElevatedButton.styleFrom( - backgroundColor: AppColors.highlight, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - 12.r, - ), - ), - ), - child: Text( - '완료', - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 16.sp, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ), - ), - SizedBox(height: bottomInset), - ], + child: _buildDirectInputContent( + title: '반려동물의 품종을 직접 입력해주세요.', + hintText: '예: 믹스, 시고르자브종 등', + controller: manualInputController, + bottomInset: bottomInset, + onComplete: () { + if (manualInputController.text.isNotEmpty) { + setState(() { + _breedController.text = + manualInputController.text; + }); + Navigator.pop(context); + } + }, ), ) : Column( @@ -1311,32 +1211,13 @@ class _PetFormScreenState extends State { ], ), SizedBox(height: 20.h), - Text( - '반려동물의 품종을 직접 입력해주세요.', - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 16.sp, - color: Colors.black87, - ), - ), - SizedBox(height: 20.h), - TextField( - controller: manualInputController, - autofocus: true, - decoration: const InputDecoration( + Expanded( + child: _buildDirectInputContent( + title: '반려동물의 품종을 직접 입력해주세요.', hintText: '예: 믹스, 시고르자브종 등', - border: OutlineInputBorder(), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: AppColors.highlight), - ), - ), - ), - const Spacer(), - SizedBox( - width: double.infinity, - height: 52.h, - child: ElevatedButton( - onPressed: () { + controller: manualInputController, + bottomInset: MediaQuery.of(context).viewInsets.bottom, + onComplete: () { if (manualInputController.text.isNotEmpty) { setState(() { _breedController.text = manualInputController.text; @@ -1344,25 +1225,8 @@ class _PetFormScreenState extends State { Navigator.pop(context); } }, - style: ElevatedButton.styleFrom( - backgroundColor: AppColors.highlight, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.r), - ), - ), - child: Text( - '완료', - style: TextStyle( - fontFamily: 'SCDream', - fontSize: 16.sp, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), ), ), - SizedBox(height: MediaQuery.of(context).viewInsets.bottom), ], ), ), @@ -1595,25 +1459,7 @@ class _PetFormScreenState extends State { return Scaffold( backgroundColor: Colors.white, - appBar: AppBar( - title: Text( - isEditMode ? '반려동물 정보 수정' : '반려동물 등록', - style: TextStyle( - color: Color(0xFF1f1f1f), - fontFamily: 'SCDream', - fontWeight: FontWeight.w500, - fontSize: 15.sp, - ), - ), - centerTitle: true, - backgroundColor: Colors.white, - scrolledUnderElevation: 0, - elevation: 0, - leading: IconButton( - icon: Icon(Icons.arrow_back_ios, color: Colors.black, size: 16.w), - onPressed: () => Navigator.pop(context), - ), - ), + appBar: CustomAppBar(title: isEditMode ? '반려동물 정보 수정' : '반려동물 등록'), body: SingleChildScrollView( padding: EdgeInsets.all(20.w), child: Column( @@ -1878,15 +1724,10 @@ class _PetFormScreenState extends State { ); // Reusing logic // Helper logic copy - List displayList = selected - .where((e) => e != '기타') - .toList(); - if (selected.contains('기타') && otherText.isNotEmpty) { - displayList.add('기타($otherText)'); - } else if (selected.contains('기타')) { - displayList.add('기타'); - } - _diseaseController.text = displayList.join(', '); + _diseaseController.text = _generateDisplayString( + selected, + otherText, + ); }); }, ), @@ -1904,15 +1745,10 @@ class _PetFormScreenState extends State { setState(() { _selectedPastDiseases = selected; _otherPastDiseaseText = otherText; - List displayList = selected - .where((e) => e != '기타') - .toList(); - if (selected.contains('기타') && otherText.isNotEmpty) { - displayList.add('기타($otherText)'); - } else if (selected.contains('기타')) { - displayList.add('기타'); - } - _pastDiseaseController.text = displayList.join(', '); + _pastDiseaseController.text = _generateDisplayString( + selected, + otherText, + ); }); }, ), @@ -1930,15 +1766,10 @@ class _PetFormScreenState extends State { setState(() { _selectedHealthConcerns = selected; _otherHealthConcernText = otherText; - List displayList = selected - .where((e) => e != '기타') - .toList(); - if (selected.contains('기타') && otherText.isNotEmpty) { - displayList.add('기타($otherText)'); - } else if (selected.contains('기타')) { - displayList.add('기타'); - } - _healthConcernController.text = displayList.join(', '); + _healthConcernController.text = _generateDisplayString( + selected, + otherText, + ); }); }, ), @@ -2109,4 +1940,87 @@ class _PetFormScreenState extends State { ], ); } + + // Helper Widget: 직접 입력 UI (모달 내부 공통 사용) + Widget _buildDirectInputContent({ + required String title, + required String hintText, + required TextEditingController controller, + required VoidCallback onComplete, + required double bottomInset, + }) { + return Column( + children: [ + Text( + title, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 16.sp, + color: Colors.black87, + ), + ), + SizedBox(height: 20.h), + TextField( + controller: controller, + autofocus: true, + decoration: InputDecoration( + hintText: hintText, + border: const OutlineInputBorder(), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: AppColors.highlight), + ), + ), + ), + const Spacer(), + SizedBox( + width: double.infinity, + height: 52.h, + child: ElevatedButton( + onPressed: onComplete, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.highlight, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.r), + ), + ), + child: Text( + '완료', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 16.sp, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ), + SizedBox(height: bottomInset), + ], + ); + } + + // 복잡한 질병 목록 처리 로직 (제출용) + List _processSelectionForSubmit( + List selected, + String otherText, + ) { + List finalList = List.from(selected); + if (finalList.contains('기타') && otherText.isNotEmpty) { + finalList.remove('기타'); + finalList.add('기타($otherText)'); + } + return finalList; + } + + // 화면 표시용 텍스트 생성 Helper + String _generateDisplayString(List selected, String otherText) { + List displayList = selected.where((e) => e != '기타').toList(); + if (selected.contains('기타') && otherText.isNotEmpty) { + displayList.add('기타($otherText)'); + } else if (selected.contains('기타')) { + displayList.add('기타'); + } + return displayList.join(', '); + } } diff --git a/app/lib/screens/pet_registration_screen.dart b/app/lib/screens/pet_registration_screen.dart index fc4687d..3d47b10 100644 --- a/app/lib/screens/pet_registration_screen.dart +++ b/app/lib/screens/pet_registration_screen.dart @@ -10,6 +10,7 @@ import '../widgets/pet_registration/selection_modal.dart'; // Import SelectionMo import '../widgets/pet_registration/input_formatters.dart'; // Import InputFormatters import '../services/firestore_service.dart'; import '../models/pet_model.dart'; +import '../widgets/common/custom_app_bar.dart'; class PetRegistrationScreen extends StatefulWidget { const PetRegistrationScreen({super.key}); @@ -1387,25 +1388,7 @@ class _PetRegistrationScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - appBar: AppBar( - title: Text( - '반려동물 등록', - style: TextStyle( - color: Color(0xFF1f1f1f), - fontFamily: 'SCDream', - fontWeight: FontWeight.w500, - fontSize: 15.sp, - ), - ), - centerTitle: true, - backgroundColor: Colors.white, - scrolledUnderElevation: 0, - elevation: 0, - leading: IconButton( - icon: Icon(Icons.arrow_back_ios, color: Colors.black, size: 16.w), - onPressed: () => Navigator.pop(context), - ), - ), + appBar: const CustomAppBar(title: '반려동물 등록'), body: SingleChildScrollView( padding: EdgeInsets.all(20.w), child: Column( diff --git a/app/lib/screens/schedule_form_screen.dart b/app/lib/screens/schedule_form_screen.dart new file mode 100644 index 0000000..d022494 --- /dev/null +++ b/app/lib/screens/schedule_form_screen.dart @@ -0,0 +1,1040 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:provider/provider.dart'; + +import '../providers/pet_provider.dart'; +import '../services/api_service.dart'; +import '../theme/app_colors.dart'; + +import '../widgets/common/custom_app_bar.dart'; +import '../widgets/common/custom_time_picker.dart'; + +class ScheduleFormScreen extends StatefulWidget { + final DateTime selectedDate; + + const ScheduleFormScreen({super.key, required this.selectedDate}); + + @override + State createState() => _ScheduleFormScreenState(); +} + +class _ScheduleFormScreenState extends State { + final TextEditingController _titleController = TextEditingController(); + final TextEditingController _noteController = TextEditingController(); + + // 시간 설정 상태 + late TimeOfDay _startTime; + late TimeOfDay _endTime; + bool _isEndTimeManuallySet = false; // 사용자가 종료시간을 직접 수정했는지 여부 + String? _activePicker; // 'start', 'end', or null + + String _selectedType = 'general'; // 'general' or 'important' + bool _isSubstituting = false; // "저장 중" 상태 표시 + + // 반복 설정 상태 + bool _isRepeatExpanded = false; + final TextEditingController _repeatIntervalController = TextEditingController( + text: '1', + ); + String? _repeatUnit; // null, 'day', 'week', 'month', 'year' + // 알림 설정 상태 + bool _isAlarmExpanded = false; + String _selectedAlarmType = + 'none'; // 'none', 'start', '10min', '1hour', '1day', 'custom' + String _customAlarmUnit = 'min'; // 'min', 'hour', 'day', 'week' + final TextEditingController _customAlarmController = TextEditingController(); + + @override + void initState() { + super.initState(); + // 초기 시간 설정: 시작 08:00, 종료 09:00 + _startTime = const TimeOfDay(hour: 8, minute: 0); + _endTime = const TimeOfDay(hour: 9, minute: 0); + } + + @override + void dispose() { + _titleController.dispose(); + _noteController.dispose(); + _repeatIntervalController.dispose(); + _customAlarmController.dispose(); + super.dispose(); + } + + // 시작 시간 변경 핸들러 + void _onStartTimeChanged(TimeOfDay newTime) { + setState(() { + _startTime = newTime; + // 종료 시간을 수동으로 설정하지 않았다면, 자동으로 +1시간 + if (!_isEndTimeManuallySet) { + int endHour = newTime.hour + 1; + int endMinute = newTime.minute; + // 24시 넘어가면 0시로 (단순화) + if (endHour >= 24) { + endHour -= 24; + } + _endTime = TimeOfDay(hour: endHour, minute: endMinute); + } + }); + } + + // 종료 시간 변경 핸들러 + void _onEndTimeChanged(TimeOfDay newTime) { + setState(() { + _endTime = newTime; + _isEndTimeManuallySet = true; // 수동 설정됨 -> 자동 연동 해제 + }); + } + + String _formatTime(TimeOfDay time) { + final period = time.period == DayPeriod.am ? '오전' : '오후'; + final hour = time.hourOfPeriod == 0 ? 12 : time.hourOfPeriod; + final minute = time.minute.toString().padLeft(2, '0'); + return '$period $hour:$minute'; + } + + String _getRepeatText() { + if (_repeatUnit == null) return '반복 안 함'; + final interval = _repeatIntervalController.text; + String unitText = ''; + switch (_repeatUnit) { + case 'day': + unitText = '일'; + break; + case 'week': + unitText = '주'; + break; + case 'month': + unitText = '개월'; + break; + case 'year': + unitText = '년'; + break; + } + return '$interval$unitText마다'; + } + + Future _saveSchedule() async { + final title = _titleController.text.trim(); + if (title.isEmpty) return; + + final petProvider = context.read(); + final selectedPet = petProvider.selectedPet; + + if (selectedPet == null) { + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('반려동물을 먼저 선택해주세요.'))); + return; + } + + setState(() { + _isSubstituting = true; + }); + + try { + final apiService = ApiService(); + + // 시작/종료 시간 DateTime 생성 + final startDateTime = DateTime( + widget.selectedDate.year, + widget.selectedDate.month, + widget.selectedDate.day, + _startTime.hour, + _startTime.minute, + ); + + // 반복 정보 + int? repeatInterval; + if (_repeatUnit != null) { + repeatInterval = int.tryParse(_repeatIntervalController.text) ?? 1; + } + + // 알림 시간 계산 + DateTime? alarmTime; + bool isAlarmOn = _selectedAlarmType != 'none'; + if (isAlarmOn) { + switch (_selectedAlarmType) { + case 'start': + alarmTime = startDateTime; + break; + case '10min': + alarmTime = startDateTime.subtract(const Duration(minutes: 10)); + break; + case '1hour': + alarmTime = startDateTime.subtract(const Duration(hours: 1)); + break; + case '1day': + alarmTime = startDateTime.subtract(const Duration(days: 1)); + break; + case 'custom': + final value = int.tryParse(_customAlarmController.text) ?? 0; + if (value > 0) { + Duration duration; + switch (_customAlarmUnit) { + case 'min': + duration = Duration(minutes: value); + break; + case 'hour': + duration = Duration(hours: value); + break; + case 'day': + duration = Duration(days: value); + break; + case 'week': + duration = Duration(days: value * 7); + break; + default: + duration = Duration(minutes: value); + } + alarmTime = startDateTime.subtract(duration); + } else { + alarmTime = startDateTime; + } + break; + } + } + + final data = { + 'petId': selectedPet.id, + 'date': startDateTime.toIso8601String(), + 'type': _selectedType, + 'isCompleted': false, + 'title': title, + 'note': _noteController.text.trim().isEmpty + ? null + : _noteController.text.trim(), + 'repeatInterval': repeatInterval, + 'repeatUnit': _repeatUnit, + 'isAlarmOn': isAlarmOn, + 'alarmTime': alarmTime?.toIso8601String(), + }; + + await apiService.createSchedule(data); + + if (mounted) { + context + .read() + .refreshPets(); // Optional: Refresh if needed + Navigator.pop(context, true); // 성공 시 true 반환 + } + } catch (e) { + debugPrint('Error saving schedule: $e'); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('일정 저장 실패: $e'))); + } + } finally { + if (mounted) { + setState(() { + _isSubstituting = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: const CustomAppBar(title: '일정 추가'), + body: SafeArea( + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 20.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // 제목 입력 + TextField( + onTap: () { + setState(() { + _activePicker = null; + _isRepeatExpanded = false; + _isAlarmExpanded = false; + }); + }, + controller: _titleController, + decoration: InputDecoration( + labelText: '일정 제목', + floatingLabelStyle: const TextStyle( + color: AppColors.highlight, + ), + hintText: '예: 산책하기, 병원 방문', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + borderSide: BorderSide(color: Colors.grey[300]!), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + borderSide: const BorderSide( + color: AppColors.highlight, + ), + ), + filled: false, + ), + ), + SizedBox(height: 24.h), + + // 시작 시간 / 종료 시간 (좌우 배치) + Row( + children: [ + // 시작 시간 + Expanded( + child: _buildTimeField( + label: '시작', + type: 'start', + time: _startTime, + ), + ), + SizedBox(width: 12.w), + // 종료 시간 + Expanded( + child: _buildTimeField( + label: '종료', + type: 'end', + time: _endTime, + ), + ), + ], + ), + + // 피커 영역 (아코디언) + AnimatedSize( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + child: Container( + // 피커가 열렸을 때만 공간 차지 + height: _activePicker != null ? null : 0, + margin: _activePicker != null + ? EdgeInsets.symmetric(vertical: 10.h) + : EdgeInsets.zero, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(12.r), + border: Border.all(color: Colors.grey[200]!), + ), + child: _activePicker != null + ? CustomTimePicker( + initialTime: _activePicker == 'start' + ? _startTime + : _endTime, + onTimeChanged: (newTime) { + if (_activePicker == 'start') { + _onStartTimeChanged(newTime); + } else { + _onEndTimeChanged(newTime); + } + }, + ) + : const SizedBox.shrink(), + ), + ), + + SizedBox(height: _activePicker != null ? 0 : 24.h), + + // 중요도 선택 + Row( + children: [ + Expanded( + child: _buildTypeButton( + '일반', + 'general', + AppColors.subHighlight, + ), + ), + SizedBox(width: 12.w), + Expanded( + child: _buildTypeButton( + '중요', + 'important', + AppColors.highlight, + ), + ), + ], + ), + SizedBox(height: 16.h), + + // 반복 설정 + _buildRepeatSection(), + SizedBox(height: 16.h), + + // 알림 설정 + _buildAlarmSection(), + SizedBox(height: 16.h), + + // 메모 입력 + TextField( + onTap: () { + setState(() { + _activePicker = null; + _isRepeatExpanded = false; + _isAlarmExpanded = false; + }); + }, + controller: _noteController, + maxLines: 3, + decoration: InputDecoration( + labelText: '메모 (선택)', + floatingLabelStyle: const TextStyle( + color: AppColors.highlight, + ), + hintText: '추가적인 내용을 입력하세요', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + borderSide: BorderSide(color: Colors.grey[300]!), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + borderSide: const BorderSide( + color: AppColors.highlight, + ), + ), + filled: false, + ), + ), + SizedBox(height: 24.h), + ], + ), + ), + ), + ], + ), + ), + bottomNavigationBar: SafeArea( + child: Padding( + padding: EdgeInsets.all(20.w), + child: ElevatedButton( + onPressed: _isSubstituting ? null : _saveSchedule, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.highlight, + padding: EdgeInsets.symmetric(vertical: 16.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.r), + ), + elevation: 0, + ), + child: _isSubstituting + ? SizedBox( + width: 24.w, + height: 24.w, + child: const CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : Text( + '저장하기', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 16.sp, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ), + ), + ); + } + + String _getAlarmText() { + switch (_selectedAlarmType) { + case 'none': + return '사용 안함'; + case 'start': + return '일정 시작시간'; + case '10min': + return '10분 전'; + case '1hour': + return '1시간 전'; + case '1day': + return '1일 전'; + case 'custom': + final value = _customAlarmController.text; + if (value.isEmpty) return '직접 입력'; + String unitText = ''; + switch (_customAlarmUnit) { + case 'min': + unitText = '분 전'; + break; + case 'hour': + unitText = '시간 전'; + break; + case 'day': + unitText = '일 전'; + break; + case 'week': + unitText = '주 전'; + break; + } + return '$value$unitText'; + default: + return '사용 안함'; + } + } + + Widget _buildAlarmSection() { + final borderColor = _isAlarmExpanded + ? AppColors.highlight + : Colors.grey[300]!; + + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.r), + border: Border.all(color: borderColor, width: _isAlarmExpanded ? 2 : 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + InkWell( + onTap: () { + setState(() { + _isAlarmExpanded = !_isAlarmExpanded; + if (_isAlarmExpanded) { + _isRepeatExpanded = false; // 다른 섹션 닫기 + _activePicker = null; // 시간 설정 닫기 + } + }); + }, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(12.r), + topRight: Radius.circular(12.r), + bottomLeft: Radius.circular(_isAlarmExpanded ? 0 : 12.r), + bottomRight: Radius.circular(_isAlarmExpanded ? 0 : 12.r), + ), + child: Padding( + padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + Text( + '알림', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 12.sp, + color: Colors.grey[600], + ), + ), + SizedBox(width: 8.w), + Expanded( + child: Text( + _getAlarmText(), + textAlign: TextAlign.right, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + fontWeight: FontWeight.bold, + color: _selectedAlarmType != 'none' + ? AppColors.highlight + : Colors.black, + ), + ), + ), + SizedBox(width: 8.w), + Icon( + _isAlarmExpanded + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + color: Colors.grey[400], + size: 20.w, + ), + ], + ), + ), + ), + AnimatedSize( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + child: Container( + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: _isAlarmExpanded ? null : 0, + padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Row 1: 사용안함, 시작시간 (위치 변경됨) + Row( + children: [ + Expanded(child: _buildAlarmOptionButton('사용 안함', 'none')), + SizedBox(width: 8.w), + Expanded( + child: _buildAlarmOptionButton('일정 시작시간', 'start'), + ), + ], + ), + SizedBox(height: 8.h), + // Row 2: 10분, 1시간, 1일 + Row( + children: [ + Expanded( + child: _buildAlarmOptionButton('10분 전', '10min'), + ), + SizedBox(width: 8.w), + Expanded( + child: _buildAlarmOptionButton('1시간 전', '1hour'), + ), + SizedBox(width: 8.w), + Expanded(child: _buildAlarmOptionButton('1일 전', '1day')), + ], + ), + SizedBox(height: 8.h), + // Row 3: 직접입력 버튼 + 입력칸 + Row( + children: [ + Expanded( + child: _buildAlarmOptionButton('직접 입력', 'custom'), + ), + SizedBox(width: 8.w), + Expanded( + child: Container( + height: 34.h, // 버튼 높이와 비슷하게 조정 (48.h -> 34.h) + decoration: BoxDecoration( + border: Border.all(color: Colors.grey[300]!), + borderRadius: BorderRadius.circular(20.r), + color: _selectedAlarmType == 'custom' + ? Colors.white + : Colors.grey[100], + ), + alignment: Alignment.center, + child: TextField( + controller: _customAlarmController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + onTap: () { + setState(() { + _selectedAlarmType = 'custom'; + }); + }, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 16.sp, + fontWeight: _selectedAlarmType == 'custom' + ? FontWeight.bold + : FontWeight.normal, + color: _selectedAlarmType == 'custom' + ? Colors.black + : Colors.grey[400], + height: 1.0, + ), + decoration: InputDecoration( + border: InputBorder.none, + isCollapsed: true, + contentPadding: EdgeInsets.zero, + hintText: '0', + hintStyle: TextStyle( + color: Colors.grey[400], + fontSize: 16.sp, + ), + ), + ), + ), + ), + ], + ), + // Row 4: 단위 버튼 (custom일 때만 표시) + if (_selectedAlarmType == 'custom') ...[ + SizedBox(height: 12.h), + Row( + children: [ + Expanded(child: _buildCustomUnitButton('분 전', 'min')), + SizedBox(width: 8.w), + Expanded(child: _buildCustomUnitButton('시간 전', 'hour')), + SizedBox(width: 8.w), + Expanded(child: _buildCustomUnitButton('일 전', 'day')), + SizedBox(width: 8.w), + Expanded(child: _buildCustomUnitButton('주 전', 'week')), + ], + ), + ], + ], + ), + ), + ), + ], + ), + ); + } + + Widget _buildCustomUnitButton(String label, String unit) { + final isSelected = _customAlarmUnit == unit; + return InkWell( + onTap: () { + setState(() { + _customAlarmUnit = unit; + }); + }, + borderRadius: BorderRadius.circular(20.r), + child: Container( + width: double.infinity, + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 8.h), + decoration: BoxDecoration( + color: isSelected ? AppColors.highlight : Colors.grey[100], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + label, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 13.sp, + color: isSelected ? Colors.white : Colors.grey[600], + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + ), + ), + ), + ); + } + + Widget _buildAlarmOptionButton(String label, String value) { + final isSelected = _selectedAlarmType == value; + return InkWell( + onTap: () { + setState(() { + _selectedAlarmType = value; + if (value == 'custom') { + // Focus custom input? + } + }); + }, + borderRadius: BorderRadius.circular(20.r), + child: Container( + width: double.infinity, + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 8.h), + decoration: BoxDecoration( + color: isSelected ? AppColors.highlight : Colors.grey[100], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + label, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 13.sp, + color: isSelected ? Colors.white : Colors.grey[600], + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + ), + ), + ), + ); + } + + Widget _buildRepeatSection() { + final borderColor = _isRepeatExpanded + ? AppColors.highlight + : Colors.grey[300]!; + + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: borderColor, + width: _isRepeatExpanded ? 2 : 1, + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + InkWell( + onTap: () { + setState(() { + _isRepeatExpanded = !_isRepeatExpanded; + if (_isRepeatExpanded) { + _isAlarmExpanded = false; // 다른 섹션 닫기 + _activePicker = null; // 시간 설정 닫기 + } + }); + }, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(12.r), + topRight: Radius.circular(12.r), + bottomLeft: Radius.circular(_isRepeatExpanded ? 0 : 12.r), + bottomRight: Radius.circular(_isRepeatExpanded ? 0 : 12.r), + ), + child: Padding( + padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + Text( + '반복', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 12.sp, + color: Colors.grey[600], + ), + ), + SizedBox(width: 8.w), + Expanded( + child: Text( + _getRepeatText(), + textAlign: TextAlign.right, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + fontWeight: FontWeight.bold, + color: _repeatUnit != null + ? AppColors.highlight + : Colors.black, + ), + ), + ), + SizedBox(width: 8.w), + Icon( + _isRepeatExpanded + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + color: Colors.grey[400], + size: 20.w, + ), + ], + ), + ), + ), + AnimatedSize( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + child: Container( + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: _isRepeatExpanded ? null : 0, + padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 16.h), + child: Column( + children: [ + Row( + children: [ + Container( + width: 60.w, + height: 40.h, + margin: EdgeInsets.only(right: 12.w), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey[300]!), + borderRadius: BorderRadius.circular(8.r), + ), + alignment: Alignment.center, + child: TextField( + controller: _repeatIntervalController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 16.sp, + fontWeight: FontWeight.bold, + height: 1.0, + ), + decoration: const InputDecoration( + border: InputBorder.none, + isCollapsed: true, + contentPadding: EdgeInsets.zero, + ), + onChanged: (value) { + if (value == '0') { + _repeatIntervalController.text = '1'; + } + setState(() {}); + }, + ), + ), + // 단위 선택 버튼들 + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + _buildRepeatUnitButton('일', 'day'), + SizedBox(width: 8.w), + _buildRepeatUnitButton('주', 'week'), + SizedBox(width: 8.w), + _buildRepeatUnitButton('개월', 'month'), + SizedBox(width: 8.w), + _buildRepeatUnitButton('년', 'year'), + ], + ), + ), + ), + ], + ), + SizedBox(height: 12.h), + // 반복 안 함 버튼 (하단 배치) + InkWell( + onTap: () { + setState(() { + _repeatUnit = null; + }); + }, + borderRadius: BorderRadius.circular(8.r), + child: Container( + width: double.infinity, + padding: EdgeInsets.symmetric(vertical: 10.h), + decoration: BoxDecoration( + color: _repeatUnit == null + ? AppColors.highlight + : Colors.grey[100], + borderRadius: BorderRadius.circular(8.r), + ), + alignment: Alignment.center, + child: Text( + '반복 안 함', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + color: _repeatUnit == null + ? Colors.white + : Colors.grey[600], + fontWeight: _repeatUnit == null + ? FontWeight.bold + : FontWeight.normal, + ), + ), + ), + ), + ], + ), + ), + ), + ], + ), + ); + } + + Widget _buildRepeatUnitButton(String label, String? unit) { + final isSelected = _repeatUnit == unit; + return InkWell( + onTap: () { + setState(() { + _repeatUnit = unit; + }); + }, + borderRadius: BorderRadius.circular(20.r), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h), + decoration: BoxDecoration( + color: isSelected ? AppColors.highlight : Colors.grey[100], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + label, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + color: isSelected ? Colors.white : Colors.grey[600], + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + ), + ), + ), + ); + } + + Widget _buildTimeField({ + required String label, + required String type, + required TimeOfDay time, + }) { + final isActive = _activePicker == type; + final borderColor = isActive ? AppColors.highlight : Colors.grey[300]!; + final textColor = isActive ? AppColors.highlight : Colors.black; + + return GestureDetector( + onTap: () { + setState(() { + if (_activePicker == type) { + _activePicker = null; // 이미 열려있으면 닫기 + } else { + _activePicker = type; // 열기 + _isRepeatExpanded = false; // 다른 섹션 닫기 + _isAlarmExpanded = false; // 다른 섹션 닫기 + } + }); + }, + child: Container( + padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.r), + border: Border.all(color: borderColor, width: isActive ? 2 : 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 12.sp, + color: Colors.grey[600], + ), + ), + SizedBox(height: 4.h), + Text( + _formatTime(time), + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 18.sp, + fontWeight: FontWeight.bold, + color: textColor, + ), + ), + ], + ), + ), + ); + } + + Widget _buildTypeButton(String label, String value, Color color) { + final isSelected = _selectedType == value; + return InkWell( + onTap: () { + setState(() { + _selectedType = value; + _activePicker = null; + _isRepeatExpanded = false; + _isAlarmExpanded = false; + }); + }, + borderRadius: BorderRadius.circular(12.r), + child: Container( + padding: EdgeInsets.symmetric(vertical: 12.h), + decoration: BoxDecoration( + color: isSelected ? color.withOpacity(0.1) : Colors.transparent, + border: Border.all( + color: isSelected ? color : Colors.grey[300]!, + width: isSelected ? 2 : 1, + ), + borderRadius: BorderRadius.circular(12.r), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 12.w, + height: 12.w, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + ), + SizedBox(width: 8.w), + Text( + label, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + color: isSelected ? color : Colors.grey[600], + ), + ), + ], + ), + ), + ); + } +} diff --git a/app/lib/screens/terms_agreement_screen.dart b/app/lib/screens/terms_agreement_screen.dart index 46e1a23..dd2226b 100644 --- a/app/lib/screens/terms_agreement_screen.dart +++ b/app/lib/screens/terms_agreement_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; // Import screenuti import 'identity_verification_screen.dart'; import '../services/auth_service.dart'; // Import AuthService import '../data/terms_data.dart'; +import '../widgets/common/custom_app_bar.dart'; class TermsAgreementScreen extends StatefulWidget { final bool isViewOnly; @@ -139,24 +140,7 @@ class _TermsAgreementScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - appBar: AppBar( - backgroundColor: Colors.white, - elevation: 0, - leading: IconButton( - icon: Icon(Icons.arrow_back_ios, color: Colors.black, size: 20.w), - onPressed: () => Navigator.pop(context), - ), - title: Text( - widget.isViewOnly ? '이용 약관' : '회원가입', - style: TextStyle( - color: Colors.black, - fontSize: 16.sp, - fontWeight: FontWeight.w600, - fontFamily: 'SCDream', - ), - ), - centerTitle: true, - ), + appBar: CustomAppBar(title: widget.isViewOnly ? '이용 약관' : '회원가입'), body: SafeArea( child: Column( children: [ diff --git a/app/lib/services/api_service.dart b/app/lib/services/api_service.dart index 5db38ef..86f7bb9 100644 --- a/app/lib/services/api_service.dart +++ b/app/lib/services/api_service.dart @@ -46,28 +46,22 @@ class ApiService { List? healthConcerns, }) async { try { - final formData = FormData.fromMap({ - 'userId': userId, - 'name': name, - 'species': species, - 'breed': breed, - 'gender': gender, // "남아", "여아", "기타" - 'isNeutered': isNeutered, - 'birthDate': birthDate?.toIso8601String(), - 'isDateUnknown': isDateUnknown, - 'weight': weight, - 'registrationNumber': registrationNumber, - 'diseases': diseases != null ? jsonEncode(diseases) : '[]', - 'pastDiseases': pastDiseases != null ? jsonEncode(pastDiseases) : '[]', - 'healthConcerns': healthConcerns != null - ? jsonEncode(healthConcerns) - : '[]', - if (profileImage != null) - 'profileImage': await MultipartFile.fromFile( - profileImage.path, - filename: profileImage.path.split('/').last, - ), - }); + final formData = await _createPetFormData( + userId: userId, + name: name, + species: species, + breed: breed, + gender: gender, + isNeutered: isNeutered, + birthDate: birthDate, + isDateUnknown: isDateUnknown, + weight: weight, + registrationNumber: registrationNumber, + profileImage: profileImage, + diseases: diseases, + pastDiseases: pastDiseases, + healthConcerns: healthConcerns, + ); final response = await _dio.post('/pets', data: formData); return response.data; @@ -77,7 +71,6 @@ class ApiService { } } - // Update Pet Future> updatePet({ required int petId, required String name, @@ -95,27 +88,21 @@ class ApiService { List? healthConcerns, }) async { try { - final formData = FormData.fromMap({ - 'name': name, - 'species': species, - 'breed': breed, - 'gender': gender, - 'isNeutered': isNeutered, - 'birthDate': birthDate?.toIso8601String(), - 'isDateUnknown': isDateUnknown, - 'weight': weight, - 'registrationNumber': registrationNumber, - 'diseases': diseases != null ? jsonEncode(diseases) : '[]', - 'pastDiseases': pastDiseases != null ? jsonEncode(pastDiseases) : '[]', - 'healthConcerns': healthConcerns != null - ? jsonEncode(healthConcerns) - : '[]', - if (profileImage != null) - 'profileImage': await MultipartFile.fromFile( - profileImage.path, - filename: profileImage.path.split('/').last, - ), - }); + final formData = await _createPetFormData( + name: name, + species: species, + breed: breed, + gender: gender, + isNeutered: isNeutered, + birthDate: birthDate, + isDateUnknown: isDateUnknown, + weight: weight, + registrationNumber: registrationNumber, + profileImage: profileImage, + diseases: diseases, + pastDiseases: pastDiseases, + healthConcerns: healthConcerns, + ); final response = await _dio.put('/pets/$petId', data: formData); return response.data; @@ -125,6 +112,51 @@ class ApiService { } } + // Helper: Create FormData + Future _createPetFormData({ + required String name, + required String species, + required String breed, + required String gender, + required bool isNeutered, + DateTime? birthDate, + required bool isDateUnknown, + double? weight, + String? registrationNumber, + File? profileImage, + List? diseases, + List? pastDiseases, + List? healthConcerns, + int? userId, // Optional (only for register) + }) async { + final map = { + if (userId != null) 'userId': userId, + 'name': name, + 'species': species, + 'breed': breed, + 'gender': gender, + 'isNeutered': isNeutered, + 'birthDate': birthDate?.toIso8601String(), + 'isDateUnknown': isDateUnknown, + 'weight': weight, + 'registrationNumber': registrationNumber, + 'diseases': diseases != null ? jsonEncode(diseases) : '[]', + 'pastDiseases': pastDiseases != null ? jsonEncode(pastDiseases) : '[]', + 'healthConcerns': healthConcerns != null + ? jsonEncode(healthConcerns) + : '[]', + }; + + if (profileImage != null) { + map['profileImage'] = await MultipartFile.fromFile( + profileImage.path, + filename: profileImage.path.split('/').last, + ); + } + + return FormData.fromMap(map); + } + // Get Pets Future> getPets(int userId) async { try { @@ -138,4 +170,59 @@ class ApiService { rethrow; } } + + // --- Schedule APIs --- + + // Get Monthly Schedules + Future> getSchedules({ + required String petId, + required int year, + required int month, + }) async { + try { + final response = await _dio.get( + '/schedules', + queryParameters: {'petId': petId, 'year': year, 'month': month}, + ); + return response.data; + } catch (e) { + debugPrint('Error fetching schedules: $e'); + rethrow; + } + } + + // Create Schedule + Future> createSchedule(Map data) async { + try { + final response = await _dio.post('/schedules', data: data); + return response.data; + } catch (e) { + debugPrint('Error creating schedule: $e'); + rethrow; + } + } + + // Update Schedule + Future> updateSchedule( + String id, + Map data, + ) async { + try { + final response = await _dio.put('/schedules/$id', data: data); + return response.data; + } catch (e) { + debugPrint('Error updating schedule: $e'); + rethrow; + } + } + + // Delete Schedule + Future deleteSchedule(String id) async { + try { + await _dio.delete('/schedules/$id'); + } catch (e) { + debugPrint('Error deleting schedule: $e'); + rethrow; + } + } } diff --git a/app/lib/services/firestore_service.dart b/app/lib/services/firestore_service.dart index 883ae3b..a13e3f9 100644 --- a/app/lib/services/firestore_service.dart +++ b/app/lib/services/firestore_service.dart @@ -4,6 +4,7 @@ import 'package:firebase_storage/firebase_storage.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:uuid/uuid.dart'; import '../models/pet_model.dart'; +import '../models/schedule_model.dart'; import '../utils/log_manager.dart'; class FirestoreService { @@ -147,4 +148,79 @@ class FirestoreService { String generatePetId() { return const Uuid().v4(); } + + // 일정 추가 + Future addSchedule(Schedule schedule) async { + try { + await _db.collection('schedules').doc(schedule.id).set(schedule.toMap()); + } catch (e) { + LogManager().addLog('[Firestore] Error adding schedule: $e'); + throw Exception('일정 추가 실패: $e'); + } + } + + // 일정 조회 (특정 반려동물, 특정 날짜) + // 날짜는 년,월,일 만 비교를 위해 range query 사용 (startOfDay ~ endOfDay) + Stream> getSchedules(String petId, DateTime date) { + DateTime startOfDay = DateTime(date.year, date.month, date.day); + DateTime endOfDay = DateTime(date.year, date.month, date.day, 23, 59, 59); + + return _db + .collection('schedules') + .where('petId', isEqualTo: petId) + .where('date', isGreaterThanOrEqualTo: Timestamp.fromDate(startOfDay)) + .where('date', isLessThanOrEqualTo: Timestamp.fromDate(endOfDay)) + .snapshots() + .map((snapshot) { + return snapshot.docs + .map((doc) => Schedule.fromMap(doc.data())) + .toList(); + }); + } + + // 월간 일정 조회 (도장 모드용) - 해당 월의 모든 일정 가져오기 + Stream> getMonthlySchedules(String petId, DateTime month) { + DateTime startOfMonth = DateTime(month.year, month.month, 1); + DateTime endOfMonth = DateTime(month.year, month.month + 1, 0, 23, 59, 59); + + return _db + .collection('schedules') + .where('petId', isEqualTo: petId) + .where('date', isGreaterThanOrEqualTo: Timestamp.fromDate(startOfMonth)) + .where('date', isLessThanOrEqualTo: Timestamp.fromDate(endOfMonth)) + .snapshots() + .map((snapshot) { + return snapshot.docs + .map((doc) => Schedule.fromMap(doc.data())) + .toList(); + }); + } + + // 일정 수정 + Future updateSchedule(Schedule schedule) async { + try { + await _db + .collection('schedules') + .doc(schedule.id) + .update(schedule.toMap()); + } catch (e) { + LogManager().addLog('[Firestore] Error updating schedule: $e'); + throw Exception('일정 수정 실패: $e'); + } + } + + // 일정 삭제 + Future deleteSchedule(String scheduleId) async { + try { + await _db.collection('schedules').doc(scheduleId).delete(); + } catch (e) { + LogManager().addLog('[Firestore] Error deleting schedule: $e'); + throw Exception('일정 삭제 실패: $e'); + } + } + + // ID 생성 + String generateScheduleId() { + return const Uuid().v4(); + } } diff --git a/app/lib/widgets/common/custom_app_bar.dart b/app/lib/widgets/common/custom_app_bar.dart new file mode 100644 index 0000000..34a155a --- /dev/null +++ b/app/lib/widgets/common/custom_app_bar.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { + final String title; + final Widget? leading; + final List? actions; + final VoidCallback? onLeadingPressed; + final bool showBottomBorder; + + const CustomAppBar({ + super.key, + required this.title, + this.leading, + this.actions, + this.onLeadingPressed, + this.showBottomBorder = true, + }); + + @override + Widget build(BuildContext context) { + return AppBar( + backgroundColor: Colors.white, + elevation: 0, + scrolledUnderElevation: 0, + centerTitle: true, + title: Text( + title, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 18.sp, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + leading: + leading ?? + IconButton( + icon: const Icon(Icons.arrow_back_ios, color: Colors.black), + onPressed: onLeadingPressed ?? () => Navigator.pop(context), + ), + actions: actions, + bottom: showBottomBorder + ? PreferredSize( + preferredSize: Size.fromHeight(1.h), + child: Divider( + color: const Color(0xFFEEEEEE), + thickness: 1.h, + height: 1.h, + ), + ) + : null, + ); + } + + @override + Size get preferredSize => + Size.fromHeight(kToolbarHeight + (showBottomBorder ? 1.h : 0)); +} diff --git a/app/lib/widgets/common/custom_time_picker.dart b/app/lib/widgets/common/custom_time_picker.dart new file mode 100644 index 0000000..ee7b842 --- /dev/null +++ b/app/lib/widgets/common/custom_time_picker.dart @@ -0,0 +1,366 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class CustomTimePicker extends StatefulWidget { + final TimeOfDay initialTime; + final ValueChanged onTimeChanged; + + const CustomTimePicker({ + super.key, + required this.initialTime, + required this.onTimeChanged, + }); + + @override + State createState() => _CustomTimePickerState(); +} + +class _CustomTimePickerState extends State { + late FixedExtentScrollController _amPmController; + late FixedExtentScrollController _hourController; + late FixedExtentScrollController _minuteController; + + // 시간 직접 입력을 위한 컨트롤러 + final TextEditingController _hourInputController = TextEditingController(); + final TextEditingController _minuteInputController = TextEditingController(); + + // 입력 모드 상태 관리 + bool _isEditingHour = false; + bool _isEditingMinute = false; + final FocusNode _hourFocusNode = FocusNode(); + final FocusNode _minuteFocusNode = FocusNode(); + + // 내부 상태 (부모와 동기화) + late int _selectedAmPm; // 0: AM, 1: PM + late int _selectedHour; // 1~12 + late int _selectedMinute; // 0~59 + + // 외부 업데이트 중인지 확인하는 플래그 + bool _isSyncing = false; + + @override + void initState() { + super.initState(); + _initializeState(); + } + + @override + void didUpdateWidget(CustomTimePicker oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.initialTime != widget.initialTime) { + _isSyncing = true; // 동기화 시작 + try { + _updateInternalStateFromWidget(); + + // jumpToItem은 onSelectedItemChanged를 트리거할 수도 있으므로(구현에 따라 다름) + // 플래그로 콜백 호출을 막습니다. + if (_amPmController.hasClients) { + _amPmController.jumpToItem(_selectedAmPm); + } + if (_hourController.hasClients) { + _hourController.jumpToItem(_selectedHour - 1); + } + if (_minuteController.hasClients) { + _minuteController.jumpToItem(_selectedMinute); + } + } finally { + _isSyncing = false; // 동기화 종료 + } + } + } + + void _initializeState() { + _updateInternalStateFromWidget(); + + _amPmController = FixedExtentScrollController(initialItem: _selectedAmPm); + _hourController = FixedExtentScrollController( + initialItem: _selectedHour - 1, + ); + _minuteController = FixedExtentScrollController( + initialItem: _selectedMinute, + ); + } + + void _updateInternalStateFromWidget() { + final t = widget.initialTime; + _selectedAmPm = t.period == DayPeriod.pm ? 1 : 0; + _selectedHour = t.hourOfPeriod == 0 ? 12 : t.hourOfPeriod; + _selectedMinute = t.minute; + + if (!_isEditingHour) { + _hourInputController.text = _selectedHour.toString(); + } + if (!_isEditingMinute) { + _minuteInputController.text = _selectedMinute.toString().padLeft(2, '0'); + } + } + + void _notifyTimeChanged() { + if (_isSyncing) return; // 외부 동기화 중이면 부모에게 알리지 않음 + + // 내부 상태 -> TimeOfDay 변환 후 콜백 호출 + int hour24 = _selectedHour; + if (_selectedAmPm == 1 && _selectedHour < 12) { + hour24 += 12; + } else if (_selectedAmPm == 0 && _selectedHour == 12) { + hour24 = 0; + } + widget.onTimeChanged(TimeOfDay(hour: hour24, minute: _selectedMinute)); + } + + @override + void dispose() { + _amPmController.dispose(); + _hourController.dispose(); + _minuteController.dispose(); + _hourInputController.dispose(); + _minuteInputController.dispose(); + _hourFocusNode.dispose(); + _minuteFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 150.h, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // 오전/오후 + _buildWheelPicker( + controller: _amPmController, + items: ['오전', '오후'], + onChanged: (index) { + if (_isSyncing) return; + setState(() { + _selectedAmPm = index; + }); + _notifyTimeChanged(); + }, + width: 60.w, + height: 150.h, + selectedIndex: _selectedAmPm, + ), + + // 시 + _buildWheelPicker( + controller: _hourController, + items: List.generate(12, (index) => (index + 1).toString()), + onChanged: (index) { + if (_isSyncing) return; + setState(() { + _selectedHour = index + 1; + if (!_isEditingHour) { + _hourInputController.text = _selectedHour.toString(); + } + }); + _notifyTimeChanged(); + }, + width: 60.w, + height: 150.h, + isNumber: true, + inputController: _hourInputController, + isEditing: _isEditingHour, + focusNode: _hourFocusNode, + selectedIndex: _selectedHour - 1, + onTap: () { + setState(() { + _isEditingHour = true; + _isEditingMinute = false; + }); + _hourFocusNode.requestFocus(); + }, + onEditingComplete: () { + setState(() => _isEditingHour = false); + }, + onInputChanged: (value) { + if (value.isNotEmpty) { + int? hour = int.tryParse(value); + if (hour != null && hour >= 1 && hour <= 12) { + setState(() => _selectedHour = hour); + if (_hourController.hasClients) { + _hourController.jumpToItem(hour - 1); + } + _notifyTimeChanged(); + } + + // Auto-focus logic + if (value.length == 2) { + setState(() { + _isEditingHour = false; + _isEditingMinute = true; + }); + _minuteFocusNode.requestFocus(); + } + } + }, + ), + + Container( + height: 150.h, + alignment: Alignment.center, + child: Text( + ':', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 24.sp, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + + // 분 + _buildWheelPicker( + controller: _minuteController, + items: List.generate( + 60, + (index) => index.toString().padLeft(2, '0'), + ), + onChanged: (index) { + if (_isSyncing) return; + setState(() { + _selectedMinute = index; + if (!_isEditingMinute) { + _minuteInputController.text = _selectedMinute + .toString() + .padLeft(2, '0'); + } + }); + _notifyTimeChanged(); + }, + width: 60.w, + height: 150.h, + isNumber: true, + inputController: _minuteInputController, + isEditing: _isEditingMinute, + focusNode: _minuteFocusNode, + selectedIndex: _selectedMinute, + onTap: () { + setState(() { + _isEditingMinute = true; + _isEditingHour = false; + }); + _minuteFocusNode.requestFocus(); + }, + onEditingComplete: () { + setState(() => _isEditingMinute = false); + }, + onInputChanged: (value) { + if (value.isNotEmpty) { + int? minute = int.tryParse(value); + if (minute != null && minute >= 0 && minute <= 59) { + setState(() => _selectedMinute = minute); + if (_minuteController.hasClients) { + _minuteController.jumpToItem(minute); + } + _notifyTimeChanged(); + } + } + }, + ), + ], + ), + ); + } + + Widget _buildWheelPicker({ + required FixedExtentScrollController controller, + required List items, + required Function(int) onChanged, + required double width, + required double height, + required int selectedIndex, + bool isNumber = false, + TextEditingController? inputController, + Function(String)? onInputChanged, + bool isEditing = false, + FocusNode? focusNode, + VoidCallback? onTap, + VoidCallback? onEditingComplete, + }) { + return Container( + width: width, + height: height, + child: Stack( + children: [ + CupertinoPicker( + scrollController: controller, + itemExtent: 50.h, + onSelectedItemChanged: onChanged, + selectionOverlay: null, + diameterRatio: 99, + squeeze: 1.1, + children: items.asMap().entries.map((entry) { + final index = entry.key; + final item = entry.value; + final isSelected = index == selectedIndex; + + return GestureDetector( + onTap: () { + if (isSelected) { + if (isNumber) { + onTap?.call(); + } + } else { + controller.animateToItem( + index, + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + } + }, + behavior: HitTestBehavior.translucent, + child: Center( + child: Text( + item, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 20.sp, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + ); + }).toList(), + ), + if (isEditing && inputController != null && focusNode != null) + Center( + child: Container( + width: width, + height: 50.h, + alignment: Alignment.center, + decoration: const BoxDecoration(color: Colors.white), + child: TextField( + controller: inputController, + focusNode: focusNode, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + maxLength: 2, + autofocus: true, + onEditingComplete: onEditingComplete, + onTapOutside: (_) => onEditingComplete?.call(), + decoration: const InputDecoration( + counterText: "", + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isDense: true, + ), + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 20.sp, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + onChanged: onInputChanged, + ), + ), + ), + ], + ), + ); + } +} diff --git a/app/lib/widgets/common/pet_selection_header.dart b/app/lib/widgets/common/pet_selection_header.dart new file mode 100644 index 0000000..0bbee12 --- /dev/null +++ b/app/lib/widgets/common/pet_selection_header.dart @@ -0,0 +1,256 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import '../../models/pet_model.dart'; +import '../../theme/app_colors.dart'; + +class PetSelectionHeader extends StatelessWidget { + final List pets; + final Pet? selectedPet; + final ValueChanged onPetSelected; + final VoidCallback onAddPetPressed; + + const PetSelectionHeader({ + super.key, + required this.pets, + required this.selectedPet, + required this.onPetSelected, + required this.onAddPetPressed, + }); + + @override + Widget build(BuildContext context) { + // If no pet selected (and list is empty), show Add Pet UI or minimal hint + if (pets.isEmpty) { + // Returning null or minimal UI might be better, but user asked for "Consistent Header" + // The HomeScreen shows a "Register Pet + " button if empty. + // Let's implement that logic here for consistency if pets are empty. + return Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(8.r), + onTap: onAddPetPressed, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 4.h, horizontal: 12.w), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset( + 'assets/img/profile.png', + width: 40.w, + height: 40.h, + ), + SizedBox(width: 6.w), + Text( + '반려동물 등록 +', + style: TextStyle( + fontFamily: 'SCDream', + fontWeight: FontWeight.w500, + fontSize: 15.sp, + letterSpacing: 0.45.sp, + color: const Color(0xFF1f1f1f), + ), + ), + ], + ), + ), + ), + ); + } + + // Default display pet + final displayPet = selectedPet ?? pets.first; + + return Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(8.r), + onTap: () { + final RenderBox button = context.findRenderObject() as RenderBox; + final RenderBox overlay = + Navigator.of(context).overlay!.context.findRenderObject() + as RenderBox; + final RelativeRect position = RelativeRect.fromRect( + Rect.fromPoints( + button.localToGlobal(Offset(0, 50.h), ancestor: overlay), + button.localToGlobal( + button.size.bottomRight(Offset.zero), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, + ); + + showMenu( + context: context, + position: position, + elevation: 3, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.r), + ), + color: Colors.white, + surfaceTintColor: Colors.white, + items: [ + ...pets.map( + (pet) => PopupMenuItem( + value: pet, + child: Row( + children: [ + Container( + width: 32.w, + height: 32.w, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.grey[200], + ), + clipBehavior: Clip.hardEdge, + child: pet.profileImageUrl != null + ? Image.network( + pet.profileImageUrl!, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Center( + child: SvgPicture.asset( + 'assets/icons/profile_icon.svg', + width: 16.w, + colorFilter: ColorFilter.mode( + Colors.grey[400]!, + BlendMode.srcIn, + ), + ), + ); + }, + ) + : Center( + child: SvgPicture.asset( + 'assets/icons/profile_icon.svg', + width: 16.w, + colorFilter: ColorFilter.mode( + Colors.grey[400]!, + BlendMode.srcIn, + ), + ), + ), + ), + SizedBox(width: 10.w), + Text( + pet.name, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + fontWeight: pet.id == displayPet.id + ? FontWeight.bold + : FontWeight.normal, + color: pet.id == displayPet.id + ? AppColors.highlight + : Colors.black, + ), + ), + if (pet.id == displayPet.id) ...[ + const Spacer(), + const Icon( + Icons.check, + color: AppColors.highlight, + size: 16, + ), + ], + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + value: 'add_pet', + child: Row( + children: [ + Container( + padding: EdgeInsets.all(4.w), + decoration: BoxDecoration( + color: Colors.grey[100], + shape: BoxShape.circle, + ), + child: Icon(Icons.add, size: 16.w, color: Colors.black54), + ), + SizedBox(width: 10.w), + Text( + '반려동물 추가하기', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ], + ).then((value) { + if (value != null) { + if (value is Pet) { + onPetSelected(value); + } else if (value == 'add_pet') { + onAddPetPressed(); + } + } + }); + }, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 4.h, horizontal: 12.w), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40.w, + height: 40.w, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.grey[200], + ), + clipBehavior: Clip.hardEdge, + child: displayPet.profileImageUrl != null + ? Image.network( + displayPet.profileImageUrl!, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Center( + child: SvgPicture.asset( + 'assets/icons/profile_icon.svg', + width: 20.w, + colorFilter: ColorFilter.mode( + Colors.grey[400]!, + BlendMode.srcIn, + ), + ), + ); + }, + ) + : Center( + child: SvgPicture.asset( + 'assets/icons/profile_icon.svg', + width: 20.w, + colorFilter: ColorFilter.mode( + Colors.grey[400]!, + BlendMode.srcIn, + ), + ), + ), + ), + SizedBox(width: 10.w), + Text( + displayPet.name, + style: TextStyle( + fontFamily: 'SCDream', + fontWeight: FontWeight.bold, + fontSize: 18.sp, + color: Colors.black, + ), + ), + SizedBox(width: 4.w), + Icon(Icons.keyboard_arrow_down, size: 24.w, color: Colors.black), + ], + ), + ), + ), + ); + } +} diff --git a/app/lib/widgets/daily_care/schedule_form_sheet.dart b/app/lib/widgets/daily_care/schedule_form_sheet.dart new file mode 100644 index 0000000..e986a08 --- /dev/null +++ b/app/lib/widgets/daily_care/schedule_form_sheet.dart @@ -0,0 +1,252 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +import 'package:provider/provider.dart'; +import '../../models/schedule_model.dart'; +import '../../providers/pet_provider.dart'; +import '../../services/firestore_service.dart'; +import '../../theme/app_colors.dart'; + +class ScheduleFormSheet extends StatefulWidget { + final DateTime selectedDate; + + const ScheduleFormSheet({super.key, required this.selectedDate}); + + @override + State createState() => _ScheduleFormSheetState(); +} + +class _ScheduleFormSheetState extends State { + final TextEditingController _titleController = TextEditingController(); + final TextEditingController _noteController = TextEditingController(); + String _selectedType = 'general'; // 'general' or 'important' + bool _isSubstituting = false; // "저장 중" 상태 표시 + + @override + void dispose() { + _titleController.dispose(); + _noteController.dispose(); + super.dispose(); + } + + Future _saveSchedule() async { + final title = _titleController.text.trim(); + if (title.isEmpty) return; + + final petProvider = context.read(); + final selectedPet = petProvider.selectedPet; + + if (selectedPet == null) { + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('반려동물을 먼저 선택해주세요.'))); + return; + } + + setState(() { + _isSubstituting = true; + }); + + try { + final firestoreService = FirestoreService(); + final newSchedule = Schedule( + id: firestoreService.generateScheduleId(), + petId: selectedPet.id, + date: widget.selectedDate, + type: _selectedType, + isCompleted: false, + title: title, + note: _noteController.text.trim().isEmpty + ? null + : _noteController.text.trim(), + createdAt: DateTime.now(), + ); + + await firestoreService.addSchedule(newSchedule); + if (mounted) { + Navigator.pop(context, true); // 성공 시 true 반환 + } + } catch (e) { + debugPrint('Error saving schedule: $e'); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('일정 저장 실패: $e'))); + } + } finally { + if (mounted) { + setState(() { + _isSubstituting = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only( + left: 20.w, + right: 20.w, + top: 20.h, + bottom: MediaQuery.of(context).viewInsets.bottom + 20.h, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24.r)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + '일정 추가', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 18.sp, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + SizedBox(height: 10.h), + Divider(color: const Color(0xFFEEEEEE), thickness: 1.h), + SizedBox(height: 10.h), + SizedBox(height: 20.h), + + // 제목 입력 + TextField( + controller: _titleController, + decoration: InputDecoration( + labelText: '일정 제목', + floatingLabelStyle: const TextStyle(color: AppColors.highlight), + hintText: '예: 산책하기, 병원 방문', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + borderSide: const BorderSide(color: AppColors.highlight), + ), + filled: true, + fillColor: Colors.grey[50], + ), + ), + SizedBox(height: 16.h), + + // 중요도 선택 + Row( + children: [ + Expanded( + child: _buildTypeButton( + '일반', + 'general', + AppColors.subHighlight, + ), + ), + SizedBox(width: 12.w), + Expanded( + child: _buildTypeButton('중요', 'important', AppColors.highlight), + ), + ], + ), + SizedBox(height: 16.h), + + // 메모 입력 + TextField( + controller: _noteController, + maxLines: 3, + decoration: InputDecoration( + labelText: '메모 (선택)', + floatingLabelStyle: const TextStyle(color: AppColors.highlight), + hintText: '추가적인 내용을 입력하세요', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.r), + borderSide: const BorderSide(color: AppColors.highlight), + ), + filled: true, + fillColor: Colors.grey[50], + ), + ), + SizedBox(height: 24.h), + + // 저장 버튼 + ElevatedButton( + onPressed: _isSubstituting ? null : _saveSchedule, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.highlight, + padding: EdgeInsets.symmetric(vertical: 16.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.r), + ), + elevation: 0, + ), + child: _isSubstituting + ? SizedBox( + width: 24.w, + height: 24.w, + child: const CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : Text( + '저장하기', + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 16.sp, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ], + ), + ); + } + + Widget _buildTypeButton(String label, String value, Color color) { + final isSelected = _selectedType == value; + return InkWell( + onTap: () { + setState(() { + _selectedType = value; + }); + }, + borderRadius: BorderRadius.circular(12.r), + child: Container( + padding: EdgeInsets.symmetric(vertical: 12.h), + decoration: BoxDecoration( + color: isSelected ? color.withOpacity(0.1) : Colors.transparent, + border: Border.all( + color: isSelected ? color : Colors.grey[300]!, + width: isSelected ? 2 : 1, + ), + borderRadius: BorderRadius.circular(12.r), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 12.w, + height: 12.w, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + ), + SizedBox(width: 8.w), + Text( + label, + style: TextStyle( + fontFamily: 'SCDream', + fontSize: 14.sp, + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + color: isSelected ? color : Colors.grey[600], + ), + ), + ], + ), + ), + ); + } +} diff --git a/app/lib/widgets/home/pet_profile_card.dart b/app/lib/widgets/home/pet_profile_card.dart index 72ba61b..9016ece 100644 --- a/app/lib/widgets/home/pet_profile_card.dart +++ b/app/lib/widgets/home/pet_profile_card.dart @@ -144,21 +144,33 @@ class PetProfileCard extends StatelessWidget { child: Row( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + // 왼쪽: 프로필 이미지 // 왼쪽: 프로필 이미지 Container( width: 120.w, decoration: BoxDecoration( borderRadius: BorderRadius.circular(16.r), color: Colors.grey[200], - image: pet.profileImageUrl != null - ? DecorationImage( - image: NetworkImage(pet.profileImageUrl!), - fit: BoxFit.cover, - ) - : null, ), - child: pet.profileImageUrl == null - ? Center( + clipBehavior: Clip.hardEdge, + child: pet.profileImageUrl != null + ? Image.network( + pet.profileImageUrl!, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Center( + child: SvgPicture.asset( + 'assets/icons/profile_icon.svg', + width: 40.w, + colorFilter: ColorFilter.mode( + Colors.grey[400]!, + BlendMode.srcIn, + ), + ), + ); + }, + ) + : Center( child: SvgPicture.asset( 'assets/icons/profile_icon.svg', width: 40.w, @@ -167,8 +179,7 @@ class PetProfileCard extends StatelessWidget { BlendMode.srcIn, ), ), - ) - : null, + ), ), SizedBox(width: 10.w), // 오른쪽: 정보 영역 @@ -196,12 +207,12 @@ class PetProfileCard extends StatelessWidget { ), if (pet.gender == '남아' || pet.gender == '여아') ...[ SizedBox(width: 6.w), - Icon( - pet.gender == '남아' ? Icons.male : Icons.female, - color: pet.gender == '남아' - ? Colors.blue - : Colors.pinkAccent, - size: 20.sp, + SvgPicture.asset( + pet.gender == '남아' + ? 'assets/icons/male_icon.svg' + : 'assets/icons/female_icon.svg', + width: 20.w, + height: 20.w, ), ], ], diff --git a/app/pubspec.lock b/app/pubspec.lock index 0a6df21..a8daea9 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -616,6 +616,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.17.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" objective_c: dependency: transitive description: @@ -712,6 +720,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" pub_semver: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index b6978f7..7e88e42 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -47,6 +47,7 @@ dependencies: firebase_storage: ^12.0.0 uuid: ^4.0.0 table_calendar: ^3.0.9 + provider: ^6.1.1 dev_dependencies: flutter_test: diff --git a/backend/index.js b/backend/index.js index 6002ec9..1401b72 100644 --- a/backend/index.js +++ b/backend/index.js @@ -5,6 +5,7 @@ const { connectDB, sequelize } = require('./config/db'); const authRoutes = require('./routes/auth'); const commonRoutes = require('./routes/common'); const petRoutes = require('./routes/pets'); +const scheduleRoutes = require('./routes/schedules'); const seedData = require('./scripts/seedData'); const app = express(); @@ -22,6 +23,7 @@ app.use('/uploads', express.static(path.join(__dirname, 'uploads'))); app.use('/auth', authRoutes); app.use('/common', commonRoutes); app.use('/pets', petRoutes); +app.use('/schedules', scheduleRoutes); app.get('/', (req, res) => { res.send('Hello from Express Backend!'); diff --git a/backend/models/Schedule.js b/backend/models/Schedule.js new file mode 100644 index 0000000..690c8a3 --- /dev/null +++ b/backend/models/Schedule.js @@ -0,0 +1,59 @@ +const { DataTypes } = require('sequelize'); +const { sequelize } = require('../config/db'); + +const Schedule = sequelize.define('Schedule', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + petId: { + type: DataTypes.INTEGER, + allowNull: false, + comment: 'Reference to Pet table', + }, + date: { + type: DataTypes.DATE, + allowNull: false, + comment: 'Schedule start date/time', + }, + type: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: 'general', // 'general', 'important' + }, + isCompleted: { + type: DataTypes.BOOLEAN, + defaultValue: false, + }, + title: { + type: DataTypes.STRING, + allowNull: false, + }, + note: { + type: DataTypes.TEXT, + allowNull: true, + }, + repeatInterval: { + type: DataTypes.INTEGER, + allowNull: true, + comment: 'Repeat interval (e.g. 1, 2)', + }, + repeatUnit: { + type: DataTypes.STRING, + allowNull: true, + comment: 'Repeat unit (day, week, month, year)', + }, + isAlarmOn: { + type: DataTypes.BOOLEAN, + defaultValue: false, + }, + alarmTime: { + type: DataTypes.DATE, + allowNull: true, + }, +}, { + timestamps: true, // adds createdAt, updatedAt +}); + +module.exports = Schedule; diff --git a/backend/models/index.js b/backend/models/index.js index a600c2c..aa09606 100644 --- a/backend/models/index.js +++ b/backend/models/index.js @@ -6,6 +6,7 @@ const PetSpecies = require('./PetSpecies'); const PetBreed = require('./PetBreed'); const PetDisease = require('./PetDisease'); const Pet = require('./Pet'); +const Schedule = require('./Schedule'); // Associations @@ -20,6 +21,10 @@ PetBreed.belongsTo(PetSpecies, { foreignKey: 'speciesId' }); User.hasMany(Pet, { foreignKey: 'userId' }); Pet.belongsTo(User, { foreignKey: 'userId' }); +// Pet <-> Schedule +Pet.hasMany(Schedule, { foreignKey: 'petId' }); +Schedule.belongsTo(Pet, { foreignKey: 'petId' }); + module.exports = { sequelize, @@ -29,4 +34,5 @@ module.exports = { PetBreed, PetDisease, Pet, + Schedule, }; diff --git a/backend/routes/pets.js b/backend/routes/pets.js index 54d5b21..5094f1b 100644 --- a/backend/routes/pets.js +++ b/backend/routes/pets.js @@ -34,6 +34,16 @@ router.post('/', upload.single('profileImage'), async (req, res) => { const profileImagePath = req.file ? `/uploads/pets/${req.file.filename}` : null; + // Check pet count limit (Max 20) + const currentPetCount = await Pet.count({ where: { userId } }); + if (currentPetCount >= 20) { + // Clean up uploaded file if limit exceeded + if (req.file) { + fs.unlinkSync(path.join(__dirname, '../uploads/pets/', req.file.filename)); + } + return res.status(400).json({ message: '최대 20마리까지만 등록할 수 있습니다.' }); + } + const newPet = await Pet.create({ userId, name, diff --git a/backend/routes/schedules.js b/backend/routes/schedules.js new file mode 100644 index 0000000..4c9d5d7 --- /dev/null +++ b/backend/routes/schedules.js @@ -0,0 +1,108 @@ +const express = require('express'); +const router = express.Router(); +const { Schedule } = require('../models'); +const { Op } = require('sequelize'); + +// GET /schedules +// Query: petId (required), year, month (optional, for monthly view) +router.get('/', async (req, res) => { + try { + const { petId, year, month } = req.query; + + if (!petId) { + return res.status(400).json({ message: 'Missing petId query parameter' }); + } + + const whereClause = { petId }; + + if (year && month) { + const startDate = new Date(year, month - 1, 1); + const endDate = new Date(year, month, 0, 23, 59, 59); // Last day of month + + whereClause.date = { + [Op.between]: [startDate, endDate] + }; + } + + const schedules = await Schedule.findAll({ + where: whereClause, + order: [['date', 'ASC']], + }); + + res.json(schedules); + } catch (error) { + console.error('Error fetching schedules:', error); + res.status(500).json({ message: 'Server Error', error: error.toString() }); + } +}); + +// POST /schedules +router.post('/', async (req, res) => { + try { + const { + petId, date, type, isCompleted, title, note, + repeatInterval, repeatUnit, isAlarmOn, alarmTime + } = req.body; + + const newSchedule = await Schedule.create({ + petId, + date: new Date(date), + type, + isCompleted: isCompleted || false, + title, + note, + repeatInterval, + repeatUnit, + isAlarmOn, + alarmTime: alarmTime ? new Date(alarmTime) : null, + }); + + res.status(201).json(newSchedule); + } catch (error) { + console.error('Error creating schedule:', error); + res.status(500).json({ message: 'Server Error', error: error.toString() }); + } +}); + +// PUT /schedules/:id +router.put('/:id', async (req, res) => { + try { + const { id } = req.params; + const updateData = req.body; + + const schedule = await Schedule.findByPk(id); + if (!schedule) { + return res.status(404).json({ message: 'Schedule not found' }); + } + + // Safety checks / parsing + if (updateData.date) updateData.date = new Date(updateData.date); + if (updateData.alarmTime) updateData.alarmTime = new Date(updateData.alarmTime); + + await schedule.update(updateData); + + res.json(schedule); + } catch (error) { + console.error('Error updating schedule:', error); + res.status(500).json({ message: 'Server Error', error: error.toString() }); + } +}); + +// DELETE /schedules/:id +router.delete('/:id', async (req, res) => { + try { + const { id } = req.params; + const schedule = await Schedule.findByPk(id); + if (!schedule) { + return res.status(404).json({ message: 'Schedule not found' }); + } + + await schedule.destroy(); + res.status(204).send(); + } catch (error) { + console.error('Error deleting schedule:', error); + res.status(500).json({ message: 'Server Error', error: error.toString() }); + } +}); + +module.exports = router; diff --git a/graphic_images.jpg b/graphic_images.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cc035582d8557cf42fb0d248b081c099bc2b1c37 GIT binary patch literal 225989 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�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

8noi(UtK!> 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

N!Jqgg`sI-( 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 Lue=e}@9F;qyhG-j literal 0 HcmV?d00001