From 294e80b8e9dfd2579bb429476d700fab35cca37d Mon Sep 17 00:00:00 2001 From: qixiangme Date: Sat, 5 Apr 2025 17:09:32 +0900 Subject: [PATCH 01/15] baking setting --- .../{ => UI/questions}/baking_screen.dart | 14 +- .../{ => UI}/questions/even/answer_block.dart | 8 +- .../questions/even/answer_screen.dart | 6 +- .../{ => UI}/questions/odd/odd_quiz.dart | 8 +- .../{ => UI}/questions/odd/odd_screen.dart | 8 +- .../{ => UI}/questions/trend/trend_ox.dart | 4 +- .../{ => UI}/questions/trend/trend_quiz.dart | 2 +- .../questions/trend/trend_screen.dart | 4 +- .../UI/setting/study_comeplete_screen.dart | 82 +++ .../UI/setting/study_make_level_screen.dart | 525 ++++++++++++++++++ .../baking/UI/setting/study_make_screen.dart | 462 +++++++++++++++ .../baking/UI/setting/study_make_screen2.dart | 323 +++++++++++ .../data/{ => attendacne}/attendance_api.dart | 2 +- .../{ => attendacne}/attendance_model.dart | 0 .../data/{ => mission}/mission_api.dart | 4 +- .../data/{ => mission}/mission_model.dart | 0 .../{ => mission}/mission_response_model.dart | 2 +- lib/features/pages_list.dart | 10 +- lib/main.dart | 10 +- 19 files changed, 1431 insertions(+), 43 deletions(-) rename lib/features/baking/{ => UI/questions}/baking_screen.dart (97%) rename lib/features/baking/{ => UI}/questions/even/answer_block.dart (96%) rename lib/features/baking/{ => UI}/questions/even/answer_screen.dart (97%) rename lib/features/baking/{ => UI}/questions/odd/odd_quiz.dart (97%) rename lib/features/baking/{ => UI}/questions/odd/odd_screen.dart (95%) rename lib/features/baking/{ => UI}/questions/trend/trend_ox.dart (98%) rename lib/features/baking/{ => UI}/questions/trend/trend_quiz.dart (98%) rename lib/features/baking/{ => UI}/questions/trend/trend_screen.dart (97%) create mode 100644 lib/features/baking/UI/setting/study_comeplete_screen.dart create mode 100644 lib/features/baking/UI/setting/study_make_level_screen.dart create mode 100644 lib/features/baking/UI/setting/study_make_screen.dart create mode 100644 lib/features/baking/UI/setting/study_make_screen2.dart rename lib/features/baking/data/{ => attendacne}/attendance_api.dart (93%) rename lib/features/baking/data/{ => attendacne}/attendance_model.dart (100%) rename lib/features/baking/data/{ => mission}/mission_api.dart (94%) rename lib/features/baking/data/{ => mission}/mission_model.dart (100%) rename lib/features/baking/data/{ => mission}/mission_response_model.dart (88%) diff --git a/lib/features/baking/baking_screen.dart b/lib/features/baking/UI/questions/baking_screen.dart similarity index 97% rename from lib/features/baking/baking_screen.dart rename to lib/features/baking/UI/questions/baking_screen.dart index 7feb3a2..c7d7f74 100644 --- a/lib/features/baking/baking_screen.dart +++ b/lib/features/baking/UI/questions/baking_screen.dart @@ -1,13 +1,13 @@ import 'dart:math'; import 'package:componentss/core/user_provider.dart'; -import 'package:componentss/features/baking/data/attendance_api.dart'; -import 'package:componentss/features/baking/data/attendance_model.dart'; -import 'package:componentss/features/baking/data/mission_api.dart'; -import 'package:componentss/features/baking/data/mission_model.dart'; -import 'package:componentss/features/baking/data/mission_response_model.dart'; -import 'package:componentss/features/baking/questions/even/answer_screen.dart'; -import 'package:componentss/features/baking/questions/odd/odd_screen.dart'; +import 'package:componentss/features/baking/data/attendacne/attendance_api.dart'; +import 'package:componentss/features/baking/data/attendacne/attendance_model.dart'; +import 'package:componentss/features/baking/data/mission/mission_api.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; +import 'package:componentss/features/baking/data/mission/mission_response_model.dart'; +import 'package:componentss/features/baking/UI/questions/even/answer_screen.dart'; +import 'package:componentss/features/baking/UI/questions/odd/odd_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; diff --git a/lib/features/baking/questions/even/answer_block.dart b/lib/features/baking/UI/questions/even/answer_block.dart similarity index 96% rename from lib/features/baking/questions/even/answer_block.dart rename to lib/features/baking/UI/questions/even/answer_block.dart index e1d6c71..8db1b70 100644 --- a/lib/features/baking/questions/even/answer_block.dart +++ b/lib/features/baking/UI/questions/even/answer_block.dart @@ -1,8 +1,8 @@ import 'package:componentss/core/user_provider.dart'; -import 'package:componentss/features/baking/baking_screen.dart'; -import 'package:componentss/features/baking/data/mission_api.dart'; -import 'package:componentss/features/baking/data/mission_model.dart'; -import 'package:componentss/features/baking/questions/even/answer_screen.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/data/mission/mission_api.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; +import 'package:componentss/features/baking/UI/questions/even/answer_screen.dart'; import 'package:componentss/features/main_screen.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; diff --git a/lib/features/baking/questions/even/answer_screen.dart b/lib/features/baking/UI/questions/even/answer_screen.dart similarity index 97% rename from lib/features/baking/questions/even/answer_screen.dart rename to lib/features/baking/UI/questions/even/answer_screen.dart index f89a750..4f2df5c 100644 --- a/lib/features/baking/questions/even/answer_screen.dart +++ b/lib/features/baking/UI/questions/even/answer_screen.dart @@ -1,6 +1,6 @@ -import 'package:componentss/features/baking/baking_screen.dart'; -import 'package:componentss/features/baking/data/mission_model.dart'; -import 'package:componentss/features/baking/questions/even/answer_block.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; +import 'package:componentss/features/baking/UI/questions/even/answer_block.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/lib/features/baking/questions/odd/odd_quiz.dart b/lib/features/baking/UI/questions/odd/odd_quiz.dart similarity index 97% rename from lib/features/baking/questions/odd/odd_quiz.dart rename to lib/features/baking/UI/questions/odd/odd_quiz.dart index e8e4cdc..9dd743d 100644 --- a/lib/features/baking/questions/odd/odd_quiz.dart +++ b/lib/features/baking/UI/questions/odd/odd_quiz.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'package:componentss/core/user_provider.dart'; -import 'package:componentss/features/baking/baking_screen.dart'; -import 'package:componentss/features/baking/data/mission_api.dart'; -import 'package:componentss/features/baking/data/mission_model.dart'; -import 'package:componentss/features/baking/questions/trend/trend_quiz.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/data/mission/mission_api.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; +import 'package:componentss/features/baking/UI/questions/trend/trend_quiz.dart'; import 'package:componentss/features/main_screen.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; diff --git a/lib/features/baking/questions/odd/odd_screen.dart b/lib/features/baking/UI/questions/odd/odd_screen.dart similarity index 95% rename from lib/features/baking/questions/odd/odd_screen.dart rename to lib/features/baking/UI/questions/odd/odd_screen.dart index ca01faf..d8e70f4 100644 --- a/lib/features/baking/questions/odd/odd_screen.dart +++ b/lib/features/baking/UI/questions/odd/odd_screen.dart @@ -1,7 +1,7 @@ -import 'package:componentss/features/baking/baking_screen.dart'; -import 'package:componentss/features/baking/data/mission_model.dart'; -import 'package:componentss/features/baking/questions/odd/odd_quiz.dart'; -import 'package:componentss/features/baking/questions/trend/trend_quiz.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; +import 'package:componentss/features/baking/UI/questions/odd/odd_quiz.dart'; +import 'package:componentss/features/baking/UI/questions/trend/trend_quiz.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/lib/features/baking/questions/trend/trend_ox.dart b/lib/features/baking/UI/questions/trend/trend_ox.dart similarity index 98% rename from lib/features/baking/questions/trend/trend_ox.dart rename to lib/features/baking/UI/questions/trend/trend_ox.dart index 5df414d..e203282 100644 --- a/lib/features/baking/questions/trend/trend_ox.dart +++ b/lib/features/baking/UI/questions/trend/trend_ox.dart @@ -1,5 +1,5 @@ -import 'package:componentss/features/baking/baking_screen.dart'; -import 'package:componentss/features/baking/questions/trend/trend_quiz.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/questions/trend/trend_quiz.dart'; import 'package:componentss/features/main_screen.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; diff --git a/lib/features/baking/questions/trend/trend_quiz.dart b/lib/features/baking/UI/questions/trend/trend_quiz.dart similarity index 98% rename from lib/features/baking/questions/trend/trend_quiz.dart rename to lib/features/baking/UI/questions/trend/trend_quiz.dart index 2aacef2..9aa091f 100644 --- a/lib/features/baking/questions/trend/trend_quiz.dart +++ b/lib/features/baking/UI/questions/trend/trend_quiz.dart @@ -1,4 +1,4 @@ -import 'package:componentss/features/baking/baking_screen.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; import 'package:componentss/features/main_screen.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; diff --git a/lib/features/baking/questions/trend/trend_screen.dart b/lib/features/baking/UI/questions/trend/trend_screen.dart similarity index 97% rename from lib/features/baking/questions/trend/trend_screen.dart rename to lib/features/baking/UI/questions/trend/trend_screen.dart index a85aee2..b3f310c 100644 --- a/lib/features/baking/questions/trend/trend_screen.dart +++ b/lib/features/baking/UI/questions/trend/trend_screen.dart @@ -1,5 +1,5 @@ -import 'package:componentss/features/baking/baking_screen.dart'; -import 'package:componentss/features/baking/questions/trend/trend_quiz.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/questions/trend/trend_quiz.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/lib/features/baking/UI/setting/study_comeplete_screen.dart b/lib/features/baking/UI/setting/study_comeplete_screen.dart new file mode 100644 index 0000000..5364b76 --- /dev/null +++ b/lib/features/baking/UI/setting/study_comeplete_screen.dart @@ -0,0 +1,82 @@ +import 'package:componentss/features/main_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class StudyComplete extends StatelessWidget { + const StudyComplete({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 90), + Padding( + padding: const EdgeInsets.only(left: 13), + child: Text( + '면접 합격을 위한\n완벽한 준비를 마쳤어요', + style: TextStyle( + color: const Color(0xFF1C1C1C) /* main-black */, + fontSize: 76.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + ), + + Padding( + padding: const EdgeInsets.only(left: 13.0, top: 8), + child: Text( + "입력하신 정보들로 맞춤 퀘스트를 출제합니다!", + style: TextStyle( + fontSize: 44.sp, + fontWeight: FontWeight.w500, + color: Color(0xFF8E95A2), + ), + ), + ), + SizedBox(height: 550), + + GestureDetector( + onTap: () {}, + child: Center( + child: Container( + width: 993.w, + height: 160.h, + decoration: BoxDecoration( + color: Color(0XFFFF9F1C), + + borderRadius: BorderRadius.all(Radius.circular(33.r)), + ), + child: GestureDetector( + onTap: () { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => MainScreen(goToPage: 0), + ), + ); + }, + child: Center( + child: Text( + "시작하기", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 50.sp, + ), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/features/baking/UI/setting/study_make_level_screen.dart b/lib/features/baking/UI/setting/study_make_level_screen.dart new file mode 100644 index 0000000..351ff1f --- /dev/null +++ b/lib/features/baking/UI/setting/study_make_level_screen.dart @@ -0,0 +1,525 @@ +import 'package:componentss/features/baking/UI/setting/study_comeplete_screen.dart'; +import 'package:componentss/features/study/ui/make_group/study_make_group_name_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:componentss/icons/custom_icon_icons.dart'; + +class StudyMakeLevel extends StatefulWidget { + const StudyMakeLevel({super.key}); + + @override + State createState() => _StudyMakeLevelState(); +} + +class _StudyMakeLevelState extends State { + bool _isNextButtonClicked = false; // 버튼 상태를 부모에서 관리 + + String? _selectedStudyLevelText; + String? _selectedInclusionOptionText; + + bool _isNextButtonEnabled = false; + void _updateNextButtonState() { + setState(() { + _isNextButtonEnabled = + _selectedStudyLevelText != null && + _selectedInclusionOptionText != null; + }); + } + + void _handleStudyLevelSelect(String itemText) { + setState(() { + _selectedStudyLevelText = itemText; + _updateNextButtonState(); + }); + // 디버깅용 출력 + } + + void _handleInclusionOptionSelect(String itemText) { + setState(() { + _selectedInclusionOptionText = itemText; + _updateNextButtonState(); + }); + // 디버깅용 출력 + } + + void _handleNextButtonTap() { + final Map args = + ModalRoute.of(context)!.settings.arguments as Map; + final String category = args['category']; + final String category2 = args['category2']; + final String date = args['date']; + final String time = args['time']; + print('category: $category'); + print('category2: $category2'); + print('Selected Date: $date'); + print('Selected Time: $time'); + + // 1. 버튼 클릭 상태 변경 (UI 즉시 업데이트) + if (_isNextButtonEnabled) { + print("--- 다음 버튼 클릭 ---"); + print("선택된 난이도: ${_selectedStudyLevelText ?? '선택되지 않음'}"); + print("포함할까요?: ${_selectedInclusionOptionText ?? '선택되지 않음'}"); + print("--------------------"); + setState(() { + _isNextButtonClicked = true; + }); + + // 2. 다음 화면으로 이동하고, 돌아왔을 때 실행될 로직 추가 + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => StudyComplete(), + settings: RouteSettings( + arguments: { + 'category': category, + 'category2': category2, + 'date': date, + 'time': time, + 'studyLevel': _selectedStudyLevelText, + 'inclusionOption': _selectedInclusionOptionText, + }, + ), + ), + ).then((_) { + // StudyMakeGroup2 에서 돌아온 후에 이 코드가 실행됨 + // 위젯이 화면에 아직 마운트되어 있는지 확인 (중요) + if (mounted) { + // 3. 버튼 상태를 다시 false로 초기화 + setState(() { + _isNextButtonClicked = false; + }); + } + }); + } else { + print("다음 버튼 클릭 불가"); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + automaticallyImplyLeading: false, + leading: GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: EdgeInsets.only(top: 8), + child: Icon(CustomIcon.back, size: 18), + ), + ), + ), + + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 77.w, vertical: 20.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 100.h), + Text( + '퀘스트 난이도를 선택해주세요', + style: TextStyle( + color: const Color(0xFF1F1F1F), + fontSize: 70.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + Text( + '준비 기간이 짧다면 난이도 중 이상을 추천해요', + style: TextStyle( + color: const Color(0xFF8E95A2), + fontSize: 44.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w500, + letterSpacing: -0.44, + ), + ), + SizedBox(height: 150.h), + Container( + width: 70.w, + height: 70.h, + decoration: ShapeDecoration( + color: Colors.black, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(100.r), + ), + ), + child: Center( + child: Text( + '1', + style: TextStyle( + color: Colors.white, + fontSize: 50.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + ), + ), + SizedBox(height: 50.h), + StudyLevels(onItemSelected: _handleStudyLevelSelect), + SizedBox(height: 150.h), + Row( + children: [ + Container( + width: 70.w, + height: 70.h, + decoration: ShapeDecoration( + color: Colors.black, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(100.r), + ), + ), + child: Center( + child: Text( + '2', + style: TextStyle( + color: Colors.white, + fontSize: 50.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + ), + ), + + SizedBox(width: 40.w), + + Text( + '최근 이슈, 트랜드 퀴즈도 포함할까요?', + style: TextStyle( + color: Colors.black, + fontSize: 35.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + ], + ), + SizedBox(height: 50.h), + InclusionOptions(onItemSelected: _handleInclusionOptionSelect), + Spacer(), + Padding( + padding: EdgeInsets.only(bottom: 200.h), + child: Center( + child: NextButton( + isEnabled: _isNextButtonEnabled, + onTap: _handleNextButtonTap, + ), + ), + ), + ], + ), + ), + ); + } +} + +class StudyLevel extends StatefulWidget { + final String text; + final String assetPath; + final bool isSelected; + final Function(String) onSelected; + + const StudyLevel({ + super.key, + required this.text, + required this.assetPath, + required this.isSelected, + required this.onSelected, + }); + + @override + _StudyLevelState createState() => _StudyLevelState(); +} + +class _StudyLevelState extends State { + @override + Widget build(BuildContext context) { + Color containerColor = + widget.isSelected ? Colors.orange.withOpacity(0.3) : Colors.white; + Color borderColor = + widget.isSelected ? Colors.orange : const Color(0xFFEBEBEB); + + return GestureDetector( + onTap: () { + print("${widget.text} 클릭됨"); + widget.onSelected(widget.text); + }, + child: Container( + width: 450.w, + padding: EdgeInsets.only( + top: 46.h, + left: 50.w, + right: 50.w, + bottom: 46.h, + ), + decoration: ShapeDecoration( + color: containerColor, + shape: RoundedRectangleBorder( + side: BorderSide(width: 2.75.w, color: borderColor), + borderRadius: BorderRadius.circular(38.50.r), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Container( + width: 100.w, + height: 100.w, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(widget.assetPath), + fit: BoxFit.cover, + ), + ), + ), + + SizedBox(width: 50.w), + Text( + widget.text, + style: TextStyle( + color: const Color(0xFF434343), + fontSize: 30.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w500, + letterSpacing: -0.40, + ), + ), + ], + ), + ), + ); + } +} + +class StudyLevels extends StatefulWidget { + final Function(String) onItemSelected; + + const StudyLevels({required this.onItemSelected, super.key}); + + @override + _StudyLevelsState createState() => _StudyLevelsState(); +} + +class LevelInfo { + final String text; + final String assetPath; + + LevelInfo({required this.text, required this.assetPath}); +} + +class _StudyLevelsState extends State { + String? selectedText; + + final List items = [ + LevelInfo(text: '난이도 상', assetPath: 'assets/images/box.png'), + LevelInfo(text: '난이도 중', assetPath: 'assets/images/box.png'), + LevelInfo(text: '난이도 하', assetPath: 'assets/images/box.png'), + LevelInfo(text: '난이도 기초', assetPath: 'assets/images/box.png'), + ]; + + void handleLevelSelected(String text) { + setState(() { + selectedText = text; + }); + widget.onItemSelected(text); + } + + @override + Widget build(BuildContext context) { + return Wrap( + alignment: WrapAlignment.center, + spacing: 15.w, + runSpacing: 15.h, + children: + items.map((itemInfo) { + return StudyLevel( + text: itemInfo.text, + assetPath: itemInfo.assetPath, + isSelected: selectedText == itemInfo.text, + onSelected: handleLevelSelected, + ); + }).toList(), + ); + } +} + +class InclusionOption extends StatefulWidget { + final String text; + final String assetPath; + final bool isSelected; + final Function(String) onSelected; + + const InclusionOption({ + super.key, + required this.text, + required this.assetPath, + required this.isSelected, + required this.onSelected, + }); + + @override + _InclusionOptionState createState() => _InclusionOptionState(); +} + +class _InclusionOptionState extends State { + @override + Widget build(BuildContext context) { + Color containerColor = + widget.isSelected ? Colors.orange.withOpacity(0.3) : Colors.white; + Color borderColor = + widget.isSelected ? Colors.orange : const Color(0xFFEBEBEB); + + return GestureDetector( + onTap: () { + print("${widget.text} 클릭됨"); + widget.onSelected(widget.text); + }, + child: Container( + width: 450.w, + padding: EdgeInsets.only( + top: 46.h, + left: 40.w, + right: 40.w, + bottom: 46.h, + ), + decoration: ShapeDecoration( + color: containerColor, + shape: RoundedRectangleBorder( + side: BorderSide(width: 2.75.w, color: borderColor), + borderRadius: BorderRadius.circular(38.50.r), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Container( + width: 80.w, + height: 80.h, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(widget.assetPath), + fit: BoxFit.cover, + ), + ), + ), + SizedBox(width: 30.w), + Text( + widget.text, + + style: TextStyle( + color: const Color(0xFF434343), + fontSize: 30.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w500, + letterSpacing: -0.40, + ), + ), + ], + ), + ), + ); + } +} + +class InclusionOptions extends StatefulWidget { + final Function(String) onItemSelected; + + const InclusionOptions({required this.onItemSelected, super.key}); + + @override + _InclusionOptionsState createState() => _InclusionOptionsState(); +} + +class InclusionOptionInfo { + final String text; + final String assetPath; + + InclusionOptionInfo({required this.text, required this.assetPath}); +} + +class _InclusionOptionsState extends State { + String? selectedText; + + final List items = [ + InclusionOptionInfo(text: '포함합니다', assetPath: 'assets/images/box.png'), + InclusionOptionInfo(text: '포함하지 않습니다', assetPath: 'assets/images/box.png'), + ]; + + void handleInclusionOptionSelected(String text) { + setState(() { + selectedText = text; + }); + widget.onItemSelected(text); + } + + @override + Widget build(BuildContext context) { + return Wrap( + alignment: WrapAlignment.center, + spacing: 15.w, + runSpacing: 15.h, + children: + items.map((InclusionOptionInfo) { + return InclusionOption( + text: InclusionOptionInfo.text, + assetPath: InclusionOptionInfo.assetPath, + isSelected: selectedText == InclusionOptionInfo.text, + onSelected: handleInclusionOptionSelected, + ); + }).toList(), + ); + } +} + +class NextButton extends StatelessWidget { + final bool isEnabled; + final VoidCallback onTap; + + const NextButton({required this.isEnabled, required this.onTap, super.key}); + + @override + Widget build(BuildContext context) { + Color bgColor = isEnabled ? Color(0xFFFF9F1C) : Colors.white; + Color borderColor = isEnabled ? Colors.white : Color(0xFFFF9F1C); + Color textColor = isEnabled ? Colors.white : Color(0xFFFF9F1C); + + return InkWell( + onTap: onTap, + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: 993.w, + height: 160.h, + decoration: ShapeDecoration( + color: bgColor, + shape: RoundedRectangleBorder( + side: BorderSide(width: 2.75.w, color: borderColor), + borderRadius: BorderRadius.circular(33.r), + ), + ), + alignment: Alignment.center, + child: Text( + '다음', + textAlign: TextAlign.center, + style: TextStyle( + color: textColor, + fontSize: 50.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.50, + ), + ), + ), + ); + } +} diff --git a/lib/features/baking/UI/setting/study_make_screen.dart b/lib/features/baking/UI/setting/study_make_screen.dart new file mode 100644 index 0000000..23dfb1d --- /dev/null +++ b/lib/features/baking/UI/setting/study_make_screen.dart @@ -0,0 +1,462 @@ +import 'package:componentss/features/baking/UI/setting/study_make_screen2.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:componentss/features/study/ui/make_group/study_make_group_screen2.dart'; +import 'package:componentss/icons/custom_icon_icons.dart'; + +class StudyMake extends StatefulWidget { + const StudyMake({super.key}); + + @override + State createState() => _StudyMakeState(); +} + +class _StudyMakeState extends State { + bool _isNextButtonClicked = false; // 버튼 상태를 부모에서 관리 + + String? _selectedCategoryItemText; + String? _selectedCategoryChipText; + + bool _isNextButtonEnabled = false; + + void _updateNextButtonState() { + setState(() { + _isNextButtonEnabled = + _selectedCategoryItemText != null && + _selectedCategoryChipText != null; + }); + } + + void _handleCategoryItemSelect(String itemText) { + setState(() { + _selectedCategoryItemText = itemText; + _updateNextButtonState(); // 버튼 상태 업데이트 + }); + } + + void _handleCategoryChipSelect(String chipText) { + setState(() { + _selectedCategoryChipText = chipText; + _updateNextButtonState(); // 버튼 상태 업데이트 + }); + } + + // 다음 버튼 탭 처리 및 네비게이션 함수 + void _handleNextButtonTap() { + // 1. 버튼 클릭 상태 변경 (UI 즉시 업데이트) + + if (_isNextButtonEnabled) { + print("--- 다음 버튼 클릭 ---"); + print("선택된 단체: ${_selectedCategoryItemText ?? '선택되지 않음'}"); + print("선택된 분야: ${_selectedCategoryChipText ?? '선택되지 않음'}"); + print("--------------------"); + setState(() { + _isNextButtonClicked = true; + }); + + // 2. 다음 화면으로 이동하고, 돌아왔을 때 실행될 로직 추가 + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => StudyMake2(), + settings: RouteSettings( + arguments: { + 'category': _selectedCategoryItemText, + 'category2': _selectedCategoryChipText, + }, // 전달할 데이터 + ), + ), + ).then((_) { + // StudyMakeGroup2 에서 돌아온 후에 이 코드가 실행됨 + // 위젯이 화면에 아직 마운트되어 있는지 확인 (중요) + if (mounted) { + // 3. 버튼 상태를 다시 false로 초기화 + setState(() { + _isNextButtonClicked = false; + }); + } + }); + } else { + print("다음 버튼 클릭 불가"); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + leading: GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: EdgeInsets.only(top: 8), + child: Icon(CustomIcon.back, size: 18), + ), + ), + ), + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 77.w), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 100.h), + Text( + '어떤 면접을 앞두고 계신가요?', + style: TextStyle( + color: const Color(0xFF1F1F1F), + fontSize: 70.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + Text( + '준비하고 있는 단체와 분야를 알려주세요', + style: TextStyle( + color: const Color(0xFF8E95A2), + fontSize: 44.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w500, + letterSpacing: -0.44, + ), + ), + SizedBox(height: 120.h), + Container( + width: 992.w, + padding: (EdgeInsets.symmetric(horizontal: 50.w)), + child: CategoryItems( + onItemSelected: _handleCategoryItemSelect, + ), + ), + + SizedBox(height: 100.h), + Container( + padding: EdgeInsets.symmetric(horizontal: 77.w), + width: 991.w, + child: CategoryChipGroup( + onChipSelected: _handleCategoryChipSelect, + ), + ), + + Spacer(), + Padding( + padding: EdgeInsets.only(bottom: 200.h), + child: Center( + child: NextButton( + isEnabled: _isNextButtonEnabled, + onTap: _handleNextButtonTap, + ), + ), + ), + ], + ), + ], + ), + ), + ); + } +} + +class CategoryItem extends StatefulWidget { + final String text; + final String assetPath; + final bool isSelected; + final Function(String) onSelected; + + CategoryItem({ + required this.text, + required this.assetPath, + required this.isSelected, + required this.onSelected, + }); + + @override + _CategoryItemState createState() => _CategoryItemState(); +} + +class _CategoryItemState extends State { + @override + Widget build(BuildContext context) { + Color containerColor = + widget.isSelected ? Colors.orange.withOpacity(0.3) : Colors.white; + Color borderColor = + widget.isSelected ? Colors.orange : const Color(0xFFEBEBEB); + + return GestureDetector( + onTap: () { + print("${widget.text} 클릭됨"); + widget.onSelected(widget.text); + }, + child: Container( + width: 250.w, + height: 250.h, + padding: EdgeInsets.all(20.w), + decoration: ShapeDecoration( + color: containerColor, + shape: RoundedRectangleBorder( + side: BorderSide(width: 2.75.w, color: borderColor), + borderRadius: BorderRadius.circular(38.50.r), + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Container( + width: 100.w, + height: 100.h, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(widget.assetPath), + fit: BoxFit.cover, + ), + ), + ), + SizedBox(height: 10.h), + Text( + widget.text, + style: TextStyle( + color: const Color(0xFF434343), + fontSize: 30.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w500, + letterSpacing: -0.44, + ), + ), + ], + ), + ), + ); + } +} + +class CategoryItems extends StatefulWidget { + final Function(String) onItemSelected; + + const CategoryItems({required this.onItemSelected, Key? key}) + : super(key: key); + + @override + _CategoryItemsState createState() => _CategoryItemsState(); +} + +class CategoryInfo { + final String text; + final String assetPath; + + CategoryInfo({required this.text, required this.assetPath}); +} + +class _CategoryItemsState extends State { + String? selectedText; + + final List items = [ + CategoryInfo(text: '교내동아리', assetPath: 'assets/images/box.png'), + CategoryInfo(text: '연합동아리', assetPath: 'assets/images/box.png'), + CategoryInfo(text: '서포터즈', assetPath: 'assets/images/box.png'), + CategoryInfo(text: '봉사단', assetPath: 'assets/images/box.png'), + CategoryInfo(text: '인턴 • 현장실습', assetPath: 'assets/images/box.png'), + CategoryInfo(text: '기타', assetPath: 'assets/images/box.png'), + ]; + + void handleItemSelected(String text) { + setState(() { + selectedText = text; + }); + widget.onItemSelected(text); + } + + @override + Widget build(BuildContext context) { + return Wrap( + alignment: WrapAlignment.start, + spacing: 15.w, + runSpacing: 15.h, + children: + items.map((itemInfo) { + return CategoryItem( + text: itemInfo.text, + assetPath: itemInfo.assetPath, + isSelected: selectedText == itemInfo.text, + onSelected: handleItemSelected, + ); + }).toList(), + ); + } +} + +class CategoryChip extends StatelessWidget { + final String emoji; + final String text; + final bool isSelected; + final Function(String) onSelected; + + CategoryChip({ + required this.emoji, + required this.text, + required this.isSelected, + required this.onSelected, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + Color bgColor = isSelected ? const Color(0x21FF9F1C) : Colors.white; + Color borderColor = + isSelected ? const Color(0xFFFF9F1C) : const Color(0xFFEBEBEB); + + return GestureDetector( + onTap: () { + print("${text} 클릭됨"); + onSelected(text); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 36.w, vertical: 26.h), + decoration: ShapeDecoration( + color: bgColor, + shape: RoundedRectangleBorder( + side: BorderSide(width: 2.75.w, color: borderColor), + borderRadius: BorderRadius.circular(36.r), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + emoji, + style: TextStyle( + color: const Color(0xFF1C1C1C), + fontSize: 36.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.36, + ), + ), + SizedBox(width: 10.w), + Text( + text, + style: TextStyle( + color: const Color(0xFF1C1C1C), + fontSize: 40.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.40, + ), + ), + ], + ), + ), + ); + } +} + +class CategoryChipInfo { + final String emoji; + final String text; + + CategoryChipInfo({required this.emoji, required this.text}); +} + +class CategoryChipGroup extends StatefulWidget { + final Function(String) onChipSelected; + + const CategoryChipGroup({required this.onChipSelected, Key? key}) + : super(key: key); + + @override + _CategoryChipGroupState createState() => _CategoryChipGroupState(); +} + +class _CategoryChipGroupState extends State { + String? selectedChipText; + + // 표시할 칩 데이터 목록 + final List chipItems = [ + CategoryChipInfo(emoji: '📚', text: '학술'), + CategoryChipInfo(emoji: '💻', text: '전공'), + CategoryChipInfo(emoji: '🎨', text: '예술'), + CategoryChipInfo(emoji: '👥', text: '문화•취미'), + CategoryChipInfo(emoji: '☀️', text: '봉사'), + CategoryChipInfo(emoji: '🔠', text: '어학'), + CategoryChipInfo(emoji: '🤝', text: '창업'), + CategoryChipInfo(emoji: '✈️', text: '여행'), + ]; + + void handleChipSelected(String text) { + setState(() { + selectedChipText = text; + }); + widget.onChipSelected(text); + } + + @override + Widget build(BuildContext context) { + return Wrap( + alignment: WrapAlignment.start, + runAlignment: WrapAlignment.center, + spacing: 20.w, + runSpacing: 20.h, + children: + chipItems.map((chipInfo) { + return CategoryChip( + emoji: chipInfo.emoji, + text: chipInfo.text, + // 현재 선택된 텍스트와 이 칩의 텍스트가 같은지 비교하여 isSelected 결정 + isSelected: selectedChipText == chipInfo.text, + + onSelected: handleChipSelected, + ); + }).toList(), + ); + } +} + +class NextButton extends StatelessWidget { + final bool isEnabled; + final VoidCallback onTap; + + const NextButton({required this.isEnabled, required this.onTap, Key? key}) + : super(key: key); + + @override + Widget build(BuildContext context) { + Color bgColor = isEnabled ? Color(0xFFFF9F1C) : Colors.white; + Color borderColor = isEnabled ? Colors.white : Color(0xFFFF9F1C); + Color textColor = isEnabled ? Colors.white : Color(0xFFFF9F1C); + + return InkWell( + onTap: onTap, + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: 993.w, + height: 160.h, + decoration: ShapeDecoration( + color: bgColor, + shape: RoundedRectangleBorder( + side: BorderSide(width: 2.75.w, color: borderColor), + borderRadius: BorderRadius.circular(33.r), + ), + ), + alignment: Alignment.center, + child: Text( + '다음', + textAlign: TextAlign.center, + style: TextStyle( + color: textColor, + fontSize: 50.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.50, + ), + ), + ), + ); + } +} diff --git a/lib/features/baking/UI/setting/study_make_screen2.dart b/lib/features/baking/UI/setting/study_make_screen2.dart new file mode 100644 index 0000000..2e56dbf --- /dev/null +++ b/lib/features/baking/UI/setting/study_make_screen2.dart @@ -0,0 +1,323 @@ +import 'package:componentss/features/baking/UI/setting/study_make_level_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:intl/intl.dart'; +import 'package:componentss/features/study/ui/make_group/study_make_group_level_screen.dart'; +import 'package:componentss/icons/custom_icon_icons.dart'; + +class StudyMake2 extends StatefulWidget { + const StudyMake2({super.key}); + + @override + State createState() => _StudyMakeState2(); +} + +class _StudyMakeState2 extends State { + DateTime? _selectedDate; + TimeOfDay? _selectedTime; + + // 남은 일 수 계산 + int _calculateRemainingDays() { + if (_selectedDate == null) { + return 0; + } + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final interviewDate = DateTime( + _selectedDate!.year, + _selectedDate!.month, + _selectedDate!.day, + ); + final difference = interviewDate.difference(today).inDays; + return difference >= 0 ? difference : 0; + } + + // 날짜 선택 Bottom Sheet 표시 + void _showDatePicker(BuildContext context) { + DateTime initialDate = _selectedDate ?? DateTime.now(); + DateTime firstDate = DateTime.now().subtract(Duration(days: 1)); + DateTime lastDate = DateTime.now().add(Duration(days: 365 * 5)); + + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + DateTime tempDate = initialDate; + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + color: Colors.white, + child: Column( + children: [ + Expanded( + child: CupertinoDatePicker( + mode: CupertinoDatePickerMode.date, + initialDateTime: initialDate, + minimumDate: firstDate, + maximumDate: lastDate, + onDateTimeChanged: (DateTime newDate) { + tempDate = newDate; + }, + ), + ), + CupertinoButton( + child: Text('확인', style: TextStyle(color: Colors.orange)), + onPressed: () { + setState(() { + _selectedDate = tempDate; + }); + Navigator.pop(context); + }, + ), + ], + ), + ); + }, + ); + } + + // 시간 선택 Bottom Sheet 표시 + void _showTimePicker(BuildContext context) { + DateTime initialDateTime = DateTime( + DateTime.now().year, + DateTime.now().month, + DateTime.now().day, + _selectedTime?.hour ?? DateTime.now().hour, + _selectedTime?.minute ?? DateTime.now().minute, + ); + + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + DateTime tempDateTime = initialDateTime; + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + color: Colors.white, + child: Column( + children: [ + Expanded( + child: CupertinoDatePicker( + mode: CupertinoDatePickerMode.time, + initialDateTime: initialDateTime, + use24hFormat: true, + onDateTimeChanged: (DateTime newDateTime) { + tempDateTime = newDateTime; + }, + ), + ), + CupertinoButton( + child: Text('확인', style: TextStyle(color: Colors.orange)), + onPressed: () { + setState(() { + _selectedTime = TimeOfDay.fromDateTime(tempDateTime); + }); + Navigator.pop(context); + }, + ), + ], + ), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + final Map args = + ModalRoute.of(context)!.settings.arguments as Map; + final String category = args['category']; + final String category2 = args['category2']; + + final DateFormat dateFormatter = DateFormat('yyyy.MM.dd'); + final DateFormat timeFormatter = DateFormat('HH:mm'); + + String displayDate = + _selectedDate != null ? dateFormatter.format(_selectedDate!) : '날짜 선택'; + String displayTime = + _selectedTime != null + ? timeFormatter.format( + DateTime(2000, 1, 1, _selectedTime!.hour, _selectedTime!.minute), + ) + : '시간 선택'; + + int remainingDays = _calculateRemainingDays(); + + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + automaticallyImplyLeading: false, + leading: GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: EdgeInsets.only(top: 8), + child: Icon(CustomIcon.back, size: 18), + ), + ), + ), + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 77.w, vertical: 50.h), + + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + SizedBox(height: 100.h), + + Text( + '면접 날짜와 시간을 알려주세요', + style: TextStyle( + color: const Color(0xFF1F1F1F), + fontSize: 70.sp, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + SizedBox(height: 8.h), + Text( + '남은 날짜에 맞추어 준비를 도와드릴게요', + style: TextStyle( + color: const Color(0xFF8E95A2), + fontSize: 44.sp, + + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w500, + letterSpacing: -0.44, + ), + ), + SizedBox(height: 120.h), + // 날짜 선택 영역 + _buildDateTimePickerRow( + context: context, + displayText: displayDate, + icon: Icons.calendar_today_outlined, + onTap: () => _showDatePicker(context), + ), + SizedBox(height: 40.h), + // 시간 선택 영역 + _buildDateTimePickerRow( + context: context, + displayText: displayTime, + icon: Icons.access_time_outlined, + onTap: () => _showTimePicker(context), + ), + SizedBox(height: 70.h), + // 남은 날짜 표시 영역 + Container( + width: double.infinity, + + padding: EdgeInsets.symmetric(horizontal: 40.w, vertical: 40.h), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(33.r), // ScreenUtil 적용 + border: Border.all(color: Colors.grey[300]!), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('면접까지 ', style: TextStyle(fontSize: 45.sp)), + Text( + '$remainingDays일', + style: TextStyle( + fontSize: 45.sp, + fontWeight: FontWeight.bold, + color: Colors.orange, + ), + ), + Text(' 남음', style: TextStyle(fontSize: 45.sp)), + ], + ), + ), + + Spacer(), + Padding( + padding: EdgeInsets.only(bottom: 200.h), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.orange, + padding: EdgeInsets.symmetric(vertical: 45.h), + + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(33.r), + ), + elevation: 0, + ), + onPressed: + (_selectedDate != null && _selectedTime != null) + ? () { + print('category: $category'); + print('category2: $category2'); + print('Selected Date: $displayDate'); + print('Selected Time: $displayTime'); + print('Remaining Days: $remainingDays'); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => StudyMakeLevel(), + settings: RouteSettings( + arguments: { + 'category': category, + 'category2': category2, + 'date': displayDate, + 'time': displayTime, + }, // 전달할 데이터 + ), + ), + + ); + } + : null, + child: Text( + '다음', + style: TextStyle( + fontSize: 50.sp, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ), + ); + } + + // Helper 위젯 함수 + Widget _buildDateTimePickerRow({ + required BuildContext context, + required String displayText, + required IconData icon, + required VoidCallback onTap, + }) { + bool isSelected = displayText != '날짜 선택' && displayText != '시간 선택'; + return InkWell( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 40.w, vertical: 40.h), + decoration: BoxDecoration( + color: Colors.white, + + borderRadius: BorderRadius.circular(33.r), + border: Border.all(color: Colors.grey[300]!), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + displayText, + style: TextStyle( + fontSize: 45.sp, + color: isSelected ? Colors.black : Colors.grey[500], + ), + ), + Icon(icon, color: Colors.grey[600]), + ], + ), + ), + ); + } +} diff --git a/lib/features/baking/data/attendance_api.dart b/lib/features/baking/data/attendacne/attendance_api.dart similarity index 93% rename from lib/features/baking/data/attendance_api.dart rename to lib/features/baking/data/attendacne/attendance_api.dart index a035a2c..b5acc7f 100644 --- a/lib/features/baking/data/attendance_api.dart +++ b/lib/features/baking/data/attendacne/attendance_api.dart @@ -1,5 +1,5 @@ import 'dart:convert'; -import 'package:componentss/features/baking/data/attendance_model.dart'; +import 'package:componentss/features/baking/data/attendacne/attendance_model.dart'; import 'package:http/http.dart' as http; class AttendanceApi { diff --git a/lib/features/baking/data/attendance_model.dart b/lib/features/baking/data/attendacne/attendance_model.dart similarity index 100% rename from lib/features/baking/data/attendance_model.dart rename to lib/features/baking/data/attendacne/attendance_model.dart diff --git a/lib/features/baking/data/mission_api.dart b/lib/features/baking/data/mission/mission_api.dart similarity index 94% rename from lib/features/baking/data/mission_api.dart rename to lib/features/baking/data/mission/mission_api.dart index a97f0a2..7d216fd 100644 --- a/lib/features/baking/data/mission_api.dart +++ b/lib/features/baking/data/mission/mission_api.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'dart:math'; -import 'package:componentss/features/baking/data/mission_model.dart'; -import 'package:componentss/features/baking/data/mission_response_model.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; +import 'package:componentss/features/baking/data/mission/mission_response_model.dart'; import 'package:http/http.dart' as http; const String baseUrl = 'http://34.64.233.128:5200'; diff --git a/lib/features/baking/data/mission_model.dart b/lib/features/baking/data/mission/mission_model.dart similarity index 100% rename from lib/features/baking/data/mission_model.dart rename to lib/features/baking/data/mission/mission_model.dart diff --git a/lib/features/baking/data/mission_response_model.dart b/lib/features/baking/data/mission/mission_response_model.dart similarity index 88% rename from lib/features/baking/data/mission_response_model.dart rename to lib/features/baking/data/mission/mission_response_model.dart index e81613e..d99ccbb 100644 --- a/lib/features/baking/data/mission_response_model.dart +++ b/lib/features/baking/data/mission/mission_response_model.dart @@ -1,5 +1,5 @@ -import 'package:componentss/features/baking/data/mission_model.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; class MissionResponse { final Mission nextOddMission; diff --git a/lib/features/pages_list.dart b/lib/features/pages_list.dart index 5e6aea8..4715b0e 100644 --- a/lib/features/pages_list.dart +++ b/lib/features/pages_list.dart @@ -1,11 +1,7 @@ -import 'package:componentss/features/baking/baking_screen.dart'; +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/setting/study_make_screen.dart'; import 'package:componentss/features/profile/my_profie_screen.dart'; import 'package:componentss/features/search/search_screen.dart'; import 'package:componentss/features/study/ui/study_screen.dart'; -List pages = [ - StudyScreen(), - BakingScreen(), - SearchScreen(), - MyProfieScreen(), -]; +List pages = [StudyScreen(), StudyMake(), SearchScreen(), MyProfieScreen()]; diff --git a/lib/main.dart b/lib/main.dart index ecdc358..57a7a75 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,11 @@ import 'package:componentss/core/user_provider.dart'; import 'package:componentss/features/auth/onboarding_screen.dart'; -import 'package:componentss/features/baking/questions/odd/odd_quiz.dart'; -import 'package:componentss/features/baking/questions/odd/odd_screen.dart'; -import 'package:componentss/features/baking/questions/trend/trend_quiz.dart'; +import 'package:componentss/features/baking/UI/questions/odd/odd_quiz.dart'; +import 'package:componentss/features/baking/UI/questions/odd/odd_screen.dart'; +import 'package:componentss/features/baking/UI/questions/trend/trend_quiz.dart'; import 'package:componentss/features/main_screen.dart'; -import 'package:componentss/features/baking/questions/trend/trend_ox.dart'; -import 'package:componentss/features/baking/questions/trend/trend_screen.dart'; +import 'package:componentss/features/baking/UI/questions/trend/trend_ox.dart'; +import 'package:componentss/features/baking/UI/questions/trend/trend_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; From 25f644e0dc8472e97f77fc240e6e7e22abdc56a8 Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 21:15:42 +0900 Subject: [PATCH 02/15] osy --- lib/features/study/ui/answer_block.dart | 2 +- lib/trend_screen.dart | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/features/study/ui/answer_block.dart b/lib/features/study/ui/answer_block.dart index 13cea7c..5193195 100644 --- a/lib/features/study/ui/answer_block.dart +++ b/lib/features/study/ui/answer_block.dart @@ -10,7 +10,7 @@ class AnswerBlock extends StatefulWidget { @override State createState() => _AnswerBlockState(); } - +//로그인 로딩 처리 class _AnswerBlockState extends State { @override Widget build(BuildContext context) { diff --git a/lib/trend_screen.dart b/lib/trend_screen.dart index 5dbf280..2f9d2b3 100644 --- a/lib/trend_screen.dart +++ b/lib/trend_screen.dart @@ -1,4 +1,5 @@ import 'package:componentss/features/baking/baking_screen.dart'; +import 'package:componentss/features/main_screen.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -30,8 +31,9 @@ class _trendScreenState extends State { context, MaterialPageRoute( builder: - (context) => - BakingScreen(), // Replace with your actual screen + (context) => MainScreen( + goToPage: 2, + ), // Replace with your actual screen ), ); }, From a0f94c14b2198968d83333c4862eb23212e6d262 Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 21:48:12 +0900 Subject: [PATCH 03/15] =?UTF-8?q?register=5Fscreen=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EB=94=94=20=EC=B0=BE=EA=B8=B0=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/features/auth/login_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/features/auth/login_screen.dart b/lib/features/auth/login_screen.dart index a45fd3b..2201904 100644 --- a/lib/features/auth/login_screen.dart +++ b/lib/features/auth/login_screen.dart @@ -149,7 +149,7 @@ class _LoginScreenState extends State { ), ), Text( - '|', + 'ㅣ', style: TextStyle( color: const Color(0xFF6B6B6B) /* dark-gray */, fontSize: 40.sp, From d57c91d106d7931184ae3216827ebdcd60d223a0 Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 22:06:41 +0900 Subject: [PATCH 04/15] =?UTF-8?q?baking=5Fstage=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/features/baking/UI/baking_stage.dart | 251 ++++++++++++++++++ .../baking/UI/questions/baking_screen.dart | 13 +- 2 files changed, 254 insertions(+), 10 deletions(-) create mode 100644 lib/features/baking/UI/baking_stage.dart diff --git a/lib/features/baking/UI/baking_stage.dart b/lib/features/baking/UI/baking_stage.dart new file mode 100644 index 0000000..2d7bf61 --- /dev/null +++ b/lib/features/baking/UI/baking_stage.dart @@ -0,0 +1,251 @@ +import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/data/mission/mission_model.dart'; +import 'package:componentss/features/baking/UI/questions/odd/odd_quiz.dart'; +import 'package:componentss/features/main_screen.dart'; +import 'package:componentss/icons/custom_icon_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class BakingStage extends StatefulWidget { + const BakingStage({super.key}); + + @override + State createState() => _BakingStageState(); +} + +class _BakingStageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + width: 1080.w, + height: 2857.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(color: Colors.white), + child: Stack( + children: [ + Positioned( + left: 0.w, + top: -67.h, + child: Container( + width: 1080.w, + height: 3575.h, + decoration: BoxDecoration(color: const Color(0xFF95E08A)), + ), + ), + Positioned( + left: 1002.w, + top: 4692.h, + child: Container( + transform: + Matrix4.identity() + ..translate(0.0, 0.0) + ..rotateZ(3.14), + width: 903.w, + height: 2328.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + ), + Positioned( + left: 99.w, + top: 253.h, + child: Container( + width: 903.w, + height: 2328.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + ), + Positioned( + left: 270.w, + top: 418.h, + child: Container( + width: 240.w, + height: 240.h, + decoration: ShapeDecoration( + color: Colors.white /* white */, + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x3F000000), + blurRadius: 15.r, + offset: Offset(0, 0), + spreadRadius: 0.r, + ), + ], + ), + ), + ), + Positioned( + left: 101.w, + top: 1396.h, + child: Container( + width: 240.w, + height: 240.h, + decoration: ShapeDecoration( + color: Colors.white /* white */, + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x3F000000), + blurRadius: 15.r, + offset: Offset(0, 0), + spreadRadius: 0.r, + ), + ], + ), + ), + ), + Positioned( + left: 339.w, + top: 2364.h, + child: Container( + width: 240.w, + height: 240.h, + decoration: ShapeDecoration( + color: Colors.white /* white */, + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x3F000000), + blurRadius: 15.r, + offset: Offset(0, 0), + spreadRadius: 0.r, + ), + ], + ), + ), + ), + Positioned( + left: 551.w, + top: 1056.h, + child: Container( + width: 240.w, + height: 240.h, + decoration: ShapeDecoration( + color: Colors.white /* white */, + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x3F000000), + blurRadius: 15.r, + offset: Offset(0, 0), + spreadRadius: 0.r, + ), + ], + ), + ), + ), + Positioned( + left: 459.w, + top: 1721.h, + child: Container( + width: 240.w, + height: 240.h, + decoration: ShapeDecoration( + color: Colors.white /* white */, + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x3F000000), + blurRadius: 15.r, + offset: Offset(0, 0), + spreadRadius: 0.r, + ), + ], + ), + ), + ), + Positioned( + left: 722.w, + top: 621.h, + child: Container( + width: 240.w, + height: 240.h, + decoration: ShapeDecoration( + color: Colors.white /* white */, + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x3F000000), + blurRadius: 15.r, + offset: Offset(0, 0), + spreadRadius: 0.r, + ), + ], + ), + ), + ), + Positioned( + left: 754.w, + top: 2108.h, + child: Container( + width: 240.w, + height: 240.h, + decoration: ShapeDecoration( + color: Colors.white /* white */, + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x3F000000), + blurRadius: 15.r, + offset: Offset(0, 0), + spreadRadius: 0.r, + ), + ], + ), + ), + ), + Positioned( + left: 0.w, + top: 0.h, + child: Container( + width: 1081.w, + height: 281.h, + decoration: BoxDecoration(color: Colors.white), + ), + ), + Positioned( + left: 1.w, + top: 135.h, + child: Container( + width: 1080.w, + height: 120.h, + padding: const EdgeInsets.only( + top: 13.75, + left: 55, + right: 77, + bottom: 13.75, + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 49.50.w, + children: [ + SizedBox( + width: 948.w, + child: Text( + 'STAGE 1', + style: TextStyle( + color: const Color(0xFF1C1C1C) /* main-black */, + fontSize: 60.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + letterSpacing: -0.60.w, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/features/baking/UI/questions/baking_screen.dart b/lib/features/baking/UI/questions/baking_screen.dart index c7d7f74..ff128a0 100644 --- a/lib/features/baking/UI/questions/baking_screen.dart +++ b/lib/features/baking/UI/questions/baking_screen.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:componentss/core/user_provider.dart'; +import 'package:componentss/features/baking/UI/baking_stage.dart'; import 'package:componentss/features/baking/data/attendacne/attendance_api.dart'; import 'package:componentss/features/baking/data/attendacne/attendance_model.dart'; import 'package:componentss/features/baking/data/mission/mission_api.dart'; @@ -189,20 +190,12 @@ class _BakingScreenState extends State { if (quest.title == "모범답안 작성하기") { Navigator.push( context, - MaterialPageRoute( - builder: - (context) => - AnswerScreen(mission: missionresponse.nextOddMission), - ), + MaterialPageRoute(builder: (context) => BakingStage()), ); } else if (quest.title == "랜덤질문에 답변 연습하기") { Navigator.push( context, - MaterialPageRoute( - builder: - (context) => - OddScreen(mission: missionresponse.nextEvenMission), - ), + MaterialPageRoute(builder: (context) => BakingStage()), ); // 다른 퀘스트에 대한 동작 추가 } From e086a9d9ad1d39a06d65cc7a695be2db002fba92 Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 22:14:53 +0900 Subject: [PATCH 05/15] add image --- assets/images/stage_road.png | Bin 0 -> 40561 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/stage_road.png diff --git a/assets/images/stage_road.png b/assets/images/stage_road.png new file mode 100644 index 0000000000000000000000000000000000000000..fbcd42baee1cbffe80a8aecf56243efd70fadaa1 GIT binary patch literal 40561 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 Date: Sat, 5 Apr 2025 22:27:05 +0900 Subject: [PATCH 06/15] add image --- assets/images/road_bottom.png | Bin 0 -> 6035 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/road_bottom.png diff --git a/assets/images/road_bottom.png b/assets/images/road_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..080f3d65f2ba1bd9ea4a55687a669b28c3c4352f GIT binary patch literal 6035 zcmZWNdpwiv`_G2Wun|%;u^4jbAcu`)rt+Ga^D(qeh-gL>(X^#EZ?S03YAVIBMotTv ze5>uPmdLTw;^}p!6Dq0S;$C_A6$?BPPsSsdT!s73tD;GKgyj`ueCpS zhXGar=y0qX)?okg-~B`7KB;Fp=MP$PF zoSpu?yR&cVx!=K2!>RqKI&%kC3GDC)!owQ?{HGddX?+xgobN+@dY5Ryd^4)B`?a6S3II4jyG=#Tey=Bn<|D zZrScS<@D#39TzHJW%q7IAUA-3olRgxUq(K4Ox7KR#v$pfCte=vMi1S3m+y}9<{{g& z?v=|+6P4DE?L8^R7G%tL8=gCS)JqYEO!Tq+Her*}?s=V0Z8Ug-2bt8ufS8=yqd(OT zVWX`&T&}&+Vvy=4qif?_WTn-*V{_U#r1l}7+T{rC=yuQBW6>cTeN&KGV^vyPhIp#M zASFc%b8ci={gCws?UKN1ledn%n{v9hRxiU=naJaA(y32P-cfcflRb|j@@yjzZtKIQ z1t_~X7YPhmv0AzbMU)%f^1YnXuwe*~LryIYWpZyX$Sf(XAi+0*Syx4n5z*+T_& z2h`cv?v}q&H%vJ-CGroBdO>8N#n>@Ajf`pG7A1jW?@KS`uVRP;Cizwsro)#TiZ}}W zNfptod@Y9fl3y%Hk-$8vhRrfK3jb6Nn_b{22xc2yaBOU1VZL#N7NgrGBscLKhlQy^ zIPbW6zb{Fz8%D;c+{U{XponHKLtFeGT#D0Vcoj~R#O6%dzbb8h5f90?+V6qCWMdCg zTRNl37;F4%c?1NEUenSbfO}0#AY(!x*#aBeaD~o-!rN{A09|YZ^6>0+HlC8s43zz# zJ`RcWLI0{Yn3!#TfKGCgbYAUyuan$SGncQJM1iQ2pAid??s~uD;ZC1G^z=0jOTSo+ z`}My5xqZ&eb}fcb!NjCopN+MVc%d5p;;;~F%`=iT8FY_6`JB4ZoA1M-bqzTjmK8CX zwE$_CAC37eZLmc(6mnQ-KUUy1w=C0zH-_qDOh0|7_+l?mj|1g;A$c5o9MZy%Wnkdu z@FOHf^D`c#Wth@=*mhvk%QYKsCxsn^iqlgY3^N0^xj6`Z! zdqr}Ge%g;M%4i5Z`TR`kX&|Z&IhWMiS+^K^wSy>urP4gp{p6 z8VmrBN>C#Ea4@+PA+}{>gX{EwV`Rx?r7pbKj*YFgKk9k^OCUttQoGt6U9d=1A4-hdnnD2>vdsbx z$4Ig{hbn$t_O*bM9=UE8=J5jwixU8i2$e=f|bFa5fo#v z5b?To6h-lPOY&xiK3?HP+^g?W#Ckd42E5^zaX4mjiJSWh@8!jX-N(sEg#lXO}eS zfW0O|+^X>24N5hapJ6yqqm8g3^90h2x|t?WwoJ^-J8e)TyOLH`xqd^Rbu*gvEKqNh2^% zD~tA4w7$!(`?W*LT*w+g z!r`=bg2RGu+W{y$TQg%?fzKwO;KbsS?punIe9pe|INw`e&43k@T%yTSBgg4B7X#Yw zsatOAwdr~KTtxswzS3uf4I5n{u?9J=|K{FPSU}sQl|d=dlr#C02EET^yA8&Ab3Uz+ znK&=*?)WwT^RxQRyWczHvZ20?hUBYfkCuEcTT`B;5as2N6a6jXtMo~wYYaB%cvm#m z=fsw>+j*&Dbw=i*t+5p5%pP-L{GVle&&FU6yG4%fpR;c3@B7ZFF1X*m3Q4~dzsnAD zH(EPl;)9JOJexdi86xPN`TJ-I<0qTy46IE%bg|>Z+KB4Jw%i1JeD{Gh8Fr_4{74UK z#=h!4c+4l#Rrclz>GmF(?5d}E!~5}3*^?f4Y!S7|qH$x!$X@cyka73yj_0BeC)d5H z0aNCF9`(DmsKC?yQoc~5>Obt@5GdVS-7)~u<4opqO=+%^D$E2|s5h3IQl{Y||^Nfp(t%zVFqaY>qesn8}%)hv)r-Gj5-_ zr3bX+aueUnH?}p|s5CFh1{W&FDKaXSPMCkTd?tH5?a)b(u5t&QJfOu~uBvXD^q7$( znKk8BBb>{2PX_-)ERg#813m;Wsup8`>0Ey8e3qI>8uRYf#*DC&jz64F7gN)JTSqmH z40Er(fF-$lSi61jXFzDNU$gNczs9tWHWI2gx0DOxZI!*s@(RL79syeL?*pzJG$&dp zh-;ObH*kHW!MZ@x<&mRmsrxJPQX^gBvy@kakKP8vJvML7UHwAv^>09E7b~So??YR= zvqK$*e7&>fgik-W^x<)N#Dpb(zq3}{n=8rqfu&}*w^<7L)yK`go0t8ZE#cj*uLUjB z6`qLF|MJicWaxBcD9wxZ&3&p&aa8?tj|I^myXCoP-IF6B(y9?=oqG(!Pn4!B+?m8J zHOCaD==jg6+H>h;YAcF~CH=-zPx!gM4_zMj`R2LpFD^bDR^-p%6UJ|*M1LOt;@#4& zHb}BtF}*iFLtaGc+#90oULhSG%GRMJ*H=snD&Iy?P5#xvwO=$}_MYGE8?ql-oo6&z zF}rjPX#+KT>T2YXyNi!z8}6-`yq|8bJ7jeS^o#ep)!c<&L>CBsYin0XK19xz9$rj& z5yB^!$y%I(E1Z=H3l-cI|CDWUo|ulcji%QS)7~D>SM;+#eFa-mTF>YRBWq&K2U8_dKA?jwgO~b!N8te>ykej;TEn$yiCO;817go=eZ)r7z$35I4;8 z=Z4yT`xLKCkPN>1(yaa*9>NQYWK4{^1E(0jcB?kt`Zt3z%`u<-&>edI$M+)|_M{GT zPpl49;uNKbL01Kn1|JKAr{x*fY_-DfbgL>5Lc`SxIpW)j2O9nfK zxd^JE0zCVvKK+5mfJ90$I#ZElKAfM6XH`3OMdDbgKDLuzfc4fMj>UB z{_;lV!YaCU#2n6^KeGN}dWr_ARhgiY$fO7sPXRL<yLSZmWn1Sn08yk zvmeYf=O%Qa8r+r#tC%;ArM7 z0WBv@GM8A)8`Vh$jHFRHspq?mTn2ZDzCA;!r4V@01eF%3tRxO*TZob&2e_9jO>!_+ zQt>ekJH4-6b+OYPHZ2GX?pRll9j++!eBSd3c}9(wWSaD-HD0)X-uOc#EOaoewZ}GG z=(Z;BN`MmW5tS^^`h7Wrar?Hs+ z7axm48G-oem*d#D!uu*Tt7lCXzCUc3Z{jh?bw@41$yW15^8?AHU7e5gYQQ!Cg40!-({`Nr*+ia5H(M~XG|5~?XH>@B@lx-0iJS=3@k2|Xe^yv$Oe7u>gC!XN?mTO2yu7}fD zyl|sG7W?u?BxCFjAFz{KVlc6_lz&r79N`yFr^hr|q-IiSMx(Fx{`#;{pCGh#6*!=2 zX;mrt)E!B!DC}SguApZLR&#uCDFHwxAA)Yrz~lF5V$i#9?S#!}l0^*^*bQ=;R`_ye ze~=NVRwf?izgOoIqH=7>vTjt(X6QU^uAfpF>S@NT<-00y+8LVid2iMXghJ%@~W zeJ6FE|9|nuivx&kbSdf8YcHv;Lq?<8`FBd)4g=>)%e8{KPRhZqF<66auZ7|;m#zgB zfDj8;=x5C2G%Ey^S1YIjQ%+WWFItI8rKe70qcGBJ-!x2mN` z9%OMm$d~|#8EUCcOb&Pu9m3^Y^0!blCkE}R)~vs*bLNI#+pL@3eGIMWOXAN?cOW>( zN4ngjP7{H8n zFr=Od3X3)@g4KA?52>CQ&JuB`T+2{<&H3Hiy+#1=6_D-*SNZBwa?;Se;*??@@p9 zKPj-9&)b`Dar&;*M;;KdkM<)of=1$}nb_E4)}j4MQo&Y&Y{0OfiZid2`J|d}rPC4S|X+2VZgoWsg;+7j@p&0AP zdzu06pS*$K5)`q(rfa)aKF1MI)Ex^sBuV#A6&L>@F6-3eRULix>^;xUuY^PgMU=ce zh+k|5{;BwS6bKG!`}7}?Lg;~wSVp4;W5SZT>v5m_HZ*jCu4tT7#%jL=PWd^GV~VcW zU-rS!Lk7~UCR}V!#$!nV|ByG8y>@K2Kza-nu++lRJY@oG4QD-q!>z_e24eCPHX(OF+PjdUlN^O4J$&tD$iL1_KXH+MfMm;R8+N zEneRJMAQ1kzF)6oA7~YCUzoxUA2=lmHe&YiPgWj5oeJ`n;=4?R#jiXKwV=pf3ZL@^ zYMVEJZM%Vio_e;WC0dlon6qR~71p!Wz6PW}j8UYw-#mhfUHtv}R)^a2D@#Mr3>|Ra LMcpYN)6V`6IwSOs literal 0 HcmV?d00001 From 45ec456d5b372e3d2c05897e76c027c588a57e01 Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 22:34:14 +0900 Subject: [PATCH 07/15] =?UTF-8?q?baking=5Fstage=20=EA=B8=B8=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baking/UI/{questions => }/baking_screen.dart | 0 lib/features/baking/UI/baking_stage.dart | 15 ++++++++++++++- .../baking/UI/questions/even/answer_block.dart | 2 +- .../baking/UI/questions/even/answer_screen.dart | 2 +- .../baking/UI/questions/odd/odd_quiz.dart | 2 +- .../baking/UI/questions/odd/odd_screen.dart | 2 +- lib/features/pages_list.dart | 2 +- 7 files changed, 19 insertions(+), 6 deletions(-) rename lib/features/baking/UI/{questions => }/baking_screen.dart (100%) diff --git a/lib/features/baking/UI/questions/baking_screen.dart b/lib/features/baking/UI/baking_screen.dart similarity index 100% rename from lib/features/baking/UI/questions/baking_screen.dart rename to lib/features/baking/UI/baking_screen.dart diff --git a/lib/features/baking/UI/baking_stage.dart b/lib/features/baking/UI/baking_stage.dart index 2d7bf61..86ccf4f 100644 --- a/lib/features/baking/UI/baking_stage.dart +++ b/lib/features/baking/UI/baking_stage.dart @@ -1,4 +1,4 @@ -import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/baking_screen.dart'; import 'package:componentss/features/baking/data/mission/mission_model.dart'; import 'package:componentss/features/baking/UI/questions/odd/odd_quiz.dart'; import 'package:componentss/features/main_screen.dart'; @@ -33,6 +33,19 @@ class _BakingStageState extends State { decoration: BoxDecoration(color: const Color(0xFF95E08A)), ), ), + Positioned( + top: 281.h, + child: Image.asset('assets/images/stage_road.png'), + width: 1080.w, + height: 2000.h, + ), + Positioned( + right: 200, + top: 1860.h, + child: Image.asset('assets/images/road_bottom.png'), + width: 380.w, + height: 900.h, + ), Positioned( left: 1002.w, top: 4692.h, diff --git a/lib/features/baking/UI/questions/even/answer_block.dart b/lib/features/baking/UI/questions/even/answer_block.dart index f73ff80..06b8491 100644 --- a/lib/features/baking/UI/questions/even/answer_block.dart +++ b/lib/features/baking/UI/questions/even/answer_block.dart @@ -1,5 +1,5 @@ import 'package:componentss/core/user_provider.dart'; -import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/baking_screen.dart'; import 'package:componentss/features/baking/data/mission/mission_api.dart'; import 'package:componentss/features/baking/data/mission/mission_model.dart'; import 'package:componentss/features/baking/UI/questions/even/answer_screen.dart'; diff --git a/lib/features/baking/UI/questions/even/answer_screen.dart b/lib/features/baking/UI/questions/even/answer_screen.dart index 4f2df5c..5ab34b2 100644 --- a/lib/features/baking/UI/questions/even/answer_screen.dart +++ b/lib/features/baking/UI/questions/even/answer_screen.dart @@ -1,4 +1,4 @@ -import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/baking_screen.dart'; import 'package:componentss/features/baking/data/mission/mission_model.dart'; import 'package:componentss/features/baking/UI/questions/even/answer_block.dart'; import 'package:componentss/icons/custom_icon_icons.dart'; diff --git a/lib/features/baking/UI/questions/odd/odd_quiz.dart b/lib/features/baking/UI/questions/odd/odd_quiz.dart index b3078bb..d61a3ae 100644 --- a/lib/features/baking/UI/questions/odd/odd_quiz.dart +++ b/lib/features/baking/UI/questions/odd/odd_quiz.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:componentss/core/user_provider.dart'; -import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/baking_screen.dart'; import 'package:componentss/features/baking/data/mission/mission_api.dart'; import 'package:componentss/features/baking/data/mission/mission_model.dart'; import 'package:componentss/features/main_screen.dart'; diff --git a/lib/features/baking/UI/questions/odd/odd_screen.dart b/lib/features/baking/UI/questions/odd/odd_screen.dart index 1c822f9..cad12ca 100644 --- a/lib/features/baking/UI/questions/odd/odd_screen.dart +++ b/lib/features/baking/UI/questions/odd/odd_screen.dart @@ -1,4 +1,4 @@ -import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/baking_screen.dart'; import 'package:componentss/features/baking/data/mission/mission_model.dart'; import 'package:componentss/features/baking/UI/questions/odd/odd_quiz.dart'; import 'package:componentss/features/main_screen.dart'; diff --git a/lib/features/pages_list.dart b/lib/features/pages_list.dart index c7608b7..5a03fe6 100644 --- a/lib/features/pages_list.dart +++ b/lib/features/pages_list.dart @@ -1,4 +1,4 @@ -import 'package:componentss/features/baking/UI/questions/baking_screen.dart'; +import 'package:componentss/features/baking/UI/baking_screen.dart'; import 'package:componentss/features/baking/UI/setting/study_make_screen.dart'; import 'package:componentss/features/profile/my_profie_screen.dart'; import 'package:componentss/features/search/search_screen.dart'; From adb1f661a2d5c705fedb4d447912eccdb6f3a299 Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 22:41:55 +0900 Subject: [PATCH 08/15] =?UTF-8?q?baking=5Fstage=20=EB=8F=99=EA=B7=B8?= =?UTF-8?q?=EB=9D=BC=EB=AF=B8=20=EC=9C=84=EC=B9=98,=20=ED=81=AC=EA=B8=B0?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/features/baking/UI/baking_stage.dart | 61 +++++++++++++----------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/lib/features/baking/UI/baking_stage.dart b/lib/features/baking/UI/baking_stage.dart index 86ccf4f..8a5cab9 100644 --- a/lib/features/baking/UI/baking_stage.dart +++ b/lib/features/baking/UI/baking_stage.dart @@ -73,11 +73,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 270.w, - top: 418.h, + // 첫 번째 동그라미 + left: 300.w, + top: 420.h, child: Container( - width: 240.w, - height: 240.h, + width: 200.w, + height: 200.h, decoration: ShapeDecoration( color: Colors.white /* white */, shape: OvalBorder(), @@ -93,11 +94,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 101.w, - top: 1396.h, + // 네 번째 동그라미 + left: 150.w, + top: 1280.h, child: Container( - width: 240.w, - height: 240.h, + width: 200.w, + height: 200.h, decoration: ShapeDecoration( color: Colors.white /* white */, shape: OvalBorder(), @@ -113,11 +115,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 339.w, - top: 2364.h, + // 일곱 번째 동그라미미 + left: 400.w, + top: 2100.h, child: Container( - width: 240.w, - height: 240.h, + width: 200.w, + height: 200.h, decoration: ShapeDecoration( color: Colors.white /* white */, shape: OvalBorder(), @@ -133,11 +136,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 551.w, - top: 1056.h, + //세 번째 동그라미 + left: 530.w, + top: 980.h, child: Container( - width: 240.w, - height: 240.h, + width: 200.w, + height: 200.h, decoration: ShapeDecoration( color: Colors.white /* white */, shape: OvalBorder(), @@ -153,11 +157,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 459.w, - top: 1721.h, + // 다섯 번째 동그라미미 + left: 500.w, + top: 1550.h, child: Container( - width: 240.w, - height: 240.h, + width: 200.w, + height: 200.h, decoration: ShapeDecoration( color: Colors.white /* white */, shape: OvalBorder(), @@ -173,11 +178,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 722.w, + // 두 번째 동그라미 + left: 710.w, top: 621.h, child: Container( - width: 240.w, - height: 240.h, + width: 200.w, + height: 200.h, decoration: ShapeDecoration( color: Colors.white /* white */, shape: OvalBorder(), @@ -193,11 +199,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 754.w, - top: 2108.h, + // 여섯 번째 동그라미 + left: 730.w, + top: 1850.h, child: Container( - width: 240.w, - height: 240.h, + width: 200.w, + height: 200.h, decoration: ShapeDecoration( color: Colors.white /* white */, shape: OvalBorder(), From d5f7cd028c674b75c08d78ce9059c4af5108ee89 Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 22:45:19 +0900 Subject: [PATCH 09/15] =?UTF-8?q?baking=5Fstage=20=EA=B8=80=EC=94=A8=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/features/baking/UI/baking_stage.dart | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/features/baking/UI/baking_stage.dart b/lib/features/baking/UI/baking_stage.dart index 8a5cab9..bde9bfa 100644 --- a/lib/features/baking/UI/baking_stage.dart +++ b/lib/features/baking/UI/baking_stage.dart @@ -229,17 +229,12 @@ class _BakingStageState extends State { ), ), Positioned( - left: 1.w, - top: 135.h, + top: 120.h, + right: 30, child: Container( width: 1080.w, height: 120.h, - padding: const EdgeInsets.only( - top: 13.75, - left: 55, - right: 77, - bottom: 13.75, - ), + padding: const EdgeInsets.only(top: 10), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.end, From 17484e5d21a38bc28efd2670a9297334b245aa6a Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 23:03:00 +0900 Subject: [PATCH 10/15] =?UTF-8?q?=EB=B0=94=ED=85=80=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=EB=B0=94=20=EC=88=9C=EC=84=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/customBottomNavigationBar.dart | 8 +- lib/features/baking/baking_screen.dart | 730 ++++++++++++++++++ lib/features/pages_list.dart | 2 +- 3 files changed, 735 insertions(+), 5 deletions(-) create mode 100644 lib/features/baking/baking_screen.dart diff --git a/lib/core/widgets/customBottomNavigationBar.dart b/lib/core/widgets/customBottomNavigationBar.dart index 5c963d1..c22829f 100644 --- a/lib/core/widgets/customBottomNavigationBar.dart +++ b/lib/core/widgets/customBottomNavigationBar.dart @@ -35,16 +35,16 @@ class _CustomBottomNavigationBarState extends State { BottomNavigationBarItem( icon: Padding( padding: EdgeInsets.only(bottom: 4), - child: Icon(CustomIcon.study), + child: Icon(CustomIcon.baking), ), - label: '스터디', + label: '베이킹', ), BottomNavigationBarItem( icon: Padding( padding: EdgeInsets.only(bottom: 4), - child: Icon(CustomIcon.baking), + child: Icon(CustomIcon.study), ), - label: '베이킹', + label: '스터디', ), BottomNavigationBarItem( icon: Padding( diff --git a/lib/features/baking/baking_screen.dart b/lib/features/baking/baking_screen.dart new file mode 100644 index 0000000..5587ae2 --- /dev/null +++ b/lib/features/baking/baking_screen.dart @@ -0,0 +1,730 @@ +import 'dart:math'; + +import 'package:componentss/core/user_provider.dart'; +import 'package:componentss/features/baking/UI/questions/even/answer_screen.dart'; +import 'package:componentss/features/baking/UI/questions/odd/odd_screen.dart'; +import 'package:componentss/features/baking/data/attendacne/attendance_api.dart'; +import 'package:componentss/features/baking/data/attendacne/attendance_model.dart'; +import 'package:componentss/features/baking/data/mission/mission_api.dart'; +import 'package:componentss/features/baking/data/mission/mission_response_model.dart'; +//import 'package:componentss/features/study/ui/answer_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:provider/provider.dart'; +import 'package:intl/intl.dart'; + +class BakingScreen extends StatefulWidget { + const BakingScreen({super.key}); + + @override + State createState() => _BakingScreenState(); +} + +class _BakingScreenState extends State { + late MissionResponse? _missionResponse; + bool _isLoading = true; // 로딩 상태를 관리 + final List dailyQuests = []; + late List _attendanceHistory; + + @override + void initState() { + super.initState(); + // _loadMissionData(); + _attendanceHistory = []; // 초기화 + _loadMissionAndAttendanceData(); // 미션과 + // 유저 ID를 사용하여 미션 데이터를 가져옵니다. + } + + Future _loadMissionAndAttendanceData() async { + try { + // 미션 데이터와 출석 데이터를 병렬로 가져옴 + final userProvider = Provider.of(context, listen: false); + final user = userProvider.user; + final missionResponseFuture = fetchNextMissions( + user!.username, + ); // 유저 ID를 실제 값으로 대체 + final attendanceHistoryFuture = AttendanceApi().fetchAttendanceHistory( + user.username, + ); + + final results = await Future.wait([ + missionResponseFuture, + attendanceHistoryFuture, + ]); + + final missionResponse = results[0] as MissionResponse; + final attendanceHistory = results[1] as List; + + setState(() { + _missionResponse = missionResponse; + _attendanceHistory = attendanceHistory; + _isLoading = false; + + // 출석 데이터와 미션 데이터를 매칭하여 Quest의 isCompleted 설정 + final attendance = + attendanceHistory.isNotEmpty ? attendanceHistory.last : null; + + dailyQuests.add( + Quest( + title: "모범답안 작성하기", + subtitle: missionResponse.nextOddMission.question, + stage: + "Stage ${missionResponse.nextOddMission.stage}-${missionResponse.nextOddMission.index}", + isCompleted: attendance?.oddMissionCompleted ?? false, + ), + ); + + dailyQuests.add( + Quest( + title: "랜덤질문에 답변 연습하기", + subtitle: + attendance!.evenMissionCompleted + ? missionResponse.nextEvenMission.question + : "", + stage: + "Stage ${missionResponse.nextEvenMission.stage}-${missionResponse.nextEvenMission.index}", + isCompleted: attendance.evenMissionCompleted, + ), + ); + }); + } catch (error) { + print("Error loading mission or attendance data: $error"); + setState(() { + _isLoading = false; + }); + } + } + + Widget _buildAttendanceSection() { + // 요일 이름과 날짜를 매핑 + List days = ['월', '화', '수', '목', '금', '토', '일']; + DateTime startOfWeek = DateTime.now().subtract( + Duration(days: DateTime.now().weekday - 1), + ); + + return Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 1000.w, + height: 300.h, + decoration: BoxDecoration( + border: Border.all(color: const Color(0xFFD9D9D9)), + borderRadius: BorderRadius.circular(38.50.w), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(7, (index) { + // 현재 주의 날짜 계산 + DateTime currentDate = startOfWeek.add(Duration(days: index)); + String formattedDate = + currentDate.toIso8601String().split('T').first; + + // 출석 여부 확인 + bool isAttended = _attendanceHistory.any( + (attendance) => + attendance.attendanceSatisfied && + attendance.date == formattedDate, + ); + + bool isToday = + currentDate.day == DateTime.now().day && + currentDate.month == DateTime.now().month && + currentDate.year == DateTime.now().year; + + return Padding( + padding: const EdgeInsets.only(top: 20), + child: Column( + children: [ + isToday + ? Text( + days[index], // 요일 표시 + style: TextStyle( + color: Colors.black, + fontSize: 36.sp, + fontWeight: FontWeight.w600, + ), + ) + : Text( + days[index], // 요일 표시 + style: TextStyle( + color: Color(0xFF6B6B6B), + fontSize: 36.sp, + fontWeight: FontWeight.w400, + ), + ), + SizedBox(height: 10), + Container( + width: 100.w, + height: 100.h, + margin: EdgeInsets.symmetric(horizontal: 20.w), + decoration: BoxDecoration( + color: + isAttended ? Colors.orange : Colors.grey.shade300, + shape: BoxShape.circle, + ), + child: Center( + child: Icon( + isAttended ? Icons.check : null, + color: Colors.white, + // 출석 여부 표시 + ), + ), + ), + SizedBox(height: 10), + ], + ), + ); + }), + ), + ), + ], + ), + ); + } + + Widget _buildQuestItem(Quest quest, MissionResponse missionresponse) { + return GestureDetector( + onTap: () { + if (quest.title == "모범답안 작성하기") { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => + AnswerScreen(mission: missionresponse.nextOddMission), + ), + ); + } else if (quest.title == "랜덤질문에 답변 연습하기") { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => + OddScreen(mission: missionresponse.nextEvenMission), + ), + ); + // 다른 퀘스트에 대한 동작 추가 + } + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0), + width: 1000.w, + decoration: BoxDecoration( + color: quest.isCompleted ? const Color(0x21FF9F1C) : Colors.white, + borderRadius: BorderRadius.circular(8.0), + border: Border.all( + color: quest.isCompleted ? Colors.orange : Colors.grey.shade300, + ), + ), + + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Quest 객체의 데이터를 사용 + const SizedBox(height: 4), + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + decoration: BoxDecoration( + color: quest.isCompleted ? Colors.orange : Colors.grey.shade400, + borderRadius: BorderRadius.circular(20), + ), + child: Text( + quest.stage, + style: TextStyle( + fontSize: 10, + color: + quest.isCompleted ? Colors.white : Colors.grey.shade800, + fontWeight: FontWeight.bold, + ), + ), + ), + + const SizedBox(height: 10), + Text( + quest.title, + style: const TextStyle(fontSize: 17, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 3), + Divider( + color: quest.isCompleted ? Colors.orange : Colors.grey.shade400, + thickness: 1.0, + indent: 0.5, + endIndent: 0.5, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + quest.subtitle, + style: const TextStyle(fontSize: 12, color: Colors.black54), + ), + + ElevatedButton( + onPressed: () { + print("object"); + }, + style: ElevatedButton.styleFrom( + backgroundColor: + quest.isCompleted + ? Colors.orange + : Colors.grey.shade800, + + elevation: 0, + padding: EdgeInsets.zero, + minimumSize: const Size(65, 30), + + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20.0), + ), + visualDensity: VisualDensity.compact, + ), + + child: Text( + quest.isCompleted ? '완료' : '바로가기', + style: TextStyle(fontSize: 10, color: Colors.white), + ), + ), + ], + ), + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + child: Column( + children: [ + Stack( + children: [ + Container( + //width: double.infinity, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 100), + Text('logo'), + SizedBox(height: 50), + + Center( + //API로 받아오기 + child: EventCard( + title: '동아리 면접 🍞', // 이모지도 텍스트로 넣을 수 있습니다. + targetDate: DateTime( + 2024, + 5, + 31, + 15, + 00, + ), // 목표 날짜 및 시간 + ), + ), + + Row( + children: [ + Container( + width: 130.w, + height: 154.h, + margin: EdgeInsets.symmetric(horizontal: 8.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(35.r), + ), + ), + + Container( + width: 130.w, + height: 154.h, + margin: EdgeInsets.symmetric(horizontal: 8.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(35.r), + ), + ), + + Container( + width: 130.w, + height: 154.h, + margin: EdgeInsets.symmetric(horizontal: 8.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(35.r), + ), + ), + ], + ), + Stack( + children: [ + Center(child: AnimatedHalfCircleProgress()), + Padding( + padding: EdgeInsets.only(top: 90), + child: Center( + child: Container( + width: 611.w, + height: 500.h, + decoration: BoxDecoration( + color: Color(0XFF6B6B6B), + ), + ), + ), + ), + ], + ), + SizedBox(height: 20), + Center( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color(0x21FF9F1C), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 2.96.w, + color: const Color( + 0xFFFF9F1C, + ) /* main-orange */, + ), + borderRadius: BorderRadius.circular(29.57.w), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 29.57.w, + children: [ + Text( + 'Lv.0', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color( + 0xFFFF9F1C, + ) /* main-orange */, + fontSize: 36.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ), + SizedBox(height: 6), + Center( + child: Text( + '따끈따끈한 반죽', + style: TextStyle( + color: Colors.black /* white */, + fontSize: 66.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + ), + ), + ), + SizedBox(height: 200.h), + + Padding( + padding: EdgeInsets.only(left: 20), + child: Text( + '이번 주 출석 현황', + style: TextStyle( + color: Colors.black /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + ), + ), + ), + const SizedBox(height: 12), + _buildAttendanceSection(), + + SizedBox(height: 40), + Padding( + padding: EdgeInsets.only(left: 20), + child: Text( + '일일 퀘스트', + style: TextStyle( + color: Colors.black /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + ), + ), + ), + SizedBox(height: 20), + Padding( + padding: EdgeInsets.only(left: 20, right: 20), + child: Column( + // map을 사용하여 각 Quest 객체를 _buildQuestItem 위젯으로 변환 + // .toList()로 위젯 리스트 생성 + children: + dailyQuests + .map( + (quest) => Padding( + padding: const EdgeInsets.only( + bottom: 10.0, + ), + child: _buildQuestItem( + quest, + _missionResponse!, + ), + ), + ) + .toList(), + ), + ), + SizedBox(height: 50), + Padding( + padding: EdgeInsets.only(left: 20, right: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '나만의 모범 답안', + style: TextStyle( + color: Colors.black /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + ), + ), + GestureDetector( + onTap: () { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) { + // return ; + // }, + // ), + // ); + }, + child: Row( + children: [ + const Text('전체보기'), + Icon(Icons.arrow_forward_ios, size: 15), + ], + ), + ), + ], + ), + ), + SizedBox(height: 20), + //QnaListView(qnaItems: qnaList), + + //Padding( + // padding: EdgeInsets.only(left: 20, right: 20), + // child: Column( + // children: [ + ], + ), + ), + ], + ), + ], + ), + ), + ); + } +} + +class AnimatedHalfCircleProgress extends StatefulWidget { + const AnimatedHalfCircleProgress({super.key}); + + @override + _AnimatedHalfCircleProgressState createState() => + _AnimatedHalfCircleProgressState(); +} + +class _AnimatedHalfCircleProgressState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _animation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + vsync: this, + duration: Duration(seconds: 1), + )..repeat(reverse: false); + + _animation = Tween(begin: 0, end: 0.5).animate(_controller); + + _controller.forward(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _animation, + builder: (context, child) { + return CustomPaint( + size: Size(900.w, 450.h), + painter: HalfCircleProgressPainter(progress: _animation.value), + ); + }, + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} + +class HalfCircleProgressPainter extends CustomPainter { + final double progress; + + HalfCircleProgressPainter({required this.progress}); + + @override + void paint(Canvas canvas, Size size) { + Paint backgroundPaint = + Paint() + ..color = Color(0xFFD9D9D9) + ..strokeWidth = 10 + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round; + + Paint progressPaint = + Paint() + ..color = Color(0xFFFF9F1C) + ..strokeWidth = 10 + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round; + + Rect rect = Rect.fromLTWH(0, 0, size.width, size.height * 2); + + canvas.drawArc(rect, pi, pi, false, backgroundPaint); + canvas.drawArc(rect, pi, pi * progress, false, progressPaint); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => true; +} + +class Quest { + final String title; + final String subtitle; + final String stage; + final bool isCompleted; + + Quest({ + required this.title, + required this.subtitle, + required this.stage, + required this.isCompleted, + }); +} + +class EventCard extends StatelessWidget { + final String title; + final DateTime targetDate; + + const EventCard({Key? key, required this.title, required this.targetDate}) + : super(key: key); + + String calculateDday(DateTime target) { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final targetDay = DateTime(target.year, target.month, target.day); + final difference = targetDay.difference(today).inDays; + + if (difference == 0) { + return 'D-Day'; // D-Day는 특별 처리 + } else if (difference > 0) { + return 'D - $difference'; + } else { + return 'D + ${difference.abs()}'; + } + } + + // D-day 문자열을 각 부분(문자)으로 분리하는 함수 + List getDdayParts(String dDayString) { + if (dDayString == 'D-Day') { + return ['D', '-', '0']; + } else { + // "D - 123" 또는 "D + 45" 같은 형태 처리 + List parts = []; + parts.add('D'); // 첫 글자 'D' + parts.add(dDayString.substring(2, 3)); // 부호 ('-' 또는 '+') + String numberPart = dDayString.substring(4); + parts.addAll(numberPart.split('')); + return parts; + } + } + + @override + Widget build(BuildContext context) { + final formattedDate = DateFormat('yyyy.MM.dd HH:mm').format(targetDate); + final dDayString = calculateDday(targetDate); + final dDayParts = getDdayParts(dDayString); // D-day 부분을 각 문자로 분리 + + return Container( + width: 1000.w, + height: 250.h, + + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0), + decoration: BoxDecoration( + color: Color(0x21FF9F1C), + borderRadius: BorderRadius.circular(15.0), + border: Border.all(color: Colors.orange, width: 1.5), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + SizedBox(height: 4.0), + Text( + formattedDate, + style: TextStyle(fontSize: 14.0, color: Colors.black54), + ), + ], + ), + + Row( + children: + dDayParts.map((part) { + // 각 문자(부분)를 위한 컨테이너 생성 + return Container( + margin: const EdgeInsets.only(left: 3.0), + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 5.0, + ), + decoration: BoxDecoration(color: Colors.white), + child: Text( + part, // D-day 문자 (예: 'D', '-', '3', '0') + style: TextStyle( + fontSize: 75.51.sp, + fontWeight: FontWeight.w900, + color: Colors.orange, + ), + ), + ); + }).toList(), + ), + ], + ), + ); + } +} diff --git a/lib/features/pages_list.dart b/lib/features/pages_list.dart index 5a03fe6..954f360 100644 --- a/lib/features/pages_list.dart +++ b/lib/features/pages_list.dart @@ -4,4 +4,4 @@ import 'package:componentss/features/profile/my_profie_screen.dart'; import 'package:componentss/features/search/search_screen.dart'; import 'package:componentss/features/study/ui/study_screen.dart'; -List pages = [StudyScreen(), BakingScreen(), SearchScreen(), MyProfieScreen()]; +List pages = [BakingScreen(), StudyScreen(), SearchScreen(), MyProfieScreen()]; From 5a80332ede0c6d12c6a8c2ede4b2795e9216f3ae Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 23:12:39 +0900 Subject: [PATCH 11/15] add icons --- assets/icons/art.png | Bin 0 -> 3908 bytes assets/icons/book.png | Bin 0 -> 1961 bytes assets/icons/chat.png | Bin 0 -> 2591 bytes assets/icons/etc.png | Bin 0 -> 2799 bytes assets/icons/guitar.png | Bin 0 -> 2873 bytes assets/icons/keyboard.png | Bin 0 -> 2539 bytes assets/icons/startup.png | Bin 0 -> 1415 bytes assets/icons/travel.png | Bin 0 -> 1684 bytes assets/icons/volunteer.png | Bin 0 -> 3026 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/icons/art.png create mode 100644 assets/icons/book.png create mode 100644 assets/icons/chat.png create mode 100644 assets/icons/etc.png create mode 100644 assets/icons/guitar.png create mode 100644 assets/icons/keyboard.png create mode 100644 assets/icons/startup.png create mode 100644 assets/icons/travel.png create mode 100644 assets/icons/volunteer.png diff --git a/assets/icons/art.png b/assets/icons/art.png new file mode 100644 index 0000000000000000000000000000000000000000..491181ebaf9dd2577a51195c6f2d44100a0d572b GIT binary patch literal 3908 zcmV-K54-S*P)`CZFSA96SQ=xcR;$-HiK6Cplw#$ z8bOyx$XDPKG1l(1McBp#<)dF_z>{G)J}xmr*crP`e)o@kXplw)<@ev)2FlPX+cHK* zfad_S9Wwam1R9_bK?|#dbOcN1UTta44c9K{n`xCQ>bKU~1TB{#Xq6jKC0qmqINb*- ztOWRp{2^HtKNss*3`i7_q#D8NfK4)}XPHxrpwh)AUmC)3fxkouNnl6@`p6C+2@e5W zcnDsvhhY4+aKU$>Vk#Guk3_5$h!C?<7c1P_v!U(De3WIv6@FR2wH7zr4paz*3gMr< zCzc}Q2wEg2LI#tG@EBLccN3_Wp}4_EP$89BXdxzHIaCVC$>7@ocp@xSc#r83)D9Qd z{oMPybyQ-Z^@xciLGDXf>aiGm??LU5epQwl-9qaVQ*WIc8yl+^FP>XtY<9A@_jlzC zQ&_1O4rWhlpCrlO9^F!-3R+HpYI0%e6*(5Z&W9gf-=>s&`twitev*4DM&!Xtx;+{A7QaRc&^*lmjORuF|tcWM;# zs?IuzX4gg>y9G-4185XJD!p6~!Gel$voHRQ<}%d3h>O{1vaS*nQCsI6veEBvC?-EE zjc$8MgGhsCzCnV@JL=W(DmDb&;Z<_;`F80V7hQEkwk4CV=R525 zw9xe9YG<{$&eU%;VelYH;K=7XIA44N6yqr8UqdV4URLTXXlb28s1$vS_M?xkfBJgx zz#j41_mu|;c?zw7WIhulcMHV~y-HC>fe;iEg9H!+zoI@wT4JG4PLNieCY?@#7S>sL zx~1AWx3+HF2^SN=qNb%_71)Ko%L^PWbmbOQ35P>{6sT%fkJnJ-0JR4SP6p&CD62TZ ziz}lw<|t5`5bI}74#d|3`2~k%fW+s$)?8-1sqKk!-AOX25=s^>8~XkJ>TLGkCCIEN zImU#=KJ9qX(Lxw5yiAdO=mahi$2KQASZE!k3g0gjbUOV{48s3y+bT&wBWsqs8`YCr4I-mP?f$R16uMDE>&dz<~+Q`FF~LggZ`{<~u<4g~3Aj zyi8KF7u9ldWND#E4=P7D8Ht;2$vNmELJrG>d8}Ez%u>Fxh=TD=>laY+fz@d?Cy9Z* z+R2a+-wB11vF4bAH()zHV$Lb78YfM5Sh-z0K?!jk#62LH>Ijd#lt@#)&_atERcpw^ z6rQwu8;3v*yI?ddqoDGStS2Lm{|PhNUuR{7N8Ehohk5>FvhWb4E@Sl=B2ZfR*y?0T zjfQ2mP+DWj-??eF=*Ln3GKMJN(n0}cR^wE`4C3vba`?*bMAkE%VIyb_?iRuAGWAR` zNme#_cvAGiqepxBq65w|`Gm(C*9o`Wwi5w+!#HX&hQ?hoD1OJlG#=%7ezLo}hjHA2 zSVvC4^*4yuBni{RfgQt|Kcy3Bg4v~>?yy!+nN?o(_=#fTy37u=FiP1~F;TM4(i0ot zCzQgbYV4HO=@`~LcN*_=VTt{F5tiu=n=G_dV$MNfc6T55(ML@Id4~M-l7$uky=%3{vH`26h-yU2QGRfL3$K@ZH=Nz zfy~z+yhG{ghfo351;1h}6&Jxh#~XEVE^__)Z#U93b*L@nB1rJ#y7j~d_Yx`G@}Kc(hL4j>((afA=M{9sK*aXXQmytzn`& zSgXsG#ImwLS@Gu3>bw^#>8g5DV_z_4C-qLqr!;Zix}^vCZsi z#YCv?2j4MfS$krEb=kwK*I;)eL>E-J+EK->w*KugN+QfqOQxQW7NK_SU!w|IMuU3b ziJhw@8R*~TMCL$|O_}=gjL5XdbiL?pfZa)!4NbeBSBVx_D5F6kuJ+jIYE2O#Y?4gU z;iBkG*$5K9a_1*2v51i#g4r34nG{@80{IHj1eLDVFLy^46U~(U2JBodzfEr1RaBRE z`xWaPDdJM5Z-DY1IN>(Kj^c95S#1wI;hf(NbhSG^6a}wrK$AU1oyy##- zLua*Mh}9OkwAv38n>{`of;TJMV15SLYK*5g$P^ip*}uYl{TnQ3NB}_=;r^g}2udJQQrNSND>6LYUx2oiK_>-t7W00EaM`ef-uze~g6AS4_& zN0v33A~+OaH*|?%eA+gP4AsH6wiiy%#tWghuiJM_sUQ0R^<33+2E4+K)oEsxtKS`WZT<3TR z8q&K~j+?qY&g6@b&|%H=gmAsW&!y8dKMqN7!gh1tPQVjqmuve3qs8dgo8=y-{UUy4 z7H`3i$z6>@_CwpvISZPm)S>L}X9(f1|ag`?`sPHxfB7cAS6dEO6H$8aB1}6*ki3pXGAVXi+ z)OX8mmESKC#lmPl>wYJOn25EYXq|qgfBH#KS<2o6Uy6sR`ak@wc+50uH0ypREOhxY z)`GfPr>Pwq5-B%m6=%jiVYzxAGri~n_`R57B36R>SSMp_pl`>9oP#*v%=p5Qi>1oI zKwXcSUU&r$Of7zVuoBdL>|}%8-N(kTTp5Rrl-@xyoY{bPpT0Ou`_ZOFrX&;T0sGVg;h&hA`(YjpQ zsF0k^@~gYMyJK)f?nee@l(!!A64-t8*$^s5D=4+-H;+LBxis1H9t&kgd91OtZOm(8 z!ZYt}(7IeolaF;7Y8cLY`0#P0@gNAcQN&7dyu{|h@x+{` zS-vT*w{WqWIQgklOvI-}`97upzGAa1aiw&<%PlG|D!Z=;7aRTavB5CQ#b>3+JW`za zFh&PH6CW33`?<^bZT%$=A>cDY#iqZo$}u#E)jCu}eNOiF{3ks=_%(`bfVq$kPbaLB z#usKfoJ$t!q-8?RX|PRs10Dm#e!uM(@hnRz=vicgr|B9nx+b4cL^2ti z5LQg+FJ2E+pkVB~a;-Q4Y=($AxkZj|avUQQzoVn0qobpvqobpvqod>hh5rGKH2xZ` SW-jIc0000u!0AR>}2m}-qDjzn1VQvm~fGVE)=R+e-M7SUT zfZBBMSAqlpAZhJ{M0i92my0Gt`JM`IBGZ@t^&sQdd+${YSgvt*#JVBZs#FUBXH45L z8{+1!8RSXe`Ru7Oe(H`Kxma^fTD#1I-zq9?170a_%@TW^lBN#Zo$-$~r3HIG()-rC zGHMmd6O*E7{w;o*Lnkeb7~$-oFyRVjAB2x!aqCX{qe=~&hCWV&u3T2T^_ut#%@9xXrOc7%}X zYu&#^?RzH!5mDfA_v07@p^4s2iA2+;ZWaI)!xq`jj2VL%-bp zs7oLX9KuaZzG_{K@$~YV)YZ6X#G08Jv=5S1`x#ZdK@=!aRY*5(58PU~f+;SY4v}KY?y?&MoBJ05Ie^LG>~5 zL&8~S3S-_*#tmHX4iOLq^Ng;;&RYjfKnO{F1+lhGX}#8X^WY*kOhu{0uZxYE6=~?F z_2WVH?V--xOgyr1hmex!;C{|Pb{W;PhW~GwJ#LzR_<8n zY8T^%5|r`{y4@GH^P zCA;>1pzau};9A2Axw+)9;N`r?YTtue@b_9T+2Km37WfPxG3Sn5=-JB{FNr%@TAIQ>1A1|6;j#Q7(nXMXD*9BPlMG+LVzMhrF2~aYc z6ow%9%t0Z`PT<{%;tbnvtJ=dK4M=z5;VX;!l*;9?2Fs$@c4hIFIAs^3r)G)nv;Di! z9Z{bdS&LcWGU}oKRjefEjVqZ|{e~<-nK6JCOOW`qruwxfyG6RgFz{lgVO8IZFelpR zYy}*xKjvi9>1m&qhu8aXiAHITKev-B3g!6nte%TnOWxx8y1O~Ty3Af3>RS5PAa^^f znH2g;u5S3t(@7KkU7ZaM!2q+iF#R2yEAu-+k;+yKSBB=}I^I;#yJy?OR;Q-6hkKT7 zTBqq>^J}Jn^QkQ&_%na6mKQHPw4Cpe=R)Rk*~h~bT9Va)j|`?Z&Q0AoBd?~@RM}pg z$qK$3(anCH-zKswFf(2!Y8{@H)D=FJr3d!1$q`M6M0fApf@K>Fg{-(ao5O0Ik^~z1 zCtHVebDu&UP7va`7~@aNrlHZV?q4k$Kxur&>C_e~GQHS)%+kw^XqkbBjy<1qi+*za zShM&xd*gemz!+Z~84@!e#yu9>X0xv|-E8c@HSUEw+kGhOjR}C)R|(gzuk|5$SB&#g zA2QR86|&sn)+C#l$uwTTQf+It;AhW{hD#rq$ ymtQ5w6QR);Gxr0T{e?kmCK~#7F?VZnW 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 BLm~hG literal 0 HcmV?d00001 diff --git a/assets/icons/guitar.png b/assets/icons/guitar.png new file mode 100644 index 0000000000000000000000000000000000000000..db6d9b8ea879f4dc1b2db2273855bad8df839d0f GIT binary patch literal 2873 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 Xq)m4bW;@}{00000NkvXXu0mjfg$hL= literal 0 HcmV?d00001 diff --git a/assets/icons/keyboard.png b/assets/icons/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..1015c9b109d1926b90bad3118ca03fba795dfb8d GIT binary patch literal 2539 zcmVH{?*-8`wF;WPQ6t9@@_<=v;>XGX*B zYJcpX@B90GZ&v^WK@bE%5ClOG1VIo4K@bE%5K$tZAAdEUKYtx!LIMa+n28 z#;=}v=4YRO@WFro1rf&t!V}Aa3}0rV_CX9FK|L5BAJ3R3O!IZafD*)jBoK$l<#K(e zPW4Q)qIQO@+PMxB@Xl zYeAj*@Wf(cG3vsWWmzk1zm-H{Z>dmN+JTs&b&<=&ye^7~^&u0EWU?bY*P^>Gvy3CIcwpf?u=5EKv@d=8y{ZMT92&;uo5EIeZSU3=Le;@8ahd@q| zW{{wop{<~z_sYzHLFf>)6_nMRb$5q}`*Y|Jv=y|wySv2x)cTjk;N)a37QhwAFZT!(n(8fo@ z-h1n{?|Wf%bPP_PK67ZlMlkNpH{XCtrBdIP%Zrw1UL&D!4|7nMrc{)@+3 zU0sFk?N(h}>uJ8^BB<5p)tea@7_e`YA9!K?{TaA?dD=c9OaSN3{Z=aOl~=C9%P%|i z{BzGe4`X95NX6lK-MI0(y*@hn0t^lP!Z$9PP1}iqi!(ia$x}=YCQdx3`}a5P4<>>u zSFS>s;Jv$g^@@+E4ocRaN(#ga=li3$vWPd-FNcYU`(naVJszH~pO_;27}@MFw1ZaH z#Cjx8^5syyT)au*UsclS6toMhHiE?kySC#z4(q;nw{mshIO{S$+9jwgibZbwa!g!k z)yR7sgqlNn>yc<5Aq%<-?V?<+018eoNmeCju2VT4 zFGW;K6Mk(neZ%7b%>@~h1YKYMxBZb}VPT+q|@ zVNrLGyY`wIV0eCw#)KH75{K}v5Z>6Wtu5EMFuE|33A!{lcgwc_0==h5yb&tJFnXs! z2oi_qcf4_%zHw1#)hi2%zAV~Ztx}_7D8E}b=MgtkzY$Cvi;Hj96A2yz{anACjr)rx zdn0z@iXUn4oAU7bN<<9v$l8K>YiZE#^PP9b90$382-_x&N=ryaE&W} z)dPzk_ruyJ-v=3#1jQRQGjmyL-+_TMb#opsSjN*?YDj0_Xt*x!viC}8#Pawn4&@T_}$qzn(u^;<4sM04Mz|@(K;Qme@ zR31FxyT4MS2ronyu})Em!`#RnDHShQ%#B`R`o*c4^Ug7bhK8hL@P1$du#a`(Yfxd} zyK--@)5gmU+91)buS~|m5eeE5@~ShBii@D8{2-(ck832NovqEN`PJGKx#Ep&r-$4w zdXtZ&_R~nv_KMi<<3&nP)nX|Q!){0Qsl!6ioDX*Ls&V{gshIO(B2XCt5zj41Lc)Hm z3SlQ!B|*_4K_62F+z)5PA!uaFUWjO{i-x-&qCqYj*J#M2OCMI-vS3DQa5dz6Ir^7rgiUwP1D zZ$r;HpZ~qoz=LS&LEC)%ue~*_@X#+4<~ptjjQEk3PL+f1(6- z1F*=$#Bl9>=g|;9QS3POJqpN69NDJ{#CsBE!zeU!9^tw8Z0i3IRrq&OX-}`U(F_u_M!O!Lh?KEFG^6@>NZ1}Q391?NY|9a8 z*EM3lS%y%}d0xEmj(Zf@{_>Rl7q3l49B$*Odb9i(TVJTPl4b9qvNtk%-MN!V?^8i7&anzvkk_3wPO0BS1tR{1wL8*<1DZ6uCBv z5{dnn06?1`8rPX>)qF`@cNMfym@n<`!*75@jWmW)eXUq5t{mFdDga-~U#%tsc1dxvfYLImH6#S##`4!s$4FgEbF+!Bf1LZPrkr6)lU z1VIo4K@bE%5ClOG1VIo4K@bE%5ClOG1VO}_Zvi@YHi+J}TzUWi002ovPDHLkV1h9B B+o1pe literal 0 HcmV?d00001 diff --git a/assets/icons/startup.png b/assets/icons/startup.png new file mode 100644 index 0000000000000000000000000000000000000000..045a4b54163033caf77c30351d7a567255476f71 GIT binary patch literal 1415 zcmeAS@N?(olHy`uVBq!ia0vp^B|u!t!3HGfA3NFvq&N#aB8wRqxP?KOkzv*x37{Zj zage(c!@6@aFM%AEbVpxD28NCO+T=|wqqu2$b z2I-dHY%8jptkgSpXDsC4(mMQN*E>$FxeDhPnKqTZ;(DR2Hc@t$`{;a$v&%>t7HKTX|zkJh$G24cy1GsJ zlj&yn)q-j3cJ5o(Y$I%%V|J?loSU=ymZ-e@yT9Ljd3t(1OR4QvE2qUC?=Ny?nOxZ} zB5^zT-SjP!uBfpd(+XIsu|s~1%E7OaYph)b*jTi9m_*qcxtbkX9Tyx@2uM`=)brfu zc;vLd$Krc`e17v{S8mV3ieHi65BhG6Y^nT}*?(%v#emv!vn8q(ye9PmdFOMEg`@EoT_uW_Le*b%YT|PJPWbU=uuVyWmzIJ(f9P`tA8I%0`Zs*loPF(k_ z%w$oA-1NI?Z!?e1UApY*nf~Yfx>|A3!S!}kSNwJw7hAnoX8XT$wQ26$1x!2+* zZ|eW4A^Tk{_r>4h7a`$iBm1V+`|n&Y@a z$<#Tek{@nSAsfE!mZF@wX^2l%Ma2`7op)Yt`CfVA-S4j3b2|U84`LVaEqZSGf3Gj= zjXjNf;+)kde^!5@(Y5LCs@rR(72c~Ck7L#?THoY)+8Y=~s&=Q^o=m*%5c^CwcmCzP z`nNWjaVhpSh9}?7u=ymVaX#8Ae*3be|BX$hCKj`&2hN^q)GJr{q`IlP-#Wy1_V52O z_ogV}iFUSar!-%-F|nl@T`0)~*r$#^%n+U0Lc?N~CCK5?l2^bXja zZae+0uh4Rv#np%6E4Al2dDgXFIhWxwv&edt>_V0OSy9WM2zq_eKIXpidaa{p-BF)S z7ghTMCdDs&`AK;F@1{wAR4wj$`aHG0yz((%?7d>np8t&Iyi*A~`;;mx}y4!7@*~n3bzkd@Y>My=GWFRPb@g)Cch?Q;}sRmBf(_N=-Y srN;$7Xxbb7+e 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 UD{LnYtpET307*qoM6N<$f}CNtWdHyG literal 0 HcmV?d00001 From 9a69d0feb958e065c1d61a077e5caadae3ee814f Mon Sep 17 00:00:00 2001 From: ssoosy Date: Sat, 5 Apr 2025 23:19:59 +0900 Subject: [PATCH 12/15] add login icon --- assets/icons/login.png | Bin 0 -> 56362 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/icons/login.png diff --git a/assets/icons/login.png b/assets/icons/login.png new file mode 100644 index 0000000000000000000000000000000000000000..f34caf2073ecbb51a89e46f91c8d0609c6177808 GIT binary patch literal 56362 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

tJSi$=5W6YTWN>9 zdSo|#b*j58O_#Ol_0|m}Ryn!KKuoG0{;lphW9;`GTs+%gsphTyrsGr)QHsL)UZ}el zi2m}^RV^yh@$hm@qtBVY8uxn9L-`-%Dbt$JCYROmmE8qKo%NzcY|(nrKj8|rU8U}d z*z+*9=G#F<|&=;8)*0I`hC+s9mimedPhdnOg z{xEB}LXmDw&wA(7d)kk6iTg98`TDp{S@Ykx#~A#sSK-~`P(w4Y9`JZEb7deL+J1b_ z$-Bjj>Acar?lrMfnOEi_Vnp7(RYKygO{pN+?KaA%IxSE+eqK>n6W6-w-owZ#+xD~q zWl`xV6}RG6PhP3{Y%=L|neh5IPp_ZUtrm^=>gBDEp@g$W4%E9+?}uO1uT%?F78-&z%`RR-^FqSb!;H)bNqtJNZ1 zK|ba1OpTK4tn|}!L@PfZ2>+Y`@N(;#!V8AXi3qlGszw9$T0XqF$Y{6MUM-={^1b{Sb;jQZ)=ygeyjZAsVU|H0myN3;2T|KdSgZA~3j zYkKQIt2Na;x2088lv31G6s2OGf+RXg2UCkuV^vATR8@kID6O%^NDUF8h9D$}2qJMG z@6Y!)taa}{_pWt+YyH-`f1cqv<37*Xd!M~uTMg&;{o!afqUT9=+dp}XW|j2{2fM>$ zS0$Jd4ac>}4&Z|nHz9o=MWJr!#zVzCM2xg&k4+ug&~ZT8?;kHzI9z2#?-Jo{YLf$& zf1b(Xd#^C}(p|e7X44V~ZOb@|p-If5#}_H20B`>~3%qQw*?bpM;ash|dM8M-q=%q9 zzku`DTR%EJI9=mlejPF#lUUf%+sPoQk8Q^2mAVzbXr|FFrG8>TpfDs4_L3{An*!D} zsk#k4bxV1iem19VyYP0{49r!(ytkj$e~jT_VSdeJKmFYEq2qI4zVaOZlE1xeo9VfU z+w1%oJ4ga`^bYIUN{MQiR*F5Sw8etJn^(}l!_LOt?2tXgmUU@7F&c6O0ms6;Ln>L0>UTV1Cvn4$k}vkeof zhRC#vqXCxJGW|>D1>04!j(v?H6a^4cWdjDc^tH6<|3y}M=RST{%~-;z8@0A2r!4HT zvAcjj+hoxah07s9F}Stc*`ci5Ts2wrt0+NF=sE47B!ZO=y3@vgS6*lmd69To@?`^p~+LyyL#`VH`LOZ6m=D$s-np!182EF%1fvJcEj`c&*}QDbGRSR#a!PozoB z(@2~d@G@-nzF?N`)1d0m;s+wccEa}Kx>2)Dmlvz1wLQ=@9e|5VFX%Kf&`-*j!6(LI zg<6s+1Bd&Q%q)#=-X@f_xvRw3iI?_xMVH5gzeh#h>JE={V^rG6CB8HjlX6MWE89Uj zJW@b!-kJ$3uK8~0>LGVs@q#wNER6E-ZjZlT&D93+nLuvqk`{Yi_po&8>&P|m#T{_( z%I%Xqxzu$v0l_w9?)}DBJQGI&E#O9IXZ1HTbo8yTu#ot1ADy2O^$ThfeyCp+d4A7W zc;cb(5}|C{bK&h6=Ap&Om9f&4BC5%OpM)AjK%G#T=X^)$)ROYjfcTv--qhFN@^q(L zuj&?z9u-j4$n##rZ< z1BmqK9JZ=+SZn;57FODt|F@cyboB8RP1;XR08VmcoCE7Hw;izT-t@6FO^lgj2TqRt zillYUy;9S!04?v@w;0q3c*RLQ_0Qb%ab@KEree~C4PIz=!@Iwsjw>|URL-r5fN!C; zQn`W`rJvEX)*w5MiJP}6;0!5N$d9GAg%=?%?T;a)iWHUjHa%I*GswFP`CS>P|&BD!tacS|N17Xm89-Yls_>Q$d^{y`VWS8<1>MLrG{?0|I6|;LEu0@hGZPtnVkZo&$X7q)KZ&V+@^dFz)2ZB+2B6v}KgM z=mfW;U@umN84b~ADC^t_CaG)nkRRf5Q0mFQaYF?#)OIeuuQe!%a|-%G+wN+_ocj5p z-zJIcMPPQIK`RNhm0fbY;3s!wY^LM)Lh+(M+d!K$Q1uqzOS8U|VUjk6?Ud=x?Zu;4 z2p=v>Ur0twRgjIDM5+HwP%gzlK6a2tp|#WBHtsj$7b^=3J0(Y)XoRds-8Msd>@UYt zuNf_jl!ssz-DiTu&zaFC}=}zApT_G2E|#T_MaJ=d z1Sg@TIm>k0>x2{XQLoR!4v}OMBmNV&ek~gpsoKMxlf#_EpZFU=v{GLG`djx|+^aqK z4JpY#-7?SlmOt*EBCJdd%M{g_1Ac`*pRdyTq1;0-2=g&hqf(o6uMs|5ti|b6B^+Yt z39`Vlnvct;6ahZL*{-YL;1D5sZ6xfkK$jg+=?7d)RLX;CICO5-AbI9jY=iQ4%>F8m zj4sd6rn9LOFWx$Aa3k@KZwuTwUNx<4IXbLhrASmCS{8iZH1|GE zu$Ua1DF z@ppQq@=xLu@OEy=oe}=>G5-L2^sSHQQjxwKCxw*LXw|H?&r6(d;6QLoMDFx*BV#3l zYOJS^u>Bd&P)yC$WM^s=`uy%QN=CQi0(}J=u~~7`)R1LK6UeJ307#Ta%Mr)lOw~tfWua7XlXm1id&@XIMt9N&?Qt^ zU*f)%Dmq8a>uA3a+O))DgIk-~bv83>VSNus?+_rpSUxxsPYn)?uPn^{2yVYyTsn-X zxF}aSvhOoK527>6%26chkzZgYGpRtRSdGDaJ=wIs1D~QW9!>rweI7S0wBuy(#V+2% z-tmM1hBYKX9-o+VXp^U8soDmy_zvGy*A+%-Zx_YBj+NS_$Rj18%MuoQCrO7 z%Xy)wl8TngVPX||(!|RZv3ckv3Dh_^QexBwIh>!vq!U^Zc_pU(sBn7CIASCURrSp` zbKi>Iz2vFwhF+Y{{vyI_6+y|Q%9Q-P zn>H<{tvdmYpD9tRHI?({FnJBDA4p@o7`J&cMzTMfyTHsyBb@-u2V!mm|M|QtzRl|! z%aQQ8t#Iq&DA*Z=yz^>GY+QMj9CZ z(uqtT>7_97Hbs{z5-%ma81i{k&NRx+s`okC*?WdXDNlG=cMCNYNS`Zd^(dio(D}*) zOCgz!2ETKe;U@7ZQ6`SRqyiZCbgYBb&WOdCPOJ-{M`Cn-HW-FrjBas)2xv)hwnVV> zx4WvHZlzC6raRV45_6qXf^Sa+5*C1764+MPUdV&o3DFW0RrC1eDP zIHC4L67(JrBw}Jb9D-dWZZmDGQYMD>_EG|VrnwH^19TsvZ)#Awf(K~uUX^_{?O;$3 zr1Tr@vO6GAw*udo}eN*j;?GuQf9nEf9i&Ve6Mf>Ab z>@!5W=idF$%i|oTA+CF}aG~%ETN)L<6avkZxK2D^-HUa>d0V*DRhPt(*-3_p+bJwI z@cYHRbq}A@9%aS&Snh6~8bFLm6{-4JKkxc}j5gYf-frMbu2FK6Qk3*baYTpkjw-0o z)%wj|vATr`2U)Uj7TOj2p%fgPvti(uW6A53v)ty|_Ly*{XfnJut_~(Y#2m%G)(zeB zc|i*?($c!wg>oa*`43I23Gr1h#Imz)n7bga+h&cLc38)EmzK-r?d!kUvN+2;Dd7*l z$Ga4mxO#^<4%QCXGX3lBXOxPHbk$c%X=Wa0PCBhgUYim1GP1>0d`|Z&G*_dPQ}@?z zk+H{EJJSG<*c)JOd7VRq!ObKs%_OZrKqGV|pq9aE5ZshQ77l%|!aSv86sG}yZTX^U9qcWtW;!@K#nwy7%#}~d%hwXGzh*v+Q}oFY zD|bDez;4GUz5;%nsMYi-eQ9rNa!yyUb0isT#lJZz)|!wSoseGBU2&9-KFO@4Kii(q ziw?ItjAQM@D6O(7D&bCxEOew`_W{$cUY;wSM}fC5AvZZ&k<_{$ES?ZXT~^Q*x$#IA zrCjMOUPsWfIl^KoI7Mc%n-yMw`RLpnE^qGB%rZztLr{B2QSQ~&2}@|Znjk5HPf89`02mixD9gwEI`rPWZ}mZMGYjL+IZqy$Sp$qG%8ao{ueFJk2eJ3x82ztNBwGl&oD`i*kfR$ITSTC zSvu+}--f=pT645o0iGn*492~vflwGNU62NXotkC5V)s87C2Jh*D!sOpfc_nO&%P(U8=ut4fY7ix@mZ3Gca$>zCD{+5f*K&&W+yxmkmxc z?OxaQYYk1JxJOL*-1{IM{&wpm*+Zf=2ep)%UPxZi`l81=I%)o1+N+POUJNgye-TSU zHQJ1cMHxhUbFjr3x0-8F1QAH|c zYmPBkUAuL$f`-U$Q(K*0xmZ|q%`ulwO-)H)QJs!G@@~Pmp%!Yn({;WWpKm2c3_?sj zRZa?%6{V`waw*`PpEdcC#i3V>)xbT_>soQXK{m%{VJ5}kka@K)j(@lf8SQP9&gyaP zSxULQDH68-%DkW$@xD+;UTNMyWO-X;9IiOW4)eYSrQsjGN$G@DwQY4T z52n?wo^VYJ<%B+38lHSdL>~s}0k(&+mR^&vcGB5(NoBbVIpto|?QJn=4UcDcwS1jb;SsDh zsW&uqjH2e0d5zRDRtnWcANk`y+HTfOCn-S{0W zcZ&@I#Q;ElvHa*REoR?Le@9-lhQ&_v8_Xod>Zz|91pF;u%*f^b!F26R_C?AGXU&{xx;_y@!!1u`rHarxX86>e=l32cC~l_&2~G;eLzdu!WFO{LFCt zA%98%zie4A!Na!Dzau?(9D&J$~1i$b>rA8g|(!9hu zJrw9+?e{Ky9VIT{ps3R|y{_7?@Of~5wiLW*)YzBqW1xK-WDl5BFHd->S})~rw;4fO z1n-ikzN10{mR7coS+N?@vJKI`qFy}+{`wC{L|;y3roUjzlMvf>Vbf1GnZ5LD@n<(GDJ8X~uwO&JOGbE6Q@(@S+$8pdvHg+a@zfT*2 zopEFbTfJXeZyo(vc_rY_Fma|wN_rVYvMYLP%^NKf!*-F@O;{Z`z!xj9%OnVy+Az5mAd1k#P z#v%UJ&T=Iw1X=A{8;+=#cT%AT}ZEyrp9X zr9@rQc#3M3?N6rK!Dj^CT3DR^2ApN-BtW8gR&vc(Q-zR*Tf3F52luGl8aj3rc~YSe zHR=FXT@U&?cJHwYagCaG$M9ZA8#rDDT6)Tk;U|)C3gLmaop_Y#h$;jB33%L!pEzkH z@+0qF2I9l_yJ6FwM=)H_`cM(lcMw8;t6Zu}i`ZWrHcY=rs5%mat00|*syDdCM1j~Q zR4Wnug%LCAUBYHRa%_yB`|FT2xE4HqaR!01#vaN_hdzZ;@pJUX(@ zB2%ex?5}#$c$M)PhlbmXvO<+O%e-z|Ve`6!*rgi?W;wG3yk%=~sAm)=Vwa)hgX*&N-O`lt`y)q`pm-lj7!~r*oCdz>R`X)QD*0J zo{z3N?bxpOOF6vG7+0;|!zw!BT%k`37%#F3JNr352a@?+j+#I$8SO*Nb7&z|bHjCg zXxT!P>KSuk+`&c6AHUO_dF&nfu@!Ogj~ zbP`)ps8Mh#oH(A8vHocB+J>uWGf!mT?$gaBeJI$G8Ld6gZ4mf**75raMmR^?{gegu zde)&dQK^7ukWEN!q5bQH;ISZF@yNqW&5H_qYHcdCcd%b0ab*VaNYi5#-u7m;5lsV% z3y1VRd;o6*IOmu55(c8W*B53qt(sTAT1YB-lQGh)qXRSfrc2lml+OOl5wiQYrHlZK zcKP6Q)(2QdwD0>2EFY1R5K&iR9X5aNdoGd1u zd`4E#p0##ggyvebuvVgI??PLXQwAFTI@{emQ`GY6L~~SehA=U&wN7mhilKK;8~J8Y zpxWbC)J~*rWtlwQ=wIl5uY|%TA^%ARk3-ljwDs&ic0OH(yHTrvfks{-Bh{ zpA%C>udVNO?bZlZ|J*=!tRDWlv|xut%F2(xKjo3~lQ=|mW@Z|!XucO{OKR0(IJ&F%1t&jWOea_dilmfd!>9s`H4 zmWY9Ats9yY)9Y%sZq<&{F@kg5!Bvg%y)&CeRcF%+PI>9M+?6nzE8}xJJ~x29uX_p2 zt~;fpuO?@Uu$IF=lJ)317mpmYo4k8;He#t{RHgL(UN-c+5_{NKwW0Aq;>`B@ZUP%M zs;6IAY*6$f%w4bN$k(pdbqjv&VY-NLzc^;=P%+tp;GlwiP0)TBrFKR45)>ZH_RJjA zr#-&6WI>3|zctxHRA2CrbQIUlgcWpDrO-VeM6+GY?KIeiXRZPNBfxQZ!YE-9vz=m9 zm}=TYGSt7P?>+RKl@ECt35mb#p_ibdH*>zDSb-}n^7~>d{;Rs|fJ)z=AjMC{IFW~#Y57^g$kFI`VK>4{g}bMy z-#$nfHImgNEcJPuP&%MYk};|Bu*d$Th?F>vF(c;GH(%7#AV|5;8lF;AS8MZ&%DHr} zj4>?pRb-}kB-bM*Ak5?l>Rt_~_RXy4lEu)?5B+Ka{Gk$|t0ey_UEu zQTC993Z#W?G=kcsd71-f7UVN)|WoPV6#xXMc{-cqA&Z%3_va;@RBFpbnNMRG|9padaR2l42)2t=^HjfR^xpj_XBw?e=>YWtC>>&4?uHQ4N}cp3t=@Fr)4NSP1& zoA3&r*sq35s-TwtfclkJ7+X$3P%uCE0=WbO5fs(Yj{B$&FXBQb6S)2GI8bfsb_wW8 zfw(^`C~z(%B8N9ZWTxn=J#5Ub{zQ$6O^wH;m>b7Wmmm?o{&nO?R-dvBw6s>_ZZu)( zW+BMHpjIi_ZsmgIDXB1%YtE-E%vo1ayg`}oJt&Y;Z58wCy3{7k{(Ja{uC#D)Ynf%H zfpM>o&Z2a?Ig#kq`mi025+BKH`1L8mPnJhb{goO4>2~5X)#~tt_jU?POK?XCtG;oM zm^sMJ6v=d}leSwHE%1fopU9MJm<4mi(yE5(htpT2o9P@X-53j(0s&@XeH+Ut=iGZs?JN*^(hrE{>i;!&5QrVTzObogy5 zp9r=)nV201YVaX`Kqbb)J~&Czi+s(hl1yLb_I%g(`6;HL)Q+gSlUtyjZq%1JAIzS} z>^!t+V`zJNe)!2{K_(s1JjA)k4hPFB{Tj{~G*k&swW%;AJXT(keW@~;RB++eKLPLG zj6BY!QV>O#_AmxMXQP;%?2A(Ehng{ybJw(*3W2L$S&K8uz&P|O-Ltk4d=d;-h)8)= z602%DW%OudF>YH!rc7iKg3VWX*k-RUwNEfTzeQVUsY_er_+XHx$NBN=bTttY)2+v> zq}%E`N>@7W^B=D!>wLwdZ_^6emwx=JMIU?9QQkBBM)Du9D&ty_R1IG6*v;;r?%=F- z%WRRQ%*Ci$gL*@ndB{I+bjdkc^?d)BH#3r7dFvl;5g`9=kYalHxRD9YwE^L-FW?O zi!OVcvOgmxe+Gzsalcjmu3xBD1N@@o=P?~IVDV3*aPb>$fgezA#4H;Zv>LhnPy!PF zE8cl;VapkUGk?_`U0JS#x$AYc;|!VGN#JoM-F-Bb7$hVFaiU89y^Zs=JJPnNM9$4B z!DyE3MdLrZe!9s9%^fA^)3^ww9xU@7C=dd0j=PVAL8}CcLDUbQc52$q_Z~WTYIo?$ zKWi`Pmmeq8dnAkVg;!PO^Zj#OUm%KwmmRQoRv^s6m|m;&mp+OTjwHJt@3ifO2O+mJ z?-@#^l)o?qmG}09HhQ&mpY^hxEAOP9)3l(EX*hacFfIz_T3@<{Zqxs{Rw!1kAgw_{ zP#uh9i4OaRTS{_ABaF(|Rli5nG_Fu&J_lHlzke5?Rmxj<^J0 za;b2%tCK@ZnW-G;Q<)vC$3M_4fEYVISZbN!>d*$KI~;=6KDp1^TnN?tMUfzEY>7ql zw~D7FOx9-)+2p*bG0B&zA!nz!J?S<vwKL|NBIRaScX)QmvITVGHoa!y|- z_FK^uT!ej&U_CBhb*wJSP>13s7bK6XjJQHeYJ(g%jhb1jnDB*Zit9^81nmZl3 zud$Eafu*)>Jz_L(o*%M6LlsVBQ)O;jN}<-Z{l6~=-CWY3Mu&-b%MvO~ ze+%oF@7oh&53^W;Z{_@{uz$@jG=V8Z!)F1-f_H?BL~IwpC)a+iHyzUGCBIB6k+K@k zcz;-q`q`^&Z1zKCyVgjg@6+W&D8yyI_{ma{hclzgGNhhUqlk8$WF~PGfnSj#8<{a` zN$&`qWj%2lhTss$R~&!%YsiifbS&lW;i?a#U7H<@OBu3c>Qbs)W*+kRX1%0ODacMP z-!dp0N#J&1O0dE(7b_*ip8zBr zuCUHoqra^b@xFZdjOe(F$Rox!Q)_dS5wwm7*au1nK=K0*6jI9J@l>oFwW!|L`Nfj_ z2c*2stieixOqC0=^pKThY)!@eS(WqeZ|dA$t1h;F=wG99&zyoOHUnaw<=;1)UY2>) zdMC%c?p8xF4iOP{`Bt(eVPj^jS1>oC`?hV0?9$_>zRZxHTF;_#B-0Zsb#lz|8_Zua z7*)kRmQ{3{u$SM{eU%pdwVtS4JZRZk)7u=39xn0+c!r1IDR;f;pncmJ-QnXkNZ;*c z53<7{4>_}W*va+Aue~F5Bazm&h^<2JzuWu~r*WGwP@wkif%#3Vr|-;Gt@sF{e~xmF zK;NJI^m{oFWBomCS*ByilQb(l0&VJS>8)zg_Pc2J;?I%qUeAz-4>+o5qH5sKjwDex z=ZUU~KT*ZcUsdA4(aTf~sQn!?tDKaVo7YDww<7@;eefl7;stt_i+1?D=_Ag-C@9!;SeO{cm$b zfKRZkP(XP>Z&!)_%Zs=*>oGPCI~5feYX&4sJ zS&WLZrF;T@WymPjlCey3n%2v?SvKzM@BTpYkXez-?J@jU+fz;f(d!|3?sr{WyzVny z4!%DDhDSBG<-Xv+A}F74QBTCR9_#LK9St{TzcbfJwT{NN4pm;N`Vio~(I}5b&I=P; z9```fN<&;n{5AB|+=HznluR5q6AN49p?qdb7AJB(C;c%84ATN*yMQ3?wZ`ErHg~Lh zV@>v|u7c=4M7Oz=*PG3I$^AC2)C4+qMjn0dNpbn&A6=!ZCDUcHXUut{GH09Q-=$MT z<&I=Y46RKbJMny8Z4=@qZiZ9RhxK1(hWM{@8~IMdQW}a-L-zkU2qg!weUboz+uzqsaw`uN!#jlhpG3KDo%J6SXiM^ z+$Z+}^)RTrHznb-x$2RR&gG+RYQKx-b$qnS2WLlXLJFdiraPzx@t)`1v=;F16m<@$ zjJuRAfyCr#Ej6-~+9-u!#$^XEZ#6s|PDSw7&Kk zH>cIWVQ8w&XmqX{jN&^612nw2dtPyUY!Gw_3lqR{g;b2oAt$;%O z!#TZ^t{;6dQ+6ms3JZr^SW#;TKOA z@>oCATQ$^@uK$iw_~h(8X7c)SzN2_@TNourfw1l&{rB#ujUh6~m639E#Qu9C zVan&yyv&rhqeG95v{HYFt5_1jm<3I$e_=;-g907y?s;AZ)Yf$O<&Blu5RwoQ_$`>QcD1jjHbuRr9Kr`f;WWT05aCgDy=b_gpd; zb{}}h|25elD`e$ktG<%q2}VD!hlmOuOd{;u@fCOX z5?3zAs*xR_qq2=U=KMGHr}Y-Bj;V}^#0-;_L-jR@S&ii)o7Kw4BqwT%WBDZNXnar| z=rEjwoS9HLkloU^U|KtZ$Q=}wJJV)wTfrA}`x?|WC_#XB!r2zhYRPBc^7&lzQrjV9 zEc|uN?QGPc`|FvgGdH{I!_p$Lx4#p?HLiIr>w4Y9KW(i7aSzeNd8|g&dhh7F){u;? z$yFa!*K#R+W!P)6AqRs$m5s$w3E`6(2}X1H>FQH)Rdy|dEDiSi&x68dmbS!BTGrd6 zDrc!GeI|vacN*_@ZsE<&d5PD4nVOzb`M)Mm*-Z)f1u(Aewzh|(Haz#gtjxY^eKI_E z^g&fJVl;aMv3!}wKK0`7EMr|gY*tKJl-|&iX^Lynk5V|c-gLC~e%KtQ&3ZoOi$-H~ z_|d|Bj_6vOzldKI@}ZFjeoP`u&@q%=O}X z={2+Kqf9RmPeaIhm~Ik*pa?N{$>)T7n|^&__Oydh_<%A5xuOG zOxvR$mMX-Pd_Pz-$Jeq(1c{wi3ChD9IKIYXIKY)7B~P((rZ~$_*^1wiPy*jvN?wX; zu3d>*Fu!ebRz!LU|u@T&_|{M_+ar(tb|wKecOKSD-`@8arOb$34( zJGj0Dbr!8~#Ut_>`AL!jQr!0AASun`fw5-@=Cf;oaxNw2adUqhP&+OM>+24}n2Z+n z8bZ;n>uShC)a=7E5b4eZYFh-g(8d{;Rdg}w*Y6vzYgiv8u8@2@&TKkjWSJGHmrr3As_F;5P5AV$t`H{j-$s z7JJQ&d-pHgr%Y~#6e2+KEka>@G@ykp!E>u;o(e)yd{{Wa{ zP;zVYd;ZiX&QBMPuywgekfC2py_as8gYF^SG%yV|E|`>X^=o~uu6dE)Me03depqc(<~`yW6m#LF zYgnKf($mkRIylv?zyNN9K^!%dCE2`~UwOMy+v-LtOz~WWeQ`}PmG0>K1Y>*J7)!p( z@_&ZHyDxss$S!~uWX^c^TEctZ&{s_srU}T?`fz=amT;>&kHiNiikt(p4+sMXO5V$& zx5(FRY9n=O6Wtmtu3td94TtOVZ6111!q%lfbEvxk!Tolx{B}vxJOi={U3aqG>ns>n z>8B+vAfBVHjP9D9hgpXm++tEw>u1S5>2T~L&wqf`Rrylj^SRY5Xh zE&cRhWmLva%y3L~D5IT=UeSL?l}+2*8IF*>M=84WLDT}jI97I|)e;Rngg0(Bf+m)C zFN(K-Q@{{z$zK0?Lr*lM=H`x*WaRpV^LF_$o1>G3=7lg0H~MaODHU^JbUc=0S1$E| z=Km*oHghh+m5;O?k~vGfFyy5q%Y-;av=B52@smE^Vyc#W?YFJ79%qH`bXS>+BPowp z@7SE#S0tyL7T%rr*y~f?cO~0iBuc;Tq`ND;FeuA&1m@VX)M{<4ioEihHNv&dA?iUc z7Zz6E>nFVjfT}07cK@PpQz{Iw)a%}x4^KT@IOuL`Wqx8WQ+6Y5FJ4P~^YcJvi9@5= z%y*KFc=mcq9CCeL!dzL2RWweQr+e{A(}i;4qSGna9zLy1&iZ;w8KU0r=q3F2;F@KP zTXi;aFdH`}=$#Zax2fl#(M#V_*qXAOsV!Om3<=J4{p(6EDfhB7>dgAIvK;)rjm4kF z2#m`@LG<6i@Nm^_w1J7|dAOkJcfe8&-u~7L{2FzjDzTvOut3rid99{h%-Y1Cw3_RH zWGUBnw)FFhwm8JVw$9jmGWoKxmh+vr3H9%Ck&x(oNU=}_M+ZD6uhOtnM!WJQu7)mW z?+9S>xz^=ojXu6xn){+&{*j1Cnz4@JyCU|RnYN-VNm!|l<}9*=_Vy;hlgH;M*^;|;r#v$}Kk0aB zUgVmxa!|U6$R<4{;q7dbM6FJPeo;3WJ2x0nvQ|a9HzmsXvJ*R2))#pQp6J`9x8~ z5{7?KXOqUgGxfM1>ncV}pbA0N29ubd$PsCqW1R31puX%_@|}!Nzd%2I8PH0SBXdXw&vm> z!v7;athMm2GzBF50#^xS)`zKs_F1xZc_!}ccGSuwUjZ{xfnI>146%GwkgfZmWAobS zpFt7;*3LxJS%TunZz_8vCm!t9ei%V^W$o;fCy@`x0xKZMt=XsbkL&|J(fJHMt^EK6 z%B;wU+fNJ}i*4DxcMkyrI>+?~X#xIxO+33rf9d=Ft4R9WlXHM`GH9X$(1c4Qht8Y@ z6@~WjNbCc8O|B&z0yX_uH5Hync3K(I_uj+CwKw1EHXwwtzogX=%^F6RR z`kq*$-Hpqj-M1Wi!j}_6*ZT$-jPdW@^vVW-d@rat9$~=5J218f%LxZfOLNsgS`xdR zUKW&`^EZoJ&msQTX5Y~iOX1dTNB$j{QfY{coCJj(x~0Tbo^P z$R-^M1^wG}6HuN4Qp{s>7x^U4?k-I6)0Ua45*Rx~Brtim734wT^e&F!b`U5qV>dly z+tPEpeP4R>NW?ga6nE%9OZ}t@eEm1{$7F37ytO+CE{5A?kkO)|OXQx^ zWN0_J0nW*ZyB;v$YZ_YCn>m=E8jh;)f3n*-@Es$g{>k=G;P!p!KB)UI2s#$NWR&E)T-b)?&En$1NSaNRz)?!H!A3~2xZSMhfm+I>yb)5K^HF(T2>?=Q;-!%E z^ou~P{oLQY5}H7|ee;S4;zyos>=Zz)PP_)gEh*i3RyOgd+ zE%<_x{%mH^+x}fQpp^?oeLRYFiu=bnLu8e+l2Vmy_(l=6kw;M*z^xCjmznn_Lo~~` zXY2$`5r{{cU7PTYNt!MwJ~QR0KLmc?N$B!0XAn zz@e>|lsu0(9&}Y=wqCeow*n;`)O0=OHSffe&>x@JM}E55lrs#XIZGtKE!-_8iWl%m z`8?d zHL07Dcloi7$^0UK6SR$M00*ms42}afa)?g?vYz|q6ywEnd-6k|njn!Z%Nrm)8_Z)5 zIop+PGtDzO{=B)Nm_80CuXQsbpd_4cxo_8a=yIWaE;q1BWHOI^J3EHv)s*6;88w9g zum!l11b>j!NuY6)asf3A`%FaIiZ~L}S*zSLHP|S}(2bbdU6d4UPzgY3_O>TKVFjj; zSvN__Ot2XFMetBOW4};K7yN5kaKOd!Ynq_P3{(EtHZQvuV{!SxW=QA#aDVakJX|IF zq(PbgBM8?t;=<49^7(xemB5*ZbYJ8h@Rwzx!&7ROP*cwTz$fF_@r*007@*rW;#W?K zE=Fb+H3rh#4VRO96Th&bm~03Q`;ttDX;f_$-YcK#p~w6a$QO7BC>L&4^s_y_YH^}j zlh_$qU(Jcy%5!aO)r02IrHvh};n9)@EPzZr4bN`UltUX;1zq93(mhkNX~Sb$Va}T#HOIbB^*~$N zd9?2D)~k@h8W2cZei7^{8e1cqj+%9Tpp?XT6~?1m?+9;X{Gd^`x$CTG3j1|9O9JF{ z*#JP>DqeaziFp1)<|QjXW&<|!aQ{M(XNXT+9UX;tehI6nup#R{ZVB5|e8ATPz_@{= z{}%8@fkj){2e?eH`Wgq8MM}1IMfl3?@kWk_^CKDpM!y!iV{i9E zu}gpeTAtrO;S@!0T%OrT8REKu^sJ=*WP8X7B$4VTykkuk7hhv+1M3b@(HlpzDYBh3S9Dqwo!RwJf*1Y8f) zmi`N{`M(Pf?SC{HU^o9aAg}$Oo&ZMb|4lVLg%LZg0I4+oHF?VJ7ME!0HXaWA zZ~&lHmOl!}DV@ajIy(jPYCQ*7MNrZxza{QS;0QpcOfFstK>teW*_^MA?XmzN`pyV| zmcNi7lNWi?b3nrVoM+23AkaiVq?e*_s41T@USqPpJqT6-oF8A%);;7W{)ugwSW?;s zBJD0OlVJ0`{JRCKmmHJZt>6Efll zMP|UZLn`)u{Wm9X)6*7U%MhPSU=ev0vHCm`vTFmpfW^GwcE!#O&>0|I|M&-db;k7o z2ylm`39EV;BHn|91z_8*940CG0+5TPg``@&P?n1gIacnXoq(9%?qqJzT(|S4w%4M7 zK~B^IN{FqCJ7#0J&A>M&<>WpIAbK%kipxJ#D}IVNq4$86E4L?3a9aUTgPfFvx#mfR z;_P|7#eFkwJM{!Banwu(%J%R~%4i*VT}AOo|1 z&jDINL{cxp&q*CW9+>z9)MGU#KS6Ts^rlc&&WFluKSR2{O5d5tYn$Z)7Di1j5#1~n zY$f2Ar7J8{H8)}iPOgQiPxQ^-`1?q20hbyOuw%8kUcs&KGT{f!0ch=AD_a%ZfF!k; zi01)`FF=5&S{S3h*B(Zn4Ox+cbENAPB|x=n^}R;$_5EJDuEA58pq?P*JvjwIR8=B~ zTVQ`(^K4_*$E6pBTTyx(Z?YgLw(D;r1t&pf|Jw0Mn{d`+taZnFBtLx?3PcZ;_`QuW z+*V3j)LDMxRL3}aRRW|Hg$B_08<=T32DFCdH2b@nL%mAdV<(>0{Xb}gdzL)|wkOIW zr%VEVP4(?v5jTYC=WbTP#Wlxc^g$qDXS*dVXCN;LcveoI+U_jCjRkZtddFTXVYl3Y zU6htm8h&!5DV@|9ZOA1Xa;qZ8G+5(FRCSPa859Onw5uY>~7w0bZ7KaE6d z=Drchg=rf^&dx;c%-cyh&XseT?Qj!P6DJP+2jlR-#0fTlEclWbF(xkvn&{JK40dmH z_QojM??Q)FeGCb8;g%Ag^MEAy@~B!Gyjmv6ETKlK!d^hu4;zAEb~M{=fGFo1w+0wN z-&WT5fwXK;WQj8eUI6O3!AT`BAZ`po6IEAEwcP|!9svMq$f-ZwZH6IoAdpBod%GyP zx$;PpwlAslgI&d({$7yQ9ulQS2{x{e(*^+TOqQk}9(Cmmbd~c1=c73+Z>YW(9G4sN z`}2`R7gqX)9q!U|K9FAV^8iJGSI^DzF)v;m5(X_#UzlXK3ZW&YHcZbropRp4vuVhJ z4DHsGsqgh9QB)_hx~_pJ)+0hDhIS)CPa zvJ6xEFIY+5je-a^lHNw7kH2D#<1hl#Adpk3z!=HdyIv_jT9S8TGH7M5(?_;R0T)pq z@OKwXuCsPQ3)IBbaK}tQr%;ZK&3wzqJyLguvVh~bY+5Js|MM%!;@Pt`X>JRAH>9yJ z0tEZ`FGwh`i-BVQ;&cBW1iSxPAlLs-*a_)!G%pBLTRQ!O?`$lP050g-(ml(&i7(j< z%YVzTk`fX;+ku>`z}BV@)ck|wg~b9@(yX_MW2TCteTqIdD}-vk-nsc2lkAJN@L2Oxk0M`8+k`6R@6wqs|qaR5MalP3f7SnFO*#Nk9ax;5lXGB#{}#yb0r24{)lEzXX#Nz5l)NR;!~@hM;{a-#ux{7hnVNV2 z)TAvgE=JUlZ#MzMYNIo8TXs7O^gaA$Aj3e?A|mR?Zsm=HiH`>+OeVIsw>6D`KzE?T z4-2frhnkYEz(tzi0G@eMr8UQZ_kz|b+zuPJ!(2k|atjj~F&>T_ZuP`Oajf*)s;VlS zIPmlhYEpqf+1fkwJtkK{hNnp!5a1{wbe$g*JGCNCV?*`!ET5_3v~22n?dG+hIZiv` zvM#!c=G!=#66^r#j&7!b1KM17{qqM-LwK>qlmC(pii?CZ%8rZxE(Ja@!IwAW(G)a(> zToE>En2G7dR=Y-JVdg5TOO4%Yvl6{-yEfMqKAy+%{c5MY zxp{eLHHc88FjL+aj?BxsbciJPnuRw~fJay~bF_8!P{E~9i zva%d1h9<{6cBm`dMtwm@EEX(1arrkCEmg1ezu@UU^!eZSLSU_6J{ENE2!ubquLHG7iq)FcLa7Y$8tR}y*|!OLKp zI(X8M)QJwyM%<8Q-_E(4R4LfXdFrl+|a74v?qTDhWhkPeZft*_JI5 zb#7UI4H*21zNy!bd@FVkNRJ{@mb_yLr;A2<#7Mi}ZRcACw8H0kHhv<*R0~=r{Z+d= z7d#g3bT?4@=% Date: Sat, 5 Apr 2025 23:21:13 +0900 Subject: [PATCH 13/15] add oven icon --- assets/icons/oven.png | Bin 0 -> 29423 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/icons/oven.png diff --git a/assets/icons/oven.png b/assets/icons/oven.png new file mode 100644 index 0000000000000000000000000000000000000000..61a109463597ad46bcdb04155de7ff1883497fe1 GIT binary patch literal 29423 zcmeFZXH-*P@HTn?0R<5YMWxvh5F(<|n}{d~C=gIeq9D?QpmY+7BA_B50wU5;KthRh zDM=_QN()sw2}p+!N=QNi$vyo3@BR4RPxpSfYrR>Em6d(YE@$@4GqY!&!|OX{MnVF| z1pojLx^?rq1px4n0ASDcy?kKHrVvsP{MzSz^S%!N2p-w};{raV9|aq^d@PKv0i|7% z3*e7EF8ZeW08kb$xc!h90G_?PbzR>okZXBo-@A;tAemsDf`IHEJ)R%UqOPyf&Uj@z zCsa$uWT$(`y?%5nx$G=a)5&=44D>a5s1BO?8l_J7d7z&+)+nQZ@AwGWZly9ad=d ziw6LXS3r=r^Nsw?w;0>o+c@x}?d0TC&r_!d$f{b9x?a%YmIs8LxmXdy?XLkKd}T;m zRh3?U|9qJD4s(;mt)U0F{LD~$>gYn7G8q0Ro$Lw1*aLI1AG(RW>*LL8>O}tcn56!7y!I87w+ijKp7t_klN#2rvz=NFs8d0#Ha%R*5F`)Gq;+954h;pO-)TA z4FMpYQnQQSReJdPQZ2bm4>m5mNt88bThONZxWEnwxU~@8?n?TNO)?NT0U88?`+qJdKRp7SZ_#TRhzLzm}(ndPov%esRP06=?!ZBJ`N?~z6~V>q0M1x0hAmC@K3F0aO| z7Hhe~2ZaB!l23+P@fraI579&b=)MT`-s64zGgAlvI&VQ&v-|nDkH3TBDf>vK`S~tW z(|`KbMiTz0C1AClF8Y$UsAF4EQG6cpWjzDR>DY!RErDbXWb~U75InFo*toE~`EU5j zMXY^bI->K_K-JR3Dyi0kbdSa7u0FHR|k?6hWl-^$YpbFvfVB;J-E~PxO)yyO&LDjzgir~LAcj&Y8AOEDL zrjnNiF?61ymwUWFkf;A73Ohsm`I4^JP2NskDag|7PL}8j?u~V+;|gi@MED%3dsTUU zeL5i1p$vce&BK$cvn~iXv92vp z&N%QWzQ42QKESyx)@XVia*`|E`Buv*`Q$bOE?)X|u?CJiA>e~l!`z&U)8g{NM-3m1 z`~ov)j;;+dB-E>v<{^IksAODI&gA?OB|c|zKw0a(^yjL%6qAFxbUJk|K2#ywa)p@? z@FVu@{@~6%l)^$^A+2Nw9`n}a4lDBUk6#8MNu_=}!yzL?tA`fs`LNL7l9 znN+<0(GD+TqZ@<2=7$1{+hDX!#gLmnHT@e(#D26tE?mtJ(|P_a$J|&mCy^d$F zUXLF?#)gn)PKQ@qxDSL~6eP*)KmXBc!E7M2-z!vZfp25TBYKK4t>9OrLB4twCx?8b znp-poW0H;kDy3a(p5u(#EV6BF52`cUVm$3cawIK=OmZM01c&odDVqVht4@&|wyoJ5 zVJoLzg6NdOM5@D?n#L!$Kh(g*yCb{^XcF>;#jZF&4Ac359XfR9gq!f1j5bv~MeD|e z$T}yC)LTng>&JVpq2FSNz60-7bDRsK!r1tbtz0}tWd8yDcU6|A#^LVbH6fcvL=T(4 zwx0K!!%H_V^)?aM}An|`MzWn`t6%)wz+OS{;Dte z8U#goJ)(nhg`(?VwdASDV&Mk5kw?KHkv|rK?-ZmOmWIDAEZVwsJL-=C+QFt(wmbbp zLqnz6R-pMj;?^+S*hHW_dOmDKrgfdhG#m^{dcjCOf>4+dnoq&47p$%GCf9wAhQB(E z!5!^ZTB>+gbJA{E1KxusnQPbRvQOEC+ZWGh`Rzys&HNnOL)lPtQC^QG1{Hnq4ZfCV z5%d6b5dZWGsk|2+K6-S0Chgiy)ilt2AmT#A!tw2`xy%kvhM9$PC`Se9j?7rPHBii< z<>?keYu=pM8Fx5}>l?hr$RCfBQV;9_@HT?J{o`;Qc19qB!+1Qtnt>~Tjc_soH@n&P zQIs9v;FPRpoK8ZEEImu#_*$}Dr%uM-a zx}^ZoZOB$z_8k1RcscKH*cML1Z`+mpDMN=6j7!~7kMs@>M=l>e+<4!j%GU2`_8jP^ zAV2ct&C!h8kD(Y?qP#vKjPj?hrS*+ivw5bLUyqN%m80=fX*$R?e9aMA!gWZ!6~j#M zT_HMs5KVU!Lr=!|?b$b}C%uoPH^Wty9f5EPk1VSxiT0 zJPP$%$(_qDDEMrnD2B5nnGMFn?8CL-i+eS;r|3!}8t=XwWdAtadYjuf5jY@XTens` z=norR8ZuCvGr6Uj9TT~l7iY^e@x&`s>5U@@+hRh*h2!^<{;|v?k$HbRtspN8v?mvq zfOq`dYIp7}d@cKFs{{{Pt8IQs;RQR3;5hR+x^UkqRUpw<(@0$z1HZ0~)aP>9Xy&CrV`A^_g_a=@4@?_5CE}_irK11<|UyypO zzla9;H|HW(BOqEnJsW)(;i<}l`-(4fNuK}W`>!@B*5--Aw2-U7WGe`%w^=8u9$r)b zGU;RjMX5f)X_SVxD=J@9lQeuk8~jCkQrs9WESS(}e5CPt^A=MTSG8>2k~{(SNuyS<{{3-2AT1$%U&_V{X}4b(6L;zsvRT~j6>5v5!1c{yk9YPRi>0kZ zA+rXD?_7$udv&SXed6TE+nyhVIm2+iJGb4Qm-KwD;fs#?x9EY88>>#QJQy@f{aIjt z@6{gb_n_$8p4k$XK#7l*67PPM=#Er*2C1Ypw#)0?x#PxoRMGOQw>rJO`bq4mpuDcN zM+-|EUq1f{7d;iu6PYlgv@{-g^;w5mkC&c#hMFy%z%gZ=$nmz|zk^MbS%f|pR|y>! zjU4%qD0V6y_iSxB##&4sussR(y$i9D*51A*xvMsbP2!f765TBjGWIJswYSN}Lr_fb zX@5Q6-?-Tkdd9K_gIXRByD)-V{c{=uuiUFVe!WOXPjfFx?__^bXhB1TxNm>$p?H z3~3UwNk!=OT_y#yPLO${9lr($Y3XdWrIiM_-Cf_JXdjb3m%<5wCwZzbxRwWpt;jC( z^4Hx4_=6`L2Pna+cFtHXC~x$XZ86gUvzS)O>!#-PdGuK|tmgAv%}jsE3*8#xb>HkF zaIfaHH^! zz6TxEQw1%~+$1?mkY^g4QZU&Q&TxdTrYw#%@L)f~WZVBZ+w)l3`KydR+ttxvC^m9% zhkzFW#=&jUE`iO+j$0|&RIr+nn|zm{O^~Fxe_X+RMMmeAyqeT~m_N!V!XDb0VLe(L zuRg)mxzx;j$r84-M6iSN3~#m!g?k-pe4c5I+1X}zwBr+Qe;O8_C{oQX6o6rPEhRLl z`72~!Aa>?_--Fy>)vS^3991l8 ze(Gn%jk@qIn-3wAn__lLAyQl#`r!T6ShQz_YNlYDH&5`?(9egXowC%-%Dr172~LR6 zmE}TbIDS#C1-D9dsb3|eh@CVA=lNg#$bbI)jd;|9(6g)}g1vCen0M`?tPr`vL{|{j zKaGe_45}W)lBQqBXg-gVOx+)D1{z=H=17l|xVEYv?RKR>5C4(ct(Oxvh(qhm$An8< zAHx{~h}v4&>Y4PCKE*0}V>?&38@F0_g;Fv5%is2`tzp-cQ^Myyb>XbVgExPd0l`LC z!`~I2U&FH?p6x-CNb}1LiY^0-Wxp#5E5r!`>Ot#PfbS>Z0QHN_l9h)`K^l=BDA&0n zNZ1gX_suYSKDftwUQV3vSEcJvm*H<-x#FvJigRtRYvzLO%$OBlFoRo*impIq+U^Jo z3o(dGX{n(&`_AS62DqJ}8@(t@{UAsvEwvf&OgXh8n3b9u+Q-opl$__|lAOPV87K@7 zSf5pq>lJdv>OYY+1D_VQwkTlFmxi+Es zv9YlaBswGrR}i-Uhny1 zeSP9^imf`Q{;nXaImOP;e6X<{Q+v{8^w})r-pkwh`SlgAxRO$U1KnR>GPf_o3!L;= zXQ@$I7e3|*JhOfE#MiDXUxD~O##4P$gKtss2~fG~D{iP3=?cD4`?xpzkegkX2fy$I z7I`oZv6#Bi%r#;P@ViEw5<182+CQC;B3K5I%>c_vAg(<~9Fz&_R#43j*%1%JMuCsC&*Se~ z7}Y*=)|lFiTMfn!uD%-TSS^b^HLm&DI9KbpjoAIK&FNTr( z3QvDc@Kl!*3GlG%iX3eG0(0Tg)7+hHL&A(-ZlE+hQaIiol~}mWgFUTy4aU&c ztd!51dgX|RbtVmsztEF&p;6LS%gUTs2Y<2hm@OLR8 zlLme`Yi>2_2ZibE$ujd-+#O89pD22OqgoZM}+v{p^6boATV zVAC4Vki5E<8VI5(ssX13i;G{E*w|CYhUz8+69q?~b*1azifhaV%R6lxM*FMN%QnTs zLcAKhJOJMa(2goWh}@*nHeYxx3(7dCz>xTjJb_OYh#b|tribFyIdn(aJLTR&%hR~k zpCbg!#c-kd!@CPunB8b@QeT*@5YNvU>|1EME^*Z%q{nB3kW=F@6qQMJl+kLd--g}cP^dDLNZS$_+0ctKI{z{_#tjSO zHUBg&9{SMe4muQ5QlVDJ6!HZzPvqL&BGN5Qz9R!5tpBUBgNA0G5G#6tAzHmXCJaKs zWD2fk8FbRju+Y8cNc@s#lQK$Z{wf%sz5IzLrIj{R&nf5$?v6bC!P5_+h4}7uDtziI zoELv8DmtdD+uw0LIUm&axa_jEmXU-!4c&{ba^>m-3Yy&bsK{;1#_y9xi2 zMOBg8Soy&61+>TK^I{q=%rexgXsQT^jF7#N4Zu5H~mkbF70(TDC z_K05&<_XTR+QESmr*`M1@vryvGkY7-(Pw{CJTAyr8Fm`0R_-q3(VQ` z&QDoW`=e^t)~6~TD&1T8uVcIno)xWR`|36;2cnf(wAaF@dt>;DcOfY3r5v8U_dut3 z=Vqbk&TNf?R^WNlX6)+QoH&}6}4mUw1!4LEoFPq9-mBSJ}a;b1)JWOP7@c~y72 z%gztrQZNH2R)8XxsvhRQ{%*K`GGu2*`TI@h_E^~@f}>zUp~O7s0!5Wx7U&XwqpSSF z6g}~^YjvJn-+Dpue(SZ`U2eYF>g|&aH!YugsP-3D`OZ%PnO<5o2*s|uPa4;;OL3!9 zQAkZ+!{XG^j?kc2)ehfpAy82&`=hp=)7h@$2Q%}z#UJWU z*9oP#sP@+M(*j`UBPqEPf!53zDE722lf{Gtdx8EUct9AxQC&B#S15(u3!bkP^}K$w z$8^&buL0AM;QmeIU1Okosx$YHM^kA? z$OXN>OYB<5_8XHDzt4i>#)9LXAq!F>wG-TONQ;IvjdQ#EBQWTn$@kkq?Yfd5q}Wzl ztlP|K=_<_1)KpN2b!;in>tVgTr0Q%2@$2*tP!}JjJ2&5WFrJ=$|AE$|S^_ciuBa{sEgdr^a%f~&d&%n&Ud%&zGuWj+j{crVF zS5W!_!L4x(k}hT$uE?Y2`VV}`fuNhS(zGr>ymqR#7+^V28mfFnv&O?{DQnaUelXj` zWTomL<@4(*?_5KeDE{^M^%ug#TIc^PDaag`A)>Z5O_XlrQ_55d;s@&@x-xYRk&{ZF z8=Nk37mW9)FiglReO|bjVcQi`M~<30(zu)Syv42NoFK0c52M(iJ zug))2xHyJ}Uj3jjzKuC96_YdBV@rae+bSAO=kg5HDh-ZLL#wer7LGGIwTZ6_vg{`4 zf49e;kVjHVpMyC>0z0fUC-RT4kYrnFNK4CHX;}OHK>K%MM!nx|Mf{z2<_=WfN4jte zD0l+X0CUdgs51t!H7W%Xy{V}SBkhl78$uG@;@#?Mmnjs4`}ey76ASq&ya?3{6Ut=t z^@QwRA6d1 zakh}w?SIQ4+v1AZD(+s9K3A9O(@xQ~mVmKyV_2_A)>7UR4SHS~2skFjj)Q4FyC5h~;Lc(`lv}vh zOvP3|ZK)fo-ZY+EIovC~R(WFhw#%K0Uhk^Q0D&lEcs4vG@jtB$G!O`89cZxE#K}gk zEnMZpw*SS%D3pK8=sJ&o((+xx>_mW=Sp9BJepKO~)8`_O!A1oL@w~64!2d11=%0B` z9cGVIvlpT+Lt%YOa!FZgP)`13=x7u_e?>S}2^sR0wmxP+;tMtxm@eFy9&;-H8}k0z zmg8XK8D6rl;_X3f{|eq)sGn&*y!U@SvZQUI*Ud;$fcf*266aMW zB}hWtYG4u0_c;JoIsk_g;b7rPPkb*4{L#((|K6qjdoE0ZS$<_LElF^EBv>!WMuDkI z>Nq7-mC0g(lZMZ_>GOkMN(URk3QM-&9&d07yYVmh1y;=dx0fEAcmSex@$1^!TJX*h zr_fNH^D>~CU^hz;vBr6a|C_F8ARASg{r}dZHR-)WW=+(4piV>uPz{M)I9yvbb!;2u z7k1W>V3j_+^O{_LZugPwk2LzM4AR+)5U6}Ivf`U|CL3?7O-Iq}$ur)?aV$D#gr{%A zCyV)mX1=mZYj}1`FxV^)9UxY$J8Dyi3O7qPQwJo6B84ku2285T{Ytf1MgJl#0AQ^JLy^G`l#_bzl6wJ4<*4;;oNV;@(x%H zT?;xjl8x!*#GDMDvqihhX!>7>lT<(D%L8aHQ5X8ET8l6^Tfu)4s$Rv=KhImTJH_-lqxQH2ZvLb*21FM_o^Q?r->DO#~^#MYP`{tVK z=dF*U;>BO75wnfYc|u75kT;vTx2xv`IQ$`Gxo841SE%RB@(8L%^7KO+63?-A9PQ0d(MA^Z|J zMh@p2-R2xRnQiqn^A%qwbWUeea8$QeVdN$+YO7az*>~(l{f?nn9iCPI7jNJSFEtTe z6KO`&Z|1w!Sn7;K6BRItqK9fudEJn#)+Jk<+Yg+>@Cf_X2ZJZ7v%>VedHro3l~Y` z;kKcI52%0cTIn`M=P9{r@PpThG%@P`1SPo2{@{sH+J*>D zH>E_02aM?I4H&;-B|PFUx!C}mSS+5IV+@~(7;yh`ZM^yEFBW=Wt99-(lLUFfnO-@e z3Ig+)a0t0}F4Mz=7399ajOT3m$P)p*mAr#&;ZRy;_3fMH(A6ajUZ?HL0Ki_r;;Ws$ zTkJd$TkyZImXFLw`^d0gTE2hQB<<~bw_2~KdNqRv-3JZ;QA7HpJ?Tnd5$7qBy6_+< z)QN+cP_cR){oxQU@xoU+1seu7NEEAaN!t2?py3(~>W7Vo->Bazw?Zd7Tw}ByY0NPs-zy2(wj;(BWQJY^fMCpRIf!i|{TRt9y#K?q84lL1%eO-Z<@gWPJx2g!4Q-l4pMX2^`#gg>qo70Ls&_&?ye@ZL#&VVMI!c&=NOP)1CMBTM#N z(ZG-lxq@=Ebi+8_EZt#;*KI4Vcdd6qNitrXY1{+D zy`*p4ai2mD03t*E!wcCw=n5GEyB_kX2JwhZm3<+48k_}mP9Qzd^*Y+#2JI7IWvDZx+Jfs3h5s6xqlRt#reZr z>D7z6Wtve3CS*F%9g=Z52K3gBWd-Fl-lw~BU3?i^?REu~g}7LSk=eq48+1nmq;OkZB4yc2`JTyPMuaf<*9um|Qpb4EdAE13ScfcxuSG0E)LcN&Y#TpegG)_w& zLgeWz)5yu))rT7U*2wv>j}?Eb<5}oqv+K_5nmqxRk?EmwjQYqL|JofvXplWXCocUURGY6%DN60!$~Nogv3?YuflmxG-gnf$7&7Tv+yj9xIUMN{`w!XVd55O*yVD5Kh|15hfycq(%b( zen*Qm=mxhu|L**+%*VXL(2klBtc*mJiT!dZe-l{$A`l%2h5>)RriUtz$nma0>%;P^ zy}fA;bfYUp(=FWKz+e7um*m0hm~}j1-UEqNe{VFT4-K57Y z0%L=AnP6{J(WsBV=;=~p&8w}}U~yDdG5eozm0wTzgo}WN(6P{mHq-jY*|V;ffbisG z^aN)C!FIN3roRw*5?ujkSI*hw-sOSp+8I3+2}H;7rjgx@o8?NSzzzi`yO) z9j0SH<{027cZU#t4-T>JVE$vC^rZM@lZ%dc5u4G{?sZaTdkG#tsmrPzdAZ?b62n(i zPSRcNK=96-16dq}BU+3R%Js}I)>PliAjNKcGe$ErE(T{znyj*2l5r8*@X^iobE*K*5w;W*FA=|W z1x-4ud@yN*>J)}F3hMxAM-#)UAy@2ziokTRPjfV!UG?>VSKNP~celB9r&o@CTnA|I2sXARWM(d!D$HaZX zsf{8p(CsKG5-bUVvzzja>C)`(J*)3OZvA5U(}aFF-0zrBmr2gpsp{lUKA%{riy|>r zMm~?If(I74R|HJ$X%=UI3uu(+o!%fXnejUGiU;sU%7%+up`Q`D;+9|G7NeO=CPjS^ z2CM#!{T_J{G+=1!T=@xD(OV2o4$YIs4P-B`G)&#>hH4gZ9y;c(3)9Jh0ww_D-N=cm ztps7`A{Tmx5it(;T%;~$95$h}>{U}p!aI~Prx(`OVkqmDLjG=9;6!n{(KHMmH8=yRt z3$)>zn(%3jD)bF#zUJHzJdOYKCDT%()ZvH?cB9;ONL%;GVB$6J;3wa`mRSU;Almf? zM(kj@5pra?Gv>%C9kre_eldFcZ1fGdMMjX&5VuKs zBHAuc*Pej>C&#!d@k5o^pfo|tDO$3wOFQ|B=i7TP-15Ec_5kfe#V-?=q>QZXX+Al#JJGQ>&|aDU`6W3u?smJ}|K;<8hwh zzqnDm7}xF|?}Fd9&|(?!^8j^nrg|=UZ_TdXUfCyb3!t2=h{sYgjemp;_?n$ia9^z= zzHYN05#Ri*Pq*KUkeKq6!3F=Z-uMt2uW7+zd}0(4w_)jl3ms>PSD}+(Bnmd~a~8pm zQeQ5%lEv5#9q0*K8|9g7>D|KUidbh7Vu zOAYQYW}dclw0e5J)t`X2P#Comj>~OOFm|xre-qIcOOWMV)eK!>s+!&fNy7BKB<rxZ|{k?DN?0{{zjhXYQ^B1@p z_&Y#2iHEjiQW{3Aw;a3G6%K*$c`(zqgCL9r$y_xppl4`CV5%DE{D5z7;W15U&XGN< z(%s_8$cVAyXvtW=WXc}0O`0$6+9a~6cJj$+7dDf3%?=(Gl2?p%_p3ht)DX~<-AC#^ z#vRy|SAm1#HxNEEgb14LN2N@DH({EcZXmRTw?P7lOL^b5-#q3B7(YYlypd zxHz4+R~S7D#n(7LPx+bmGrVY`_9T#f#H`a@AFjLuRZZqS7d~fymg&Do`y`pSK)V!) z(e7%WT-u{ou&k|fy!c%O59>wq;YJ@qk5dvMYH1k(i?iab5tj@%Q$qz`7ezVWwq{S_ z{xj`bo1Pcf3cu*37GVDd)oh7*_yWGaCM`py101eM3k#S61bm3T`Nx=qY(KXtwf2Ak zO^6^c|56raC+-VU5bn6{F1%>Nx+(aFuU|;FhT=f%G5Z0TqO1FPfy&VdC))D>hbnUb zqQ<2~kuTHyja3;?uxcEAM1~ec{Ce`;dJq7}^xr2PtQ`gi@tPp^YRxg7ruA8k8}RYLdMCj~=g9Q?MOEOA)q<9{=luA)5dwTjN+c7QIL*h5@*ft=)a5S8vk)Emo`oRo~v?w-OKCsp5-@`say8%E^PW~FI zB{<1?A$p~LQuedPgY&oQJ0Ee`??sHIo(6gO8C2wb(ewj_*3x^8cW-w)F={W?93iTL zUnDF044d<2Je~b*)qRu;+gMv3%7A9u8nKr=KMf=P0+wFqtOobMy77NYN&x3+g0Q{{g)mW`|C76BnE>c&Fw^r zp-HN6{|m1C1C&b^T$G2&N7>(YNaKmL5CZ7g=8I1gGWUL<1Xe$INYrXv&m)Bp9gtJ9 zA1I4Py8}R^M7y=rV-2Q^Trh)P=T4U)d#vQXYcLvf-~NwfXPh8HLPR zdEfs+>5dZdb&3_9>%)?GfR+@8o`w_u9AT0rozTp{qXv(x^++7pgZL)ipgn7Zc~hZF zT>ul(tJ12zEScp$Fx08}kChape_!j16?N+LqiA zaQVQc$6y$%57s_-NvPE>_Os40u@u&?e%v z3bHibvSLFK^LL zbF5+QqdX(1_XmT>nn>1ndR*Q{Uxw<6fwUpm37#6xWQ1+c=;vw*t2}GJbytq;WncR? zP|cnW!GgliR;gUB>HP(}4sYXTOscdrt%JdRYTELSk|tNf19>#bGeI6qf!O>7{kO*Z z<-=gj{oV+zsz6D@y;!v7YdHQ-Vd`^6hm-1__C!7m)CMk^lm@^qCXeD9Ft)J-Ueh8d zzAAIBxdI-f{*^Gu_rR@P-K+S}g6pM;3qnq;_tw<2ot||qq$}=wR=LsEXyHAkX~Wr@ zS`Z6Stt#7%$8KQ_7(pOtZL6Th-4Oq>KUl}F6|?6IcOaM01bb$j_CggAx@oE(`jran z7~Jz9XhcfDvi*v9-fj-2Mw=4Z%3;s4Lj;$?)|)>(c*@xt zMZCtgDq38)xS1ZjXZ6MLSBJP7_JP6Ii*4mYJLw{zKjAvQ@w=%#SL#64vDX+KjER>V zXHf#-;W4NW(X8L7sm$~NyJXAP=+1|e&ROyAJm@T<=rFD&-4~c(;byn*hu^3wy29Kr z_Z0f@VT8@uNYoH02-q%PHFe+)%z?gK<%6=U`L}#Qi!Q_e;JOUOyAV2ffmjpEIy<*m zHu(aoC=@~jQSflswndNuqhpi)C_Zc7S0eyY?!I}i`=bu)!+LSC;*i^_Z7|TCemRd7 z#$qa(?oxs+!wZzni`jqFl!JYeOhNF#{!8SF+2#HyCql#9uf9`MR6E+h*Ig&l9JVky z`mZMCSbm?*EMd7;pW)TSF5*1Bo#KjwgZ`bUY7de#s7aUKmE10w=fiNdD{I)tzErwNfqB%XXV_3 z^XhU*UbrAFYtN%^PW1&JxG=*LVD^(m`54#vZvzp`PM{q4C62o)i4@-C7dMG$w(!$D zCY9bPJtwAQ)=3?dpQ$7)B#_s(MRg^PK(_I@zxO*h)mk;i6d&&D&wba{{ibwN@_Uli z8hegYW4T5T-Cj1F)U4eoQCXv~oBl9<*B87nF?r5fU6>p(V640y{EL@`O>Fm^N2k_s zP#tC{wFl~Zyw!-?h1sg$8S<2jDQzC1RkA7hwMYyXHfuGerCdKf8cHp#SQFHJdhS6U zwsPk4Q%1S)^`0-Q+97=e{tF<-Z?3Q->p-xPhB)hYg>0_tGK)`XMqDTGTs0iGjh&#> zde&LXMJLm?lXdNiqQng~ylyk{?}Bj~REE_ZsJBmxHcSzfFU~jQEtzX{)CnH68VmY& z`|{!#>?wJ^xS>);3nVZ2RgCH^e^>r=DqQ^UeXev1@MI>#>YQ_=-KLnct0)rRlRB4X z|DC3I;ofI7Bbi6Pz3;tFEg-H#f|-HkTWd8xsbsul_kJ$PF3VIo!kV?=Gf)lJGWfIN zVIP_UM(7SNBll$Qh|xl7sLD6cYvy5X)(X}zNHnNh9<8xLalDreKrYMVPlV*c@ZwW} z@u*U+l=TEFtTX}}oI#5l6*iOpqSB01d?`q*1j$|^Hv~u!oe|{R1p#buV4(b86AZ|iMVQy+y( zL6LCM9(=6kf_>0ZOmL0!I^6Di}n3k#hxJZo8zMonn_P9za+r6 zoSIcV!4sdYA>1PZ9a0qGc<-ZpX6r#E6i>=~+ZM}y_8+ex<#I!z9uk9aNuBa z!L-vow}o^{p-e5Dkx$;U>NqNXIUjNPe4JL4_oT$V+sEJ1K*hYhjpwYrE(Lu}VOwS> z0sak=F8T3TZLYOnrc9VeaZ>6M<#nNE=-KQed@q{O)^jo#D|yWq&P8!ggx@%yd`Vo3 z_j(1Dh;lr;kJuP#F^>xxwWs}tnH4WTTBna)bwDm_56QqoP!}`DbPuu)Z1Ve#ZqGxj z4(d?nWt~WQy05)H1+fUNR8w70O@GV5mNNXq{R53#(18s9%@jta%E3Z4Cco^Wes@UL8e-P@UW7|v~mq+hIzEltHPB7O~X z7MiNfZo<|6X<}c3L~%i{Y{axqYl5QZ;}&zinS^HgAcq_($S{Z|FF zxlNugGt2yk?d{DXXR-U;=3ez(5gb_b2kSDeZwI;ZT#zwOs=0rF!!*vXv$ zGjRA$1_UAL(4LfS8b774B~4r{7iu^z$RKHOR8QL z7&*_b*0wR$#yv~k7F2H(DzI-^Mc443iO$p#YX$f9lSY2W7atO;2pQNLRI$wClGou` z_gSpi$e+`Zds2%`&&2JdRHY{hatFRn9~G7kAZXKS0-O&~CtNKQeG9_V(c@B?l9|_b z?1L+n-xe6}P-k=t);kTwY=4K5{vlqM6@ADweTN<|j2!=Vg@kH8?`wnh%3^DV9d1Fg zq5HKq>=4YV1u49wisG_(wEvMtldl|_?hrI&IYhVvs!-3Ae`@2OcCoCVWyOE>=h!FB zy2EwiJCchp*ZT7(RI4EJ6&QPFNQGg<;_CH|Ck(mP*r&JTUUG)oux<)$zpp7m0&|;w&@xMp2LI`Ul93xOACci6XxhR4~__-4Rx^ z=J+-LDiT&3efo$H#iU@&!encCsbyGcOgwbDHgU}czm>i-q30m?Rywoz$L!iOt7f|N zV!Wkga=6yV42E}y!=|bS#zS2;evh}~Dh)#Ef-S?A2hGzN85s#aa_zX~DbJNL31tiTQ*1=a?zQ62uXRqP|FP)pf zs>k7de{D@PmZKIDCcm?)Q->N#hx)pOWtL(vI!fU@7gB^Yf%bQ35Y4{X7j#)q5jiX9 z^L3ZDk8zEFoO)nBT$V2UD0y|tIy#IsIXRMbD17D!NR`o;25qIV%1zvqsgkEF0mL5K zZ9G$z%c&q9SL{y$ooip#zVKhWl`*NLxU;NIj7WiPI{QM`4xejWku0DWop)=}a7Z|l z7NWb}{{ZNg1UWa^g25rW-@z(m$?hC=*@N-tDku`!eqC{3_2j+p6Pw_%2G6U(x7>4T zC=%V9r-73zo`!du-_YX%7JKX6um-)rp#l zO9$!Jx#cRk92UW*ysB*Lo+y~XLeRHSD6e@bc<71WiYBQbABj5OhZTQ}$HF`Ltc^Fz zGXD9*@06I+g{-7C#Boa|_`gJ(ttYfggNb6Qs|X*b~ecFBTK z`U@RhZWC7cJRt4pn>K@MfjYawxUkrt3RwTPe~T(RUUvGp?8~{NT@KVc6(2B_Hephg z4r%$}ZKWeI4Th><^XUQGnYwZX+axFq;*r;}iNiWC3wLnGWR3qS458v zOTLC;eV4Frch}l!phm-bOtKV2ZosQzxlnAC|5>I3jl9Ftqd)^wTYeEWVL<_B9Rn)8 zh`v@M_e~27|C=#nb1i3H)STAs$R%>?ELsNPcXV_NwP{)8#aYMgk^<(HKl4vwYoV7j8QA9_;Ee*TAopq(*^^j_zutMDjdQ&2jR_+ zH_$L)E}Lh=gtIlHyf_is1FaJQbW~M&5m;ST+N>UM*V2L)Zd(Lr?W*SQvVJf2pMX%8 z9&~`Vu779F_p?PGI0!i2a4-MwT9IbXAm{rzop+J{>Je#$5p|n!6Rv zs%Rj@?HQ9Kj0y^P=fSNuJp`Fx-!=eqpR)rl|KPZ#*NnXAfFFhTiL*e^2Xu$rYJTgM z;zA*>R^*(&bxvQa33QEmvzMZ(VIR^*;h!E{(%;4n%1}=P%)Yaf!LI3zft7=vVv**) zRtAI^Y65gi(4?0!+I3qju5RrQ>L;VGVl*UlLt37@LPu1+jKK=yG#I$6_jh%V8H<8- zQdf{o@oZk(PS~h^d*}+81(pi+Hb6<`)D&xqk}qkfNq{9H@LxlGE8lJO-M*KpD-9A8 zL3W7o31|~ohfY2lZg8NAwY&nJ*TIVXz5C!p-qGaQm{d9KDNF@N`?uQ>uNHW}vOP<3 z2qY6Wf+UfX(KzPzZ1FQ~$r9rM3I_M>ELe_CE`W$WoA2+?+n$pp9>#BXQLZcKaQgqM zq3SkI2m{4$%M@&Wjuct{L<`M@W@f2hO4iQ*_uEI7XI>kew0}3%MGOu0K!IxA^OpF3 zwfE)WRDa*U?<3Mkg_I#a4Tw;gXQfhz%$bXic{s{gj^m`_)2C3GGAm>XnaglcA!N=x zC$r-m&M{ASz4g8K@89#>`@7F`pXc^ZvET3g-g~dL*IIk+*Lv0T#VaFu7gBEfwb1cb z$+G!j&TP)i^_jE(@H|-hTYfz}a`Z>*6!H*VjR?W+8%cl3KP3Z9S^^;qQj3_)+4|;6 zXh-w(4p&SEkDN=)c}A9Bxy*%MxQ(px6I7Z~4&f(ht{b!cFd)Rwi3@)iB4UJ}OkJ8>&^vJVZC7noYqA&q5lFnc=WnHM(u zpv|s@I&Kc-khRJ<-T7BuaQSk*a4yFWOwY=uYJesA?H0mY(e{n{)T+j~@Fo%n2ujSu zALAa>owKn^{G0OMedQBHQ@y7c=7%=wug6Ab&?Bq)V-fRqk$Ma~kT#C>p4UKD+u0G? z3#ejVZH_g*h)WQCO7UA}*6bW)Cu|%qy{});-YaCt_)<%7m{vd(gX^;Pq2T&iA?>IK zDNCjv-Y3V~trl-;b9b}eV%`UkhCb1R=OJb5PPh@rQyArYjc@#! zKBq9m#fN4Ler4Rcu}SfL^k}ry3SbSbe$$+o^4W3c{Q3Akn|Jy=pWI}x1!jVQ;_^!` zUoX@u`+HmJcQ~S{b>q@QcwRe7sc?2V9mQ5e;)U0=W|=1Sy@n*YNiX@{qjn16Rq9nZ zPg;4Ny6ZcDr{lF9<&?br#2qP=U4`YpTAt70W)=dog~!I7jae`YzpJrjM@g?0J3kzC z|1J!VU)Z>86;9rtvdr!9SLIi=9-?)2mh-5+s5G+rYRQSb-8*8(XiGqqgZ2b~7Wva2 zGfHn9blW3yy|@-m7Y0qNj$$Am6x+;Y?_8=ar?|TXHmJhe?cYhQB4>Z7h{|{r9YI)4 zGW?a6Vwxoe6p5mliJ5qnEwn#RgRFI}=zlb^GPn=rk<*@j@<{Kgn<{>^tyIoz%hch` z0Y-~GyxaXxU-{Vo`@ov$+b-X3PVvOcPZsE5l;nGef-8fMMK+NK`uj&J=4pAm^SK|) z{k>GwoQ6|jKE6jFX*INGp?#WQKL00tb7`Kx%dDWtiu^XrASlhlf#6R0*!X-muEF~N zsPCiMS9oD=G0&Act9!qDSTMAsnArQ%CM+%LMA~=PvhAj+h}5^KOH|c(jswVo=u=Wb zv5!RzU-B*?EuNE~4Y~WdIwTD;GatwFuFWTM0wxkYof>RHkOr__g8-0d8WT3eGs?t6 zS6Ng|pOT|Eh+AA6+8)f1mY>RFMn3BFKWk;N5m~RZi-glErhFROrqBH&RTQ}XQ}4{y zBKbqpm(p^epAo7%;rj3k&Y(~;#31BUj9Dq*dol^_eRyh!K{ZijbN*H7d(^k0W@CNb z@vYeyCvs;Dmi)!k&E;>D{iV^0m(P(lw%2LxhST4@R0^#J^g4)aBK@2OGk2L193IZi_>LQvE4&xomI2@_a$6g8gP+8p)iGPuwdF`l=q{h^(+}jg zwAsMgzTKPyNDo>nrEoUxV0=bzcq7mAoo)M*_~9h}(~=`qg{9Eb<7+3Fa{0rRQ}!Li z);A_@s#hMud%xef*~4G|byWF(Gc4=B3U2?uIgG?3rfpGTwtT?j;%Oil{tQT^oV7Ja zI~*2Os;&Y+{4kYDZA}AMau>MZtM022jfJX7fZexhjF!+o5^7ZAeg2`Trzq~6&ul|p zTYOJXj{;EqBpf(;hS2ruX+~U+QetUd%WCedA7Gde!dN%3ST+A>Y$P>(Ss@PJq^D4m zhvTv?55$z0h=Hu^s&|Qri2>Sdh?ig+d_qBXaA?TS!eEiek2c19`2Kl^w(1eG^{`_- z|7{1j_C(z!>kdk3gZV+xMOK=aZBu{fQ*z+t6@YzACZn8JfoMO6&lvRXTd51>_dDw| zk1_=&nzV({O1nN7<@2khg<*hkYLsVsW@g1f{G3^eJ-t9!#RI;pe~R8T-7C68}K- zM;4jJ+5~PQS{>vaf~lAMat-d{M)q{x2Aez6`yT%2(W8*7H^MBLS7t(+QK~BBK|ZiQ zN%SSrt7&7%WbzOok&xf5-%yFYqpt_3FuG{pQ-E11PMa=e&#wv8`n;$;-lCk{b9=o?kZr_MAbv3&EY#pr|b^G6A=1w#hKEZu5?driL*U>otv9`y8`bk{4&(S z$lQllE%Dq0A*2G&^hwY=Ci!{aqg{-8+92({XaB(tmKj}@56q*KW8K|<$_!t9mF0c& zy`Xo?(JxW}7##ohjAg#xtvThF=}S=~gLS>IEB5cje>61>vQI4ex1U6L%FI2WjG%Yp z)h8&_I9U$|Y@u=79*ziqFNZ$+;!Vc*5VGQ? zll&r0?1Ib#`9zbNT575CosrZBr%rvna8aJ?LHLB9*Qu|k3Ue&XQ<|Nn*SVo^pEteii7BhpjF*QER&Dz@pnPMY;ofX_E`&v-t#ZJycNcH3B8V)%uv*ZE z`uQ(mS8Lyo`HrN9U#%?=cr)nNFy7dDcB(t?*|WWmdkn4{9P{;da&oc_yFNwd{chjj zCr`tQ?O(0fnyxL{%so#BK_FDq;VUv@DIU1**6%rUv(;tFJ1@(mc=v#mlG64_p<|cg zu`@dLNH)Byx2nlT@mv}BFbx=J6tCIx&rji3msiY`*0SwVSu5jM2FIr(QkdC9mY^Wl-02<7W0SNdj800@)p=2yrQ? zt_6m(4CI0da6r8yvpwl6U$(dI%-X9w;vXQ#%X$b-Mh{HAnG|^2wwsb{oP`&>-8MVx zR4{!PRS+h$QlJAM&#nd2Kcd7gdC?XZ!zBa5WeJ)7UaA>*t)lsri(mv^3XW7zE4E!4 zQfHEN{U*yk>{%uuTaaRVdS+LEPB@#XOfPuFYy32 zZ?fR$zgqw~e_`X?{qe8KbD!0b9C*ao&(Dv9`*w|_M7a#dBPsbsJ-6D|DLw->a*9Ur zdYdAnpNH6wR9e_d*w{DfRW)lC;_=|U&(#ulHA{5_#4~&qkCK~A8+e2emDzCi>2!mW zPwl5Q9NPsjNaEo@CQ1D19w;?<+$2bCwVGh5Y);yTw@;U_g;Jk`<;^7?j$lDctQWfH z0|ph@qINSfK5k0a6J!osoy?`~9iBi(nB-$MS2oHGaNvQq$)n$|?bi@@!Q;2wE(IZY zj6OwOUFb|VuOQZ&@$MT3cR`Glj6TUR(|;9y0@CUd1&Dn%3b5eu$m4oeNXn!z+v zQ%E6wMZy&;?LW>ciC=p}ZKS8jg6~o~aW13Pep1e*{PWuk83Yj@&F1knRKa3bjBRBe z&RWuWbLTMc`KWdGa8UeS#fukB_X8-o1lCX)~F{V_9Q{{8q|Em(l z3|#?CfFP1E-gKeiBWiZ~SUIUzC7RVLR&~&77x*Zh+OaFUmZQ@boVUH;BOeqo8%Ol2 z*t>p24QC8PCEk~yE(`Y2(S{1C!sSvbmx4h8g5PUj{T`H$FD(;B8;}cC3VVZ!5;E~# z{U=mII`|2qcRf8l4VNr0e!5=bdc0;gQmIx#iiqLJz^966e(jRgJnVLuZska4j)hYC zKH{fqhRlU;LD@8ej(STvbsusMPO25TiC6@D*oU`B^Y7}IqycjcxY5qtzGWwtV+O%uJ}%;L_BWA!%iGeKQaG{vT^xew=XN@c)+r%(m;pa*X;SePc+ z`di>vZFYvO#zB;9tBk18+w`Q}woO^0-np^sk_x~E*2g!iXFKKv2!q>G$oC}u%mAQ=JHlE!v9i$WP3leuCl%_yVv^l+Oy%(=rt$ivjcCX08-2Qu z-9WpGWAH@zC4$sj!)5{Q*e!4u>d$d2yk8qQ zhACsPZ&8k3VOJQYjC_SIH+tt0!pR$7ue@bb4LRX#$Klf|{qVy*I`8Ls`U(ApRayy( zS!*{NnquSjLTQ0gA6kHu#f9x`(E014&~?Q_;#Ux?_L^$svLNKG3m(Hsh_$i5ALpzj zUGVP1(`<8rE90+_!QET)KrSj1UfA6+G*lsH_Xd8IQ*1u_ESBTgu|0PBp05rf0?}_T zE#D}xad#K5uW7YvWU1^so$2p)^1j33bjKGKVG}9IBgn1Oj@JTr8HY2p3UI21NN6G0 zPzX*2dY%uw(uL~819sIbw^#9>kXufio#8q6Z}?ar=M4yKD0~UJ-??YlIc%bQ*rdow zn<4d#<26;wMu%`ZcEJF`rZoVXM^IWT2G3qS=Ts;s;``Z5u``ohwZ5U5e&4haU+@XXIAqY~LAF1XA~qMM8lt>i_w6?5s$-7I(KV0kK9U32>$gk*2mll&?L0%dHUfjb`HE+6jyxII-UzSw$ z${!CgOJZbXOk!!vC7#7aW{qv&?8(cMlasZNBlZk)zg`yfmTGKltQKpQZ*N(TRghy# z_`I#ud2}z7n?(9;glyqogor8;Qipw^CT@3JD1a&fxz}{@PGC3Be1N!bd27cPw3PDR zOe3hl=YG$In+Kngzr89&{l?PaO1abI34bpWG4^Us>?aYl(^5RmtTpXoae!A{cA_vn zg-M6OPo+d)N#YaP!Lm;x*Eutt1eKw!8jGc&J{2-vwC;c`%zFQ1RsZnB8ET{u{*av}1jDu3~ za%uj5nzb2}y!cioC+)v;rHxgw*=tB`P{|uRX&;SJ*aUXJ-xtsj0q3J#b45 z5a?w|nezl)#AW5jcK+mskLWO9=QJqEQTn=&^D#%g)UZavPnjrv+s93=wA+A<7P=1I zfY(dt_6)k~gdhrOQJ2*?2KzKx1IFqu);+#txMEoLMXxGpszYOEs12}wtfQkr%sTD( zK_gIx6w!U2&k-W}j6t1?O=1ArO?gVxv{#9iI|vDkYAHR1>lQi`*PSj@d)Egv7W-PQ z(Dj-F95Hy_)j#3Nhq~f|`a}jwa4(oHwE5kvKECJfMqwkWvY!{c8<<@-| z_6*B}_A1w#GI;U9omp;w&$rgxowy1n=`;qddgFrL`8z$BNMhl_ZDF*?#KmEH@&f3P z`ub}9;Yzp3#k+e-lahBdXuf8=HwHrI7dC-8>3A>AqePyjx#DGdq02~f`bER47zLJo zbUqu`#U4hd<2i|)M(LaKw?P#(gWyOJ{Mw+ZJ!-gdmO<-lcXZUpy@>L~f7eC{A~YC2~O-Y0mxgC5Vao#;>Dg zODSt{S|C`cumqU7X_R4lbUBjgzYF;QA(4xX$(`P1(kvNOLq(XfAv$IDVfU)85_;t0 z#ksPidAACd&}O;JoE)w72TUmN`GY>CU|;W#r`_me!l|7zF*DcPm%Jt*l+ml80%lApr9U)|wLL?b2`|uo_8SDj_;1dnZm@?I{!hM6YQNyTQ+%59IcFk_iajAxk zJqOfuy)grJNrQ3)HG4kMSv$)FZ?R*_0>eJ<8$5vOTuExrarq^@S42|n!c{0=u+H+A z^5Of0s_HBzGqJx_Y4N{!w7QBQ;oh36ZgMU_M@34Y^N!{9&Fb&WN{>JR@bjZg7 z8~%ji`+l`;c?jO(r5qrnANrn|anruo7{50@`1Fps*aX1tyE+#Y_!>Wm%#+mH=FzxB z2de;jNdEV=JIXrcFU{>)hPa7N$ zT09$z5>lILZ1xGAYk(zRXsB2_vGkA)cTp|5C%jFM0o_=MzHRnmjd~R?s)owFu^M% zvD_}QFd#C>s&r^ z5@=M~z$L9imHU&OcI=JT0XRR|ndZkm`Ja3I1K3>#ogzVRAzS|)fxqc<`FysfHYU>& zT#n2i@3zPUXyyNm1Ef?l1E66fA~jq_He)DG3{nW66K$az-6FwHVjw?RQPQSM(VFv$ zF={EnA~Wbg)(AcTX6TO*5g`T3;d!GwoN7<1yU}iw0k)O)pAov0X>-aVl_@`iPn5p> zoK)LZC#IP&bpRHF4^X}JdJNbxR8<<884yBsVcxRIVrh~mqXM9B(?EX#cCMBfE{3i* zH}D}Ki0L`~ikNakKzPS(4#3Wvxe2Jcl!&mO(MQg-)JMVTHt`@gk{HijEN+o@ezgqs zWnkO=g&OVzxIe;rme_DWOfe$?HD@scXp-g}ICI!h4*~t{YMtR<-1aLOj4#CovN*c! z5D4gS-M!)Sr;{TB>TG4`UrNRt`vXAi`Dc$OHT=S zmenP0wy7CTHW;UVl!hrQ0!pf0XXixRQeu!X1lwKHQ)~N9OFPuedHW`OpA-1xboJxZ zAI*`5$f?M=afl@fKPUs%uD97I7BN3*o#tPBpAS+{Oh}lSPzTwa#|F;kAem$Ilp|-+ zAu6b%M#wrMV<_uKwSCH=FDcg5;vHnVLzU|959m`2g3Hf?<_hG)2&T4x&%pNYWeRhS zQNE2<3l#apat`+8GbhoZ& zh~Xq5Qtx=iFyu~V)toqLJSVu};IAxGaPdh|IOdaSbW-iVpb@$64695OST=UTjWZwr z7{%39DNuvh4{!8VvODr%5FgM%1UyO>L~W;XYvILpKGat?T~`fB$FqkZ=J&7W_@_ps z87$pLUB=ZSmx11h-sX0SgzVQ=tLoE)$o?69O7qo6g*psF_gCLTD4MY-Y>*=bX@PPQ{Gr^@i@cJdgeW$Ef~T{G^=5mTqjax@Gs}NCYS&}f$BRI zqp<#dTZ6Ub`}gbO4G&-~4;S9wcyn9^l@#z|JqU%%i1l{_eF{zGT~5xb-y9EadmTh3 zptD#S?(CVxMOE{K?=eEfs!;`g^KT$Z%+i?V;;~>SZ?(dIO`)8l{`6U?aam5Czh#U0 zpC_NQf(M*dBQ?!3h8wseiCyK(ekG*_rgjFhgB?gwQ4GXdGEkwLoCcr$`mTps$&UNI zz3}$KYa&WZ(Q4*5Y9>tD)Rc7TKUQD}ho=@w;r&CE>6!4nQ1+*j#;vYoyK}8tGwSNB<|zqyg%f_i`k*6z`|jR2GEQ})g`1q_F<|p(Z19L9oTR#E+R}^(uaUsqm}9GKdFa^*llX=b|n>qd_1Bv8Q=X7$Y^S2 ze${YhW7R2|ZIVO-&9Jvba4K-rTS^qCcNIzhu1^6JTWSQ&Q_h>>8tbh4i4nP7fBk5g zuE#@MS@~DX^|iHM)0sI%S_6_G4mdu6-IF=%4pF+oP~5AG zq4xIn;#8J@{M*hm#Eo@xGeq>Jw<#ZX)<+OH^OZjuWhr8nV31817^Qal;K$6n)<4*vx{P!_z{clrtZ6uHeF1WDT9wUrk%XwRQW%&OI zQ68l;Iu^12ip(XAz$+@BlxJDKUFX%#);iRdLXF<-|B`YzLPYNz+m$@q1+8D#4;?OZ z%u({OjaTI$mAKwz7o#>UHy==@!$9PX>=j|)8ifm=R`N2WfC-^uJ9HWJbSS^qkv%Bc z*L7aN%OSjvcDTO&f5ZRzC5ftmOamg#hRWmRhwPafEi!bmRtI-K1~v|aD$XRUN)XGE z0vY_cn$yL}7yAN0(p!hVmdX0k?AvHBA-BMcx`xE;$; zPGIRB7%1-~FMBm~jll?re}5tp@%+3Rl`>DqA32SE)!{&pmAu@P37i_iO>oS?JfC$y z6ZWuTSO2oYM_R0wk$;ovEQxf`r+knZ2DrgF6d(1?R--cNd5jd+#rvWxg8YNsNT_#E87E;rOR!)x5FGmA^iOiV0YZV^KjFWL^!+0waHZMpoOtH=AI74^=#FS^UW%KM8K$g@6sq7igea1+PohxYiwdd zRl6{Ljo|i|g5MS{B_m_Z=6SHt_VaZfMcj&r@h>2VlgrG^{E85c`aouJ0iXbW&yIff zU0>ogPSYsjZ(N!mt$k)a7F(!}VQ*QS>8h<7nj0uBJ}kVjMCx0sdd!#vua?5QSr-+8 zBy%@7G_f#ogdoQM|Fo6(zNCmGZq{HZJak+lpE5F*lCDmdoM1!>`oo0``C3J?WO*J@ zPgaij&n&My@28|<5aHtT@&Wo40poXE6%5ip9wCAI=ipu-$*vAl##I&w|MkdmsCHM* z0s8rfw2TZ1zx}cN7^eNh3u6slmR004juG*4-n&}PsIs@h&l2oMOqByy4-J1rii(SC z&wOFbO+1We9oof+MM}m&CY)#P@YMJ_{3>i)X&7s%vYC)*A0Fyl)o`26BR}c8j6gFh#p-&4`TcO ee-LRmKg`!F*$#;{v!m#8+_ Date: Sat, 5 Apr 2025 23:27:32 +0900 Subject: [PATCH 14/15] =?UTF-8?q?onboarding=5Fscreen=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/features/auth/onboarding_screen.dart | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/features/auth/onboarding_screen.dart b/lib/features/auth/onboarding_screen.dart index 702a9d5..baa2c12 100644 --- a/lib/features/auth/onboarding_screen.dart +++ b/lib/features/auth/onboarding_screen.dart @@ -11,7 +11,17 @@ class OnboardingScreen extends StatelessWidget { return Scaffold( body: Column( children: [ - SizedBox(height: 1844.h), + SizedBox(height: 250.h), + Positioned( + left: 44.w, + top: 342.h, + child: Image.asset( + 'assets/icons/login.png', + width: 992.w, + height: 1360.h, + ), + ), + SizedBox(height: 200.h), GestureDetector( onTap: () { Navigator.push( From b8dcdee8a504db409c7e929dffac2ca7a0248dfe Mon Sep 17 00:00:00 2001 From: qixiangme Date: Sat, 5 Apr 2025 23:34:29 +0900 Subject: [PATCH 15/15] group detail --- lib/core/user_model.dart | 1 - lib/core/user_provider.dart | 1 - lib/features/study/data/group_api.dart | 53 + lib/features/study/data/group_model.dart | 31 +- lib/features/study/data/ranking_model.dart | 22 + lib/features/study/data/tempGroup.dart | 17 - .../study/ui/group_detail/detail_home.dart | 982 ++++++++----- .../study/ui/group_detail/detail_ranking.dart | 1306 +++++++++-------- .../study_make_group_name_screen.dart | 10 +- lib/features/study/ui/study_screen.dart | 1 - .../ui/widgets/interview_schedule_card.dart | 1 - .../study/ui/widgets/ranking_card.dart | 1 - 12 files changed, 1398 insertions(+), 1028 deletions(-) create mode 100644 lib/features/study/data/ranking_model.dart delete mode 100644 lib/features/study/data/tempGroup.dart diff --git a/lib/core/user_model.dart b/lib/core/user_model.dart index c587b71..35e109f 100644 --- a/lib/core/user_model.dart +++ b/lib/core/user_model.dart @@ -1,5 +1,4 @@ import 'package:componentss/features/study/data/group_model.dart'; -import 'package:componentss/features/study/data/tempGroup.dart'; class User { final String username; diff --git a/lib/core/user_provider.dart b/lib/core/user_provider.dart index d1ab13e..153bbc0 100644 --- a/lib/core/user_provider.dart +++ b/lib/core/user_provider.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:componentss/features/study/data/group_model.dart'; -import 'package:componentss/features/study/data/tempGroup.dart'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import 'user_model.dart'; diff --git a/lib/features/study/data/group_api.dart b/lib/features/study/data/group_api.dart index 8de4d64..b21121c 100644 --- a/lib/features/study/data/group_api.dart +++ b/lib/features/study/data/group_api.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:componentss/features/study/data/ranking_model.dart'; import 'package:http/http.dart' as http; import 'group_model.dart'; // GroupModel 파일 import @@ -77,3 +78,55 @@ class GroupApi { } } } + +Future> fetchMemberScores(List memberIds) async { + Map memberScores = {}; + + for (String memberId in memberIds) { + final url = Uri.parse("http://34.64.233.128:5200/missions/score/$memberId"); + + try { + final response = await http.get( + url, + headers: {'Content-Type': 'application/json'}, + ); + + if (response.statusCode == 200) { + final int score = int.parse(response.body.trim()); + memberScores[memberId] = score; + print("점수 가져오기 성공"); + } else { + print('❌ 점수 가져오기 실패: ${response.statusCode}'); + } + } catch (e) { + print('❌ 요청 중 오류 발생: $e'); + } + } + + return memberScores; +} + +Future> fetchDailyRanking(String groupId) async { + final String baseUrl = "http://34.64.233.128:5200"; + final url = Uri.parse("$baseUrl/missions/groups/$groupId/daily-ranking"); + print(groupId); + + try { + print("🔄 랭킹 데이터 요청 시작: $url"); + final response = await http + .get(url, headers: {'Content-Type': 'application/json'}) + .timeout(Duration(seconds: 10)); + + if (response.statusCode == 200) { + final List data = jsonDecode(response.body); + print("✅ 랭킹 데이터 가져오기 성공: $data"); + return data.map((item) => RankingModel.fromJson(item)).toList(); + } else { + print("Error: ${response.statusCode}, ${response.body}"); + return []; + } + } catch (e) { + print("GET 요청 실패: $e"); + return []; + } +} diff --git a/lib/features/study/data/group_model.dart b/lib/features/study/data/group_model.dart index 73f5c38..3e0067e 100644 --- a/lib/features/study/data/group_model.dart +++ b/lib/features/study/data/group_model.dart @@ -1,40 +1,55 @@ import 'dart:convert'; class GroupModel { - final String authorId; - final String name; - final String? joinCode; - final List tags; - final String? imageUrl; + final String id; // 그룹 ID + final String authorId; // 작성자 ID + final String name; // 그룹 이름 + final String joinCode; // 그룹 가입 코드 + final List tags; // 태그 리스트 + final String? imageUrl; // 이미지 URL + final List memberIds; // 멤버 ID 리스트 + final int score; // 그룹 점수 + final int level; // 그룹 레벨 GroupModel({ + required this.id, required this.authorId, required this.name, - + required this.joinCode, required this.tags, this.imageUrl, - this.joinCode, + required this.memberIds, + required this.score, + required this.level, }); // JSON → 객체 변환 factory GroupModel.fromJson(Map json) { return GroupModel( + id: json['id'], authorId: json['authorId'], name: json['name'], joinCode: json['joinCode'], tags: List.from(json['tags'] ?? []), imageUrl: json['imageUrl'], + memberIds: List.from(json['memberIds'] ?? []), + score: json['score'] ?? 0, + level: json['level'] ?? 0, ); } // 객체 → JSON 변환 Map toJson() { return { + 'id': id, 'authorId': authorId, 'name': name, 'joinCode': joinCode, 'tags': tags, 'imageUrl': imageUrl, + 'memberIds': memberIds, + 'score': score, + 'level': level, }; } @@ -47,4 +62,4 @@ class GroupModel { String toJsonString() { return jsonEncode(toJson()); } -} +} \ No newline at end of file diff --git a/lib/features/study/data/ranking_model.dart b/lib/features/study/data/ranking_model.dart new file mode 100644 index 0000000..c3b4534 --- /dev/null +++ b/lib/features/study/data/ranking_model.dart @@ -0,0 +1,22 @@ +class RankingModel { + final String userId; + final String userName; + final int score; + final int rank; + + RankingModel({ + required this.userId, + required this.userName, + required this.score, + required this.rank, + }); + + factory RankingModel.fromJson(Map json) { + return RankingModel( + userId: json['userId'], + userName: json['userName'], + score: json['score'], + rank: json['rank'], + ); + } +} diff --git a/lib/features/study/data/tempGroup.dart b/lib/features/study/data/tempGroup.dart deleted file mode 100644 index 3ca4870..0000000 --- a/lib/features/study/data/tempGroup.dart +++ /dev/null @@ -1,17 +0,0 @@ -class Group { - final String id; - final String name; - final String description; - final String imageUrl; - final String meetingInfo; - final String memberCount; - - Group({ - required this.id, - required this.name, - required this.description, - required this.imageUrl, - required this.meetingInfo, - required this.memberCount, - }); -} diff --git a/lib/features/study/ui/group_detail/detail_home.dart b/lib/features/study/ui/group_detail/detail_home.dart index 4257f69..89f1366 100644 --- a/lib/features/study/ui/group_detail/detail_home.dart +++ b/lib/features/study/ui/group_detail/detail_home.dart @@ -1,5 +1,6 @@ import 'dart:math'; +import 'package:componentss/features/study/data/group_api.dart'; import 'package:componentss/features/study/data/group_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -14,440 +15,625 @@ class DetailHome extends StatefulWidget { } class _DetailHomeState extends State { + GroupModel? _group; + Map _memberScores = {}; + + Future loadGroupAndScores(String joinCode) async { + final groupApi = GroupApi(); + final group = await groupApi.getGroupByJoinCode(joinCode); + print(group); + + if (group != null) { + final scores = await fetchMemberScores(group.memberIds); + + setState(() { + _group = group; + _memberScores = scores; + }); + } else { + print('❌ 그룹 정보를 가져오지 못했습니다.'); + } + } + @override - Widget build(BuildContext context) { - return Stack( - children: [ - Expanded( + void initState() { + super.initState(); + loadGroupAndScores(widget.groupModel.joinCode); + } + + // Widget _buildMemberList() { + // if (_group == null || _memberScores.isEmpty) { + // return Center(child: CircularProgressIndicator()); + // } + + // return ListView.builder( + // itemCount: _group!.memberIds.length, + // itemBuilder: (context, index) { + // final memberId = _group!.memberIds[index]; + // final score = _memberScores[memberId] ?? 0; + + // return ListTile( + // leading: CircleAvatar( + // backgroundColor: Colors.grey, + // child: Text( + // memberId.substring(0, 2), // 멤버 ID의 일부를 표시 + // style: TextStyle(color: Colors.white), + // ), + // ), + // title: Text( + // 'Member ID: $memberId', + // style: TextStyle(color: Colors.white), + // ), + // trailing: Text('$score 점', style: TextStyle(color: Colors.orange)), + // ); + // }, + // ); + // } + + Widget _buildMemberList() { + if (_group == null || _memberScores.isEmpty) { + return Center(child: CircularProgressIndicator()); + } + + if (_group!.memberIds.isEmpty) { + return Center( + child: Text( + '멤버가 없습니다.', + style: TextStyle(color: Colors.white, fontSize: 18), + ), + ); + } + + return ListView.builder( + shrinkWrap: true, // 부모 위젯의 크기에 맞게 리스트뷰 크기 조정 + physics: NeverScrollableScrollPhysics(), // 스크롤 비활성화 (필요 시 제거) + itemCount: _group!.memberIds.length, + itemBuilder: (context, index) { + final memberId = _group!.memberIds[index]; + final score = _memberScores[memberId] ?? 0; + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), child: Container( - width: double.infinity, - color: Color(0xFF434343), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + padding: EdgeInsets.all(16.0), + decoration: BoxDecoration( + color: Colors.grey[800], + borderRadius: BorderRadius.circular(12.0), + ), + child: Row( children: [ - Row( + CircleAvatar( + backgroundColor: Colors.grey, + child: Text( + memberId.substring(0, 2), // 멤버 ID의 일부를 표시 + style: TextStyle(color: Colors.white), + ), + ), + SizedBox(width: 16.0), + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - width: 130.w, - height: 154.h, - margin: EdgeInsets.symmetric(horizontal: 8.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(35.r), - ), + Text( + 'Member ID: $memberId', + style: TextStyle(color: Colors.white, fontSize: 16), ), - - Container( - width: 130.w, - height: 154.h, - margin: EdgeInsets.symmetric(horizontal: 8.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(35.r), - ), - ), - - Container( - width: 130.w, - height: 154.h, - margin: EdgeInsets.symmetric(horizontal: 8.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(35.r), - ), + Text( + 'Score: $score', + style: TextStyle(color: Colors.orange, fontSize: 16), ), ], ), - Stack( + ], + ), + ), + ); + }, + ); + } + + Widget _buildSingleMember() { + if (_group == null || _memberScores.isEmpty) { + return Center(child: CircularProgressIndicator()); + } + + // 첫 번째 멤버 가져오기 + final memberId = _group!.memberIds.isNotEmpty ? _group!.memberIds[0] : null; + final score = memberId != null ? _memberScores[memberId] ?? 0 : 0; + + if (memberId == null) { + return Center( + child: Text( + '멤버가 없습니다.', + style: TextStyle(color: Colors.white, fontSize: 18), + ), + ); + } + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Container( + padding: EdgeInsets.all(16.0), + decoration: BoxDecoration( + color: Colors.grey[800], + borderRadius: BorderRadius.circular(12.0), + ), + child: Row( + children: [ + CircleAvatar( + backgroundColor: Colors.grey, + child: Text( + memberId.substring(0, 2), // 멤버 ID의 일부를 표시 + style: TextStyle(color: Colors.white), + ), + ), + SizedBox(width: 16.0), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Member ID: $memberId', + style: TextStyle(color: Colors.white, fontSize: 16), + ), + Text( + 'Score: $score', + style: TextStyle(color: Colors.orange, fontSize: 16), + ), + ], + ), + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Stack( + children: [ + Expanded( + child: Container( + width: double.infinity, + color: Color(0xFF434343), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Center(child: AnimatedHalfCircleProgress()), - Padding( - padding: EdgeInsets.only(top: 90), - child: Center( - child: Container( - width: 611.w, - height: 500.h, - decoration: BoxDecoration(color: Color(0XFF6B6B6B)), + Row( + children: [ + Container( + width: 130.w, + height: 154.h, + margin: EdgeInsets.symmetric(horizontal: 8.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(35.r), + ), ), - ), - ), - ], - ), - SizedBox(height: 20), - Center( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 8, - vertical: 2, - ), - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color(0x21FF9F1C), - shape: RoundedRectangleBorder( - side: BorderSide( - width: 2.96.w, - color: const Color(0xFFFF9F1C) /* main-orange */, + + Container( + width: 130.w, + height: 154.h, + margin: EdgeInsets.symmetric(horizontal: 8.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(35.r), + ), ), - borderRadius: BorderRadius.circular(29.57.w), - ), + + Container( + width: 130.w, + height: 154.h, + margin: EdgeInsets.symmetric(horizontal: 8.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(35.r), + ), + ), + ], ), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 29.57.w, + Stack( children: [ - Text( - 'Lv.0', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color(0xFFFF9F1C) /* main-orange */, - fontSize: 36.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w400, + Center(child: AnimatedHalfCircleProgress()), + Padding( + padding: EdgeInsets.only(top: 90), + child: Center( + child: Container( + width: 611.w, + height: 500.h, + decoration: BoxDecoration( + color: Color(0XFF6B6B6B), + ), + ), ), ), ], ), - ), - ), - SizedBox(height: 6), - Center( - child: Text( - '따끈따끈한 반죽', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 66.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, - ), - ), - ), - SizedBox(height: 40), - Padding( - padding: EdgeInsets.only(left: 20), - child: Text( - '오늘 획득한 그룹 포인트', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, - ), - ), - ), - SizedBox(height: 20), - Stack( - children: [ + SizedBox(height: 20), Center( - child: Opacity( - opacity: 0.10.w, - child: Container( - width: 992.w, - height: 522.h, - decoration: ShapeDecoration( - color: const Color(0xFFD9D9D9), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(38.50.w), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color(0x21FF9F1C), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 2.96.w, + color: const Color(0xFFFF9F1C) /* main-orange */, ), + borderRadius: BorderRadius.circular(29.57.w), ), ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 29.57.w, + children: [ + Text( + 'Lv.0', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color( + 0xFFFF9F1C, + ) /* main-orange */, + fontSize: 36.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w400, + ), + ), + ], + ), ), ), + SizedBox(height: 6), Center( - child: Padding( - padding: EdgeInsets.only(top: 15), - child: SizedBox( - width: 868.w, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 315.w, - children: [ - Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 42.w, - children: [ - Container( - width: 150.w, - height: 150.h, - decoration: ShapeDecoration( - image: DecorationImage( - image: NetworkImage( - "https://placehold.co/150x150", - ), - fit: BoxFit.cover, - ), - shape: OvalBorder( - side: BorderSide( - width: 1.68.w, - color: const Color( - 0xFFC4CAD4, - ) /* gray */, - ), - ), - ), - ), - SizedBox( - width: 241.w, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - spacing: 23.w, - children: [ - SizedBox( - width: 241.w, - height: 60.h, - child: Text( - 'Username', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - ), - ), - ), - Container( - width: 123.31.w, - height: 66.65.h, - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 3, - ), - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color( - 0xFF6B6B6B, - ) /* dark-gray */, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 2.96.w, - color: const Color( - 0xFFC4CAD4, - ) /* gray */, - ), - borderRadius: - BorderRadius.circular( - 29.57.w, - ), - ), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - spacing: 29.57.w, - children: [ - Text( - 'level', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color( - 0xFFC4CAD4, - ) /* gray */, - fontSize: 36.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w400, - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - Text( - '20 p', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color( - 0xFFFF9F1C, - ) /* main-orange */, - fontSize: 55.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w900, - letterSpacing: -0.55.w, - ), - ), - ], - ), + child: Text( + '따끈따끈한 반죽', + style: TextStyle( + color: Colors.white /* white */, + fontSize: 66.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, ), ), ), - Center( - child: Padding( - padding: EdgeInsets.only(top: 120), - child: SizedBox( - width: 868.w, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 31.w, - children: [ - Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 42.w, - children: [ - Container( - width: 150.w, - height: 150.h, - decoration: ShapeDecoration( - image: DecorationImage( - image: NetworkImage( - "https://placehold.co/150x150", - ), - fit: BoxFit.cover, - ), - shape: OvalBorder( - side: BorderSide( - width: 1.68.w, - color: const Color( - 0xFFC4CAD4, - ) /* gray */, - ), - ), - ), - ), - SizedBox( - width: 241.w, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - spacing: 23.w, - children: [ - SizedBox( - width: 241.w, - height: 60.h, - child: Text( - 'Username', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - ), - ), - ), - Container( - width: 123.31.w, - height: 66.65.h, - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 3, - ), - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color( - 0xFF6B6B6B, - ) /* dark-gray */, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 2.96.w, - color: const Color( - 0xFFC4CAD4, - ) /* gray */, - ), - borderRadius: - BorderRadius.circular( - 29.57.w, - ), - ), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - spacing: 29.57.w, - children: [ - Text( - 'level', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color( - 0xFFC4CAD4, - ) /* gray */, - fontSize: 36.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w400, - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - Text( - '20 p', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color( - 0xFFFF9F1C, - ) /* main-orange */, - fontSize: 55.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w900, - letterSpacing: -0.55.w, - ), - ), - ], - ), + SizedBox(height: 40), + Padding( + padding: EdgeInsets.only(left: 20), + child: Text( + '오늘 획득한 그룹 포인트', + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, ), ), ), + SizedBox(height: 20), + + // Stack( + // children: [ + // Center( + // child: Opacity( + // opacity: 0.10.w, + // child: Container( + // width: 992.w, + // height: 522.h, + // decoration: ShapeDecoration( + // color: const Color(0xFFD9D9D9), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(38.50.w), + // ), + // ), + // ), + // ), + // ), + // Center( + // child: Padding( + // padding: EdgeInsets.only(top: 15), + // child: SizedBox( + // width: 868.w, + // child: Row( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // crossAxisAlignment: CrossAxisAlignment.center, + // spacing: 315.w, + // children: [ + // Row( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.center, + // spacing: 42.w, + // children: [ + // Container( + // width: 150.w, + // height: 150.h, + // decoration: ShapeDecoration( + // image: DecorationImage( + // image: NetworkImage( + // "https://placehold.co/150x150", + // ), + // fit: BoxFit.cover, + // ), + // shape: OvalBorder( + // side: BorderSide( + // width: 1.68.w, + // color: const Color( + // 0xFFC4CAD4, + // ) /* gray */, + // ), + // ), + // ), + // ), + // SizedBox( + // width: 241.w, + // child: Column( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: + // MainAxisAlignment.start, + // crossAxisAlignment: + // CrossAxisAlignment.start, + // spacing: 23.w, + // children: [ + // SizedBox( + // width: 241.w, + // height: 60.h, + // child: Text( + // 'Username', + // style: TextStyle( + // color: Colors.white /* white */, + // fontSize: 50.w, + // fontFamily: 'Wanted Sans', + // fontWeight: FontWeight.w600, + // ), + // ), + // ), + // Container( + // width: 123.31.w, + // height: 66.65.h, + // padding: const EdgeInsets.symmetric( + // horizontal: 5, + // vertical: 3, + // ), + // clipBehavior: Clip.antiAlias, + // decoration: ShapeDecoration( + // color: const Color( + // 0xFF6B6B6B, + // ) /* dark-gray */, + // shape: RoundedRectangleBorder( + // side: BorderSide( + // width: 2.96.w, + // color: const Color( + // 0xFFC4CAD4, + // ) /* gray */, + // ), + // borderRadius: + // BorderRadius.circular( + // 29.57.w, + // ), + // ), + // ), + // child: Row( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: + // MainAxisAlignment.center, + // crossAxisAlignment: + // CrossAxisAlignment.center, + // spacing: 29.57.w, + // children: [ + // Text( + // 'level', + // textAlign: TextAlign.center, + // style: TextStyle( + // color: const Color( + // 0xFFC4CAD4, + // ) /* gray */, + // fontSize: 36.w, + // fontFamily: 'Wanted Sans', + // fontWeight: FontWeight.w400, + // ), + // ), + // ], + // ), + // ), + // ], + // ), + // ), + // ], + // ), + // Text( + // '20 p', + // textAlign: TextAlign.center, + // style: TextStyle( + // color: const Color( + // 0xFFFF9F1C, + // ) /* main-orange */, + // fontSize: 55.w, + // fontFamily: 'Wanted Sans', + // fontWeight: FontWeight.w900, + // letterSpacing: -0.55.w, + // ), + // ), + // ], + // ), + // ), + // ), + // ), + // Center( + // child: Padding( + // padding: EdgeInsets.only(top: 120), + // child: SizedBox( + // width: 868.w, + // child: Row( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // crossAxisAlignment: CrossAxisAlignment.center, + // spacing: 31.w, + // children: [ + // Row( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.center, + // spacing: 42.w, + // children: [ + // Container( + // width: 150.w, + // height: 150.h, + // decoration: ShapeDecoration( + // image: DecorationImage( + // image: NetworkImage( + // "https://placehold.co/150x150", + // ), + // fit: BoxFit.cover, + // ), + // shape: OvalBorder( + // side: BorderSide( + // width: 1.68.w, + // color: const Color( + // 0xFFC4CAD4, + // ) /* gray */, + // ), + // ), + // ), + // ), + // SizedBox( + // width: 241.w, + // child: Column( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: + // MainAxisAlignment.start, + // crossAxisAlignment: + // CrossAxisAlignment.start, + // spacing: 23.w, + // children: [ + // SizedBox( + // width: 241.w, + // height: 60.h, + // child: Text( + // 'Username', + // style: TextStyle( + // color: Colors.white /* white */, + // fontSize: 50.w, + // fontFamily: 'Wanted Sans', + // fontWeight: FontWeight.w600, + // ), + // ), + // ), + // Container( + // width: 123.31.w, + // height: 66.65.h, + // padding: const EdgeInsets.symmetric( + // horizontal: 5, + // vertical: 3, + // ), + // clipBehavior: Clip.antiAlias, + // decoration: ShapeDecoration( + // color: const Color( + // 0xFF6B6B6B, + // ) /* dark-gray */, + // shape: RoundedRectangleBorder( + // side: BorderSide( + // width: 2.96.w, + // color: const Color( + // 0xFFC4CAD4, + // ) /* gray */, + // ), + // borderRadius: + // BorderRadius.circular( + // 29.57.w, + // ), + // ), + // ), + // child: Row( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: + // MainAxisAlignment.center, + // crossAxisAlignment: + // CrossAxisAlignment.center, + // spacing: 29.57.w, + // children: [ + // Text( + // 'level', + // textAlign: TextAlign.center, + // style: TextStyle( + // color: const Color( + // 0xFFC4CAD4, + // ) /* gray */, + // fontSize: 36.w, + // fontFamily: 'Wanted Sans', + // fontWeight: FontWeight.w400, + // ), + // ), + // ], + // ), + // ), + // ], + // ), + // ), + // ], + // ), + // Text( + // '20 p', + // textAlign: TextAlign.center, + // style: TextStyle( + // color: const Color( + // 0xFFFF9F1C, + // ) /* main-orange */, + // fontSize: 55.w, + // fontFamily: 'Wanted Sans', + // fontWeight: FontWeight.w900, + // letterSpacing: -0.55.w, + // ), + // ), + // ], + // ), + // ), + // ), + // ), + // ], + // ), + SizedBox( + height: 300, + width: 300, + child: _buildMemberList(), + ), ], ), - ], + ), ), - ), - ), - Positioned( - right: 24, - top: 7, - child: Icon(Icons.circle, size: 40, color: Color(0xffFF9F1C)), - ), - Positioned( - right: 20, - child: SizedBox( - width: 120.w, - height: 120.h, - child: Stack( - children: [ - Positioned( - left: 31.20.w, - top: 34.80.h, - child: Text( - '27', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 48.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - letterSpacing: -0.48.w, + Positioned( + right: 24, + top: 7, + child: Icon(Icons.circle, size: 40, color: Color(0xffFF9F1C)), + ), + Positioned( + right: 20, + child: SizedBox( + width: 120.w, + height: 120.h, + child: Stack( + children: [ + Positioned( + left: 31.20.w, + top: 34.80.h, + child: Text( + '27', + style: TextStyle( + color: Colors.white /* white */, + fontSize: 48.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.48.w, + ), + ), ), - ), + ], ), - ], + ), ), - ), + ], ), ], ); diff --git a/lib/features/study/ui/group_detail/detail_ranking.dart b/lib/features/study/ui/group_detail/detail_ranking.dart index 67b437d..9852fcd 100644 --- a/lib/features/study/ui/group_detail/detail_ranking.dart +++ b/lib/features/study/ui/group_detail/detail_ranking.dart @@ -1,4 +1,6 @@ +import 'package:componentss/features/study/data/group_api.dart'; import 'package:componentss/features/study/data/group_model.dart'; +import 'package:componentss/features/study/data/ranking_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -12,390 +14,375 @@ class DetailRanking extends StatefulWidget { } class _DetailRankingState extends State { + List _rankings = []; + bool _isLoading = true; @override - Widget build(BuildContext context) { - return Container( - child: Stack( - children: [ - Positioned( - child: Container( - width: 1080.w, - height: 2906.h, - decoration: BoxDecoration(color: const Color(0xFF434343)), + void initState() { + super.initState(); + _loadRankingData(); // 랭킹 데이터를 로드 + } + + Future _loadRankingData() async { + print("🔄 랭킹 데이터 로드 시작"); + final rankings = await fetchDailyRanking(widget.groupModel.id); + + setState(() { + _rankings = rankings; + _isLoading = false; + }); + } + + Widget _buildRankingList() { + if (_isLoading) { + return Center(child: CircularProgressIndicator()); + } + + if (_rankings.isEmpty) { + return Center( + child: Text( + '랭킹 데이터가 없습니다.', + style: TextStyle(color: Colors.black, fontSize: 18), + ), + ); + } + + return ListView.builder( + itemCount: _rankings.length, + itemBuilder: (context, index) { + final ranking = _rankings[index]; + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), + child: Container( + padding: EdgeInsets.all(16.0), + decoration: BoxDecoration( + color: Colors.grey[800], + borderRadius: BorderRadius.circular(12.0), ), - ), - Positioned( - left: 0.w, - top: 0.h, - child: SizedBox( - width: 1080.w, - height: 105.h, - child: Stack( - children: [ - Positioned( - left: 726.w, - top: 36.h, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 6.w, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + CircleAvatar( + backgroundColor: Colors.grey, + child: Text( + ranking.rank.toString(), // 랭크 표시 + style: TextStyle(color: Colors.white), + ), + ), + SizedBox(width: 16.0), + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - width: 45.w, - height: 45.h, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration(), - child: Stack(), + Text( + ranking.userName, + style: TextStyle(color: Colors.white, fontSize: 16), ), - Container( - width: 48.w, - height: 48.h, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration(), - child: Stack(), - ), - Container( - width: 45.w, - height: 45.h, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration(), - child: Stack(), - ), - Container( - width: 45.w, - height: 45.h, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration(), - child: Stack(), - ), - Container( - width: 45.w, - height: 45.h, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration(), - child: Stack(), - ), - Container( - transform: - Matrix4.identity() - ..translate(0.0, 0.0) - ..rotateZ(-1.57), - height: 48.h, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration(), - child: Stack(), + Text( + 'Score: ${ranking.score}', + style: TextStyle(color: Colors.orange, fontSize: 16), ), ], ), - ), - ], - ), + ], + ), + Text( + '#${ranking.rank}', + style: TextStyle(color: Colors.white, fontSize: 16), + ), + ], ), ), - Positioned( - // 첫 번째 박스 - left: 44.w, - top: 208.h, - child: Opacity( - opacity: 0.10.w, - child: Container( - width: 992.w, - height: 240.h, - decoration: ShapeDecoration( - color: const Color(0xFFD9D9D9), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(38.50.w), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: _buildRankingList(), + ), + Stack( + children: [ + Positioned( + child: Container( + width: 1080.w, + height: 2906.h, + decoration: BoxDecoration(color: const Color(0xFF434343)), + ), + ), + Positioned( + left: 0.w, + top: 0.h, + child: SizedBox( + width: 1080.w, + height: 105.h, + child: Stack( + children: [ + Positioned( + left: 726.w, + top: 36.h, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 6.w, + children: [ + Container( + width: 45.w, + height: 45.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + Container( + width: 48.w, + height: 48.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + Container( + width: 45.w, + height: 45.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + Container( + width: 45.w, + height: 45.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + Container( + width: 45.w, + height: 45.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + Container( + transform: + Matrix4.identity() + ..translate(0.0, 0.0) + ..rotateZ(-1.57), + height: 48.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + child: Stack(), + ), + ], + ), + ), + ], ), ), ), - ), - ), - Positioned( - // 세 번째 박스 - left: 44.w, - top: 1128.h, - child: Opacity( - opacity: 0.10.w, - child: Container( - width: 992.w, - height: 240.h, - decoration: ShapeDecoration( - color: const Color(0xFFD9D9D9), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(38.50.w), + Positioned( + // 첫 번째 박스 + left: 44.w, + top: 208.h, + child: Opacity( + opacity: 0.10.w, + child: Container( + width: 992.w, + height: 240.h, + decoration: ShapeDecoration( + color: const Color(0xFFD9D9D9), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(38.50.w), + ), + ), ), ), ), - ), - ), - Positioned( - // 두 번째 박스 - left: 44.w, - top: 480.h, - child: Opacity( - opacity: 0.10.w, - child: Container( - width: 992.w, - height: 240.h, - decoration: ShapeDecoration( - color: const Color(0xFFD9D9D9), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(38.50.w), + Positioned( + // 세 번째 박스 + left: 44.w, + top: 1128.h, + child: Opacity( + opacity: 0.10.w, + child: Container( + width: 992.w, + height: 240.h, + decoration: ShapeDecoration( + color: const Color(0xFFD9D9D9), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(38.50.w), + ), + ), ), ), ), - ), - ), - Positioned( - //네 번째 박스 - left: 44.w, - top: 1400.h, - child: Opacity( - opacity: 0.10.w, - child: Container( - width: 992.w, - height: 240.h, - decoration: ShapeDecoration( - color: const Color(0xFFD9D9D9), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(38.50.w), + Positioned( + // 두 번째 박스 + left: 44.w, + top: 480.h, + child: Opacity( + opacity: 0.10.w, + child: Container( + width: 992.w, + height: 240.h, + decoration: ShapeDecoration( + color: const Color(0xFFD9D9D9), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(38.50.w), + ), + ), + ), + ), + ), + Positioned( + //네 번째 박스 + left: 44.w, + top: 1400.h, + child: Opacity( + opacity: 0.10.w, + child: Container( + width: 992.w, + height: 240.h, + decoration: ShapeDecoration( + color: const Color(0xFFD9D9D9), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(38.50.w), + ), + ), ), ), ), - ), - ), - Positioned( - left: 66.w, - top: 80.h, - child: Text( - '우리 스터디 순위는?', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, + Positioned( + left: 66.w, + top: 80.h, + child: Text( + '우리 스터디 순위는?', + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + ), + ), ), - ), - ), - Positioned( - left: 66.w, - top: 1000.h, - child: Text( - '오늘 제일 열심히 준비한 팀원은?', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, + Positioned( + left: 66.w, + top: 1000.h, + child: Text( + '오늘 제일 열심히 준비한 팀원은?', + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + ), + ), ), - ), - ), - Positioned( - left: 193.w, - top: 248.h, - child: Opacity( - opacity: 0.50.w, - child: SizedBox( - width: 800.w, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( + Positioned( + left: 193.w, + top: 248.h, + child: Opacity( + opacity: 0.50.w, + child: SizedBox( + width: 800.w, + child: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, - spacing: 42.w, children: [ - Container( - width: 150.w, - height: 150.h, - decoration: ShapeDecoration( - image: DecorationImage( - image: NetworkImage( - "https://placehold.co/150x150", - ), - fit: BoxFit.cover, - ), - shape: OvalBorder( - side: BorderSide( - width: 1.68.w, - color: const Color(0xFFC4CAD4) /* gray */, - ), - ), - ), - ), - SizedBox( - width: 300.w, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 23.w, - children: [ - Text( - 'Groupname', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - ), - ), - Container( - width: 123.31.w, - height: 66.65.h, - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 3, - ), - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color( - 0xFF6B6B6B, //첫번째 level 박스 - ) /* dark-gray */, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 2.96.w, - color: const Color(0xFFC4CAD4) /* gray */, - ), - borderRadius: BorderRadius.circular( - 29.57.w, - ), - ), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 29.57.w, - children: [ - Text( - 'level', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color( - 0xFFffffff, - ) /* gray */, - fontSize: 36.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w400, - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - Text( - '1000 p', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, - letterSpacing: -0.50.w, - ), - ), - ], - ), - ), - ), - ), - Positioned( - left: 193.w, - top: 1168.h, - child: SizedBox( - width: 800.w, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 42.w, - children: [ - Container( - width: 150.w, - height: 150.h, - decoration: ShapeDecoration( - image: DecorationImage( - image: NetworkImage("https://placehold.co/150x150"), - fit: BoxFit.cover, - ), - shape: OvalBorder( - side: BorderSide( - width: 1.68.w, - color: const Color(0xFFC4CAD4) /* gray */, - ), - ), - ), - ), - SizedBox( - width: 241.w, - child: Column( + Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 23.w, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 42.w, children: [ - SizedBox( - width: 241.w, - height: 60.h, - child: Text( - 'Username', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - ), - ), - ), Container( - width: 123.31.w, - height: 66.65.h, - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 3, - ), - clipBehavior: Clip.antiAlias, + width: 150.w, + height: 150.h, decoration: ShapeDecoration( - color: const Color( - 0xFF6B6B6B, - ) /* dark-gray */, // 세 번째 level 박스 - shape: RoundedRectangleBorder( + image: DecorationImage( + image: NetworkImage( + "https://placehold.co/150x150", + ), + fit: BoxFit.cover, + ), + shape: OvalBorder( side: BorderSide( - width: 2.96.w, + width: 1.68.w, color: const Color(0xFFC4CAD4) /* gray */, ), - borderRadius: BorderRadius.circular(29.57.w), ), ), - child: Row( + ), + SizedBox( + width: 300.w, + child: Column( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 29.57.w, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 23.w, children: [ Text( - 'level', - textAlign: TextAlign.center, + 'Groupname', style: TextStyle( - color: const Color(0xFFFFFFFF), - fontSize: 36.w, + color: Colors.white /* white */, + fontSize: 50.w, fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w600, + ), + ), + Container( + width: 123.31.w, + height: 66.65.h, + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 3, + ), + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color( + 0xFF6B6B6B, //첫번째 level 박스 + ) /* dark-gray */, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 2.96.w, + color: const Color( + 0xFFC4CAD4, + ) /* gray */, + ), + borderRadius: BorderRadius.circular( + 29.57.w, + ), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + spacing: 29.57.w, + children: [ + Text( + 'level', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color( + 0xFFffffff, + ) /* gray */, + fontSize: 36.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w400, + ), + ), + ], ), ), ], @@ -403,306 +390,443 @@ class _DetailRankingState extends State { ), ], ), - ), - ], - ), - Text( - '20 p', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, - letterSpacing: -0.50.w, + Text( + '1000 p', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + letterSpacing: -0.50.w, + ), + ), + ], ), ), - ], + ), ), - ), - ), - Positioned( - left: 193.w, - top: 520.h, - child: SizedBox( - width: 800.w, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( + Positioned( + left: 193.w, + top: 1168.h, + child: SizedBox( + width: 800.w, + child: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, - spacing: 42.w, children: [ - Container( - width: 150.w, - height: 150.h, - decoration: ShapeDecoration( - image: DecorationImage( - image: NetworkImage("https://placehold.co/150x150"), - fit: BoxFit.cover, - ), - shape: OvalBorder( - side: BorderSide( - width: 1.68.w, - color: const Color(0xFFC4CAD4) /* gray */, - ), - ), - ), - ), - SizedBox( - width: 300.w, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 23.w, - children: [ - Text( - 'Groupname', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - ), - ), - Container( - width: 123.31.w, - height: 66.65.h, - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 3, + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 42.w, + children: [ + Container( + width: 150.w, + height: 150.h, + decoration: ShapeDecoration( + image: DecorationImage( + image: NetworkImage( + "https://placehold.co/150x150", + ), + fit: BoxFit.cover, ), - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color( - 0xFF6B6B6B, - ) /* dark-gray */, // 두번째 level 박스 - shape: RoundedRectangleBorder( - side: BorderSide( - width: 2.96.w, - color: const Color(0xFFC4CAD4) /* gray */, - ), - borderRadius: BorderRadius.circular(29.57.w), + shape: OvalBorder( + side: BorderSide( + width: 1.68.w, + color: const Color(0xFFC4CAD4) /* gray */, ), ), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 29.57.w, - children: [ - Text( - 'level', - textAlign: TextAlign.center, + ), + ), + SizedBox( + width: 241.w, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 23.w, + children: [ + SizedBox( + width: 241.w, + height: 60.h, + child: Text( + 'Username', style: TextStyle( - color: const Color(0xFFFFFFFF) /* gray */, - fontSize: 36.w, + color: Colors.white /* white */, + fontSize: 50.w, fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w600, ), ), - ], - ), + ), + Container( + width: 123.31.w, + height: 66.65.h, + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 3, + ), + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color( + 0xFF6B6B6B, + ) /* dark-gray */, // 세 번째 level 박스 + shape: RoundedRectangleBorder( + side: BorderSide( + width: 2.96.w, + color: const Color( + 0xFFC4CAD4, + ) /* gray */, + ), + borderRadius: BorderRadius.circular( + 29.57.w, + ), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + spacing: 29.57.w, + children: [ + Text( + 'level', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: 36.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], ), - ], + ), + ], + ), + Text( + '20 p', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + letterSpacing: -0.50.w, ), ), ], ), - Text( - '988 p', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, - letterSpacing: -0.50.w, - ), - ), - ], + ), ), - ), - ), - Positioned( - left: 193.w, - top: 1440.h, - child: SizedBox( - width: 800.w, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( + Positioned( + left: 193.w, + top: 520.h, + child: SizedBox( + width: 800.w, + child: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, - spacing: 42.w, children: [ - Container( - width: 150.w, - height: 150.h, - decoration: ShapeDecoration( - image: DecorationImage( - image: NetworkImage("https://placehold.co/150x150"), - fit: BoxFit.cover, + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 42.w, + children: [ + Container( + width: 150.w, + height: 150.h, + decoration: ShapeDecoration( + image: DecorationImage( + image: NetworkImage( + "https://placehold.co/150x150", + ), + fit: BoxFit.cover, + ), + shape: OvalBorder( + side: BorderSide( + width: 1.68.w, + color: const Color(0xFFC4CAD4) /* gray */, + ), + ), + ), ), - shape: OvalBorder( - side: BorderSide( - width: 1.68.w, - color: const Color(0xFFC4CAD4) /* gray */, + SizedBox( + width: 300.w, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 23.w, + children: [ + Text( + 'Groupname', + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + ), + ), + Container( + width: 123.31.w, + height: 66.65.h, + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 3, + ), + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color( + 0xFF6B6B6B, + ) /* dark-gray */, // 두번째 level 박스 + shape: RoundedRectangleBorder( + side: BorderSide( + width: 2.96.w, + color: const Color( + 0xFFC4CAD4, + ) /* gray */, + ), + borderRadius: BorderRadius.circular( + 29.57.w, + ), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + spacing: 29.57.w, + children: [ + Text( + 'level', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color( + 0xFFFFFFFF, + ) /* gray */, + fontSize: 36.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], ), ), + ], + ), + Text( + '988 p', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + letterSpacing: -0.50.w, ), ), - SizedBox( - width: 241.w, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 23.w, - children: [ - SizedBox( - width: 241.w, - height: 60.h, - child: Text( - 'Username', - style: TextStyle( - color: Colors.white /* white */, - fontSize: 50.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, + ], + ), + ), + ), + Positioned( + left: 193.w, + top: 1440.h, + child: SizedBox( + width: 800.w, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 42.w, + children: [ + Container( + width: 150.w, + height: 150.h, + decoration: ShapeDecoration( + image: DecorationImage( + image: NetworkImage( + "https://placehold.co/150x150", ), + fit: BoxFit.cover, ), - ), - Container( - width: 123.31.w, - height: 66.65.h, - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 3, - ), - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color( - 0xFF6B6B6B, - ) /* dark-gray */, // 네 번째 level 박스 - shape: RoundedRectangleBorder( - side: BorderSide( - width: 2.96.w, - color: const Color(0xFFC4CAD4) /* gray */, - ), - borderRadius: BorderRadius.circular(29.57.w), + shape: OvalBorder( + side: BorderSide( + width: 1.68.w, + color: const Color(0xFFC4CAD4) /* gray */, ), ), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 29.57.w, - children: [ - Text( - 'level', - textAlign: TextAlign.center, + ), + ), + SizedBox( + width: 241.w, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 23.w, + children: [ + SizedBox( + width: 241.w, + height: 60.h, + child: Text( + 'Username', style: TextStyle( - color: const Color(0xFFFfffff) /* gray */, - fontSize: 36.w, + color: Colors.white /* white */, + fontSize: 50.w, fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w600, ), ), - ], - ), + ), + Container( + width: 123.31.w, + height: 66.65.h, + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 3, + ), + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color( + 0xFF6B6B6B, + ) /* dark-gray */, // 네 번째 level 박스 + shape: RoundedRectangleBorder( + side: BorderSide( + width: 2.96.w, + color: const Color( + 0xFFC4CAD4, + ) /* gray */, + ), + borderRadius: BorderRadius.circular( + 29.57.w, + ), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + spacing: 29.57.w, + children: [ + Text( + 'level', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color( + 0xFFFfffff, + ) /* gray */, + fontSize: 36.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], ), - ], + ), + ], + ), + Text( + '15 p', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white /* white */, + fontSize: 50.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w700, + letterSpacing: -0.50.h, ), ), ], ), - Text( - '15 p', + ), + ), + Positioned( + left: 85.w, + top: 290.h, + child: Opacity( + opacity: 0.50.w, + child: Text( + '26', textAlign: TextAlign.center, style: TextStyle( color: Colors.white /* white */, - fontSize: 50.w, + fontSize: 55.w, fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w700, - letterSpacing: -0.50.h, + fontWeight: FontWeight.w600, + letterSpacing: -0.55.w, ), ), - ], - ), - ), - ), - Positioned( - left: 85.w, - top: 290.h, - child: Opacity( - opacity: 0.50.w, - child: Text( - '26', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white /* white */, - fontSize: 55.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - letterSpacing: -0.55.w, ), ), - ), - ), - Positioned( - left: 104.w, - top: 1210.h, - child: Text( - '1', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color(0xFFFF9F1C) /* main-orange */, - fontSize: 55.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - letterSpacing: -0.55.h, + Positioned( + left: 104.w, + top: 1210.h, + child: Text( + '1', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xFFFF9F1C) /* main-orange */, + fontSize: 55.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.55.h, + ), + ), ), - ), - ), - Positioned( - left: 85.w, - top: 562.h, - child: Text( - '27', - textAlign: TextAlign.center, - style: TextStyle( - color: const Color(0xFFFF9F1C) /* main-orange */, - fontSize: 55.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - letterSpacing: -0.55.w, + Positioned( + left: 85.w, + top: 562.h, + child: Text( + '27', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xFFFF9F1C) /* main-orange */, + fontSize: 55.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.55.w, + ), + ), ), - ), - ), - Positioned( - left: 100.w, - top: 1482.h, - child: Text( - '2', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white /* white */, - fontSize: 55.w, - fontFamily: 'Wanted Sans', - fontWeight: FontWeight.w600, - letterSpacing: -0.55.h, + Positioned( + left: 100.w, + top: 1482.h, + child: Text( + '2', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white /* white */, + fontSize: 55.w, + fontFamily: 'Wanted Sans', + fontWeight: FontWeight.w600, + letterSpacing: -0.55.h, + ), + ), ), - ), + ], ), ], ), diff --git a/lib/features/study/ui/make_group/study_make_group_name_screen.dart b/lib/features/study/ui/make_group/study_make_group_name_screen.dart index 179fc91..c8bacfa 100644 --- a/lib/features/study/ui/make_group/study_make_group_name_screen.dart +++ b/lib/features/study/ui/make_group/study_make_group_name_screen.dart @@ -75,15 +75,7 @@ class _StudyMakeGroupName extends State { ), ); - user.joinedGroups = [ - ...user.joinedGroups, - GroupModel( - authorId: user.email, - name: groupName, - tags: tags, - imageUrl: imagePath, - ), - ]; + try { var response = await request.send(); // 🚀 요청 전송 diff --git a/lib/features/study/ui/study_screen.dart b/lib/features/study/ui/study_screen.dart index 525468d..baa41d4 100644 --- a/lib/features/study/ui/study_screen.dart +++ b/lib/features/study/ui/study_screen.dart @@ -1,7 +1,6 @@ import 'package:componentss/core/user_provider.dart'; import 'package:componentss/features/study/data/group_api.dart'; import 'package:componentss/features/study/data/group_model.dart'; -import 'package:componentss/features/study/data/tempGroup.dart'; import 'package:componentss/features/study/ui/group_detail/group_detaill.dart'; import 'package:componentss/features/study/ui/search_group/search_group_screen.dart'; import 'package:componentss/features/study/ui/make_group/study_make_group_screen.dart'; diff --git a/lib/features/study/ui/widgets/interview_schedule_card.dart b/lib/features/study/ui/widgets/interview_schedule_card.dart index 5673e5f..988c598 100644 --- a/lib/features/study/ui/widgets/interview_schedule_card.dart +++ b/lib/features/study/ui/widgets/interview_schedule_card.dart @@ -1,5 +1,4 @@ import 'package:componentss/features/study/data/group_model.dart'; -import 'package:componentss/features/study/data/tempGroup.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/lib/features/study/ui/widgets/ranking_card.dart b/lib/features/study/ui/widgets/ranking_card.dart index 758c5f5..f16276e 100644 --- a/lib/features/study/ui/widgets/ranking_card.dart +++ b/lib/features/study/ui/widgets/ranking_card.dart @@ -1,5 +1,4 @@ import 'package:componentss/features/study/data/group_model.dart'; -import 'package:componentss/features/study/data/tempGroup.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter/material.dart';