diff --git a/unibond/auth-jwt-0.0.1-SNAPSHOT.jar b/unibond/auth-jwt-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000..025290e Binary files /dev/null and b/unibond/auth-jwt-0.0.1-SNAPSHOT.jar differ diff --git a/unibond/lib/controller/dto/letter_req_dto.dart b/unibond/lib/controller/dto/letter_req_dto.dart new file mode 100644 index 0000000..0403872 --- /dev/null +++ b/unibond/lib/controller/dto/letter_req_dto.dart @@ -0,0 +1,17 @@ +class LetterReqDto { + String receiverId; + String content; + String title; + + LetterReqDto({ + required this.receiverId, + required this.title, + required this.content, + }); + + Map toJson() => { + 'receiverId': receiverId, + 'title': title, + 'content': content, + }; +} diff --git a/unibond/lib/controller/letter_controller.dart b/unibond/lib/controller/letter_controller.dart index e69de29..36831e6 100644 --- a/unibond/lib/controller/letter_controller.dart +++ b/unibond/lib/controller/letter_controller.dart @@ -0,0 +1,24 @@ +import 'package:get/get.dart'; +import 'package:unibond/controller/dto/letter_req_dto.dart'; +import 'package:unibond/domain/letter/letter.dart'; +import 'package:unibond/domain/letter/letter_provider.dart'; +import 'package:unibond/domain/letter/letter_repository.dart'; + +class LetterController extends GetxController { + final LetterRepository _letterRepository = LetterRepository(); + + Future sendLetter( + String receiverId, + String title, + String content, + ) async { + try { + bool isSuccess = + await _letterRepository.sendLetter(receiverId, title, content); + return isSuccess; + } catch (error) { + print('sendLetter error: $error'); + rethrow; + } + } +} diff --git a/unibond/lib/domain/letter/letter_provider.dart b/unibond/lib/domain/letter/letter_provider.dart index 8b13789..f3d4d35 100644 --- a/unibond/lib/domain/letter/letter_provider.dart +++ b/unibond/lib/domain/letter/letter_provider.dart @@ -1 +1,13 @@ +import 'package:get/get.dart'; +import 'package:unibond/controller/dto/letter_req_dto.dart'; +import 'package:unibond/domain/letter/letter_provider.dart'; +import 'package:unibond/util/userIdNum.dart'; +const host = "http://3.35.110.214"; + +class LetterProvider extends GetConnect { + Future sendLetter(Map data) => post( + '$host/api/v1/letters', + headers: {"Authorization": "26"}, // 실제 userIdNum을 넣어야함 + data); +} diff --git a/unibond/lib/domain/letter/letter_repository.dart b/unibond/lib/domain/letter/letter_repository.dart index e69de29..92d58a3 100644 --- a/unibond/lib/domain/letter/letter_repository.dart +++ b/unibond/lib/domain/letter/letter_repository.dart @@ -0,0 +1,30 @@ +import 'package:get/get.dart'; +import 'package:unibond/controller/dto/letter_req_dto.dart'; +import 'package:unibond/domain/letter/letter_provider.dart'; + +const host = "http://3.35.110.214"; + +class LetterRepository { + final LetterProvider _letterProvider = LetterProvider(); + + Future sendLetter( + String receiverId, String title, String content) async { + try { + final LetterReqDto letterReqDto = LetterReqDto( + receiverId: receiverId, + title: title, + content: content, + ); + + print(letterReqDto.toJson()); + Response response = + await _letterProvider.sendLetter(letterReqDto.toJson()); + + bool isSuccess = response.body["isSuccess"]; + return isSuccess; + } catch (error) { + print("Failed: $error"); + rethrow; + } + } +} diff --git a/unibond/lib/main.dart b/unibond/lib/main.dart index 88e5c59..5f1e3c4 100644 --- a/unibond/lib/main.dart +++ b/unibond/lib/main.dart @@ -9,11 +9,10 @@ void main() async { runApp(const MaterialApp( home: MyApp(), )); + } class MyApp extends StatelessWidget { - const MyApp({super.key}); - @override Widget build(BuildContext context) { return GetMaterialApp( @@ -35,3 +34,10 @@ class MyApp extends StatelessWidget { ); } } + +class InitialBinding extends Bindings { + @override + void dependencies() { + Get.put(LetterController()); // LetterController를 등록합니다. + } +} diff --git a/unibond/lib/util/userIdNum b/unibond/lib/util/userIdNum new file mode 100644 index 0000000..e69de29 diff --git a/unibond/lib/view/screens/letter/letter_write_screen.dart b/unibond/lib/view/screens/letter/letter_write_screen.dart index c825d4b..9ed1f83 100644 --- a/unibond/lib/view/screens/letter/letter_write_screen.dart +++ b/unibond/lib/view/screens/letter/letter_write_screen.dart @@ -1,27 +1,25 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:unibond/controller/dto/letter_req_dto.dart'; +import 'package:unibond/controller/letter_controller.dart'; +import 'package:unibond/util/validator_util.dart'; +import 'package:unibond/view/screens/home_screen.dart'; +import 'package:unibond/view/widgets/custon_elevated_button.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; -class LetterWriteScreen extends StatefulWidget { - const LetterWriteScreen({super.key}); - - @override - _LetterWriteScreenState createState() => _LetterWriteScreenState(); -} +class LetterWriteScreen extends StatelessWidget { + final _formKey = GlobalKey(); -class _LetterWriteScreenState extends State { - final TextEditingController _titleController = TextEditingController(); - final TextEditingController _contentController = TextEditingController(); + final _titleController = TextEditingController(); + final _contentController = TextEditingController(); - @override - void dispose() { - _titleController.dispose(); - _contentController.dispose(); - super.dispose(); - } + LetterWriteScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { + final l = Get.find(); + return Scaffold( appBar: AppBar( centerTitle: true, @@ -32,41 +30,53 @@ class _LetterWriteScreenState extends State { Get.back(); }, ), - actions: [ - IconButton( - icon: const Icon(Icons.send), - onPressed: () { - // 편지 전송하는 코드 추가 - showToastMessage(); - Get.back(); // 이전 화면 이동 - }, - ) - ], ), body: Padding( padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - TextField( - controller: _titleController, - decoration: const InputDecoration( - labelText: "제목", - border: OutlineInputBorder(), - ), - ), - const SizedBox(height: 16), - Expanded( - child: TextField( - controller: _contentController, - maxLines: null, - expands: true, + child: Form( + key: _formKey, + child: Column( + children: [ + TextField( + controller: _titleController, decoration: const InputDecoration( - hintText: "내용을 입력하세요...", + labelText: "제목", border: OutlineInputBorder(), ), ), - ), - ], + const SizedBox(height: 16), + Expanded( + child: TextField( + controller: _contentController, + maxLines: null, + expands: true, + decoration: const InputDecoration( + hintText: "내용을 입력하세요...", + border: OutlineInputBorder(), + ), + ), + ), + CustomElevatedButton( + text: "편지 전송", + screenRoute: () async { + if (isValid(_formKey)) { + var isSuccess = await l.sendLetter( + "30", + _titleController.text.trim(), + _contentController.text.trim(), + ); + if (isSuccess == true) { + showToastMessage(); + print('편지 전송 성공'); + Get.off(() => const HomeScreen()); + } else { + print('편지 전송 실패'); + } + } + }, + ), + ], + ), ), ), ); diff --git a/unibond/lib/view/widgets/custom_letter_area.dart b/unibond/lib/view/widgets/custom_letter_area.dart new file mode 100644 index 0000000..ab4fb59 --- /dev/null +++ b/unibond/lib/view/widgets/custom_letter_area.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +class CustomLetterArea extends StatelessWidget { + final String hint; + final TextEditingController controller; + final funvalidator; + final String? value; + + const CustomLetterArea({ + super.key, + required this.hint, + required this.controller, + required this.funvalidator, + this.value, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 5.0), + child: TextFormField( + controller: controller, + maxLines: null, + expands: true, + decoration: InputDecoration( + hintText: "$hint을(를) 입력하세요", + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + ), + ), + ); + } +} diff --git a/unibond/lib/view/widgets/custom_letter_elevated_button.dart b/unibond/lib/view/widgets/custom_letter_elevated_button.dart new file mode 100644 index 0000000..4df2ed8 --- /dev/null +++ b/unibond/lib/view/widgets/custom_letter_elevated_button.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +class CustomLetterElevatedButton extends StatelessWidget { + final String text; + final Future Function() funPageRoute; + + const CustomLetterElevatedButton({ + Key? key, + required this.text, + required this.funPageRoute, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: const Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + ), + onPressed: () async { + await funPageRoute(); + }, + child: Text("$text"), + ); + } +} diff --git a/unibond/lib/view/widgets/custom_letter_form_field.dart b/unibond/lib/view/widgets/custom_letter_form_field.dart new file mode 100644 index 0000000..a3fbeef --- /dev/null +++ b/unibond/lib/view/widgets/custom_letter_form_field.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +class CustomLetterFormField extends StatelessWidget { + final String hint; + final TextEditingController controller; + final funvalidator; + final String? value; + + const CustomLetterFormField({ + super.key, + required this.hint, + required this.controller, + required this.funvalidator, + this.value, + required InputDecoration decoration, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 5.0), + child: TextFormField( + validator: funvalidator, + controller: controller, + decoration: InputDecoration( + // ignore: unnecessary_string_interpolations + hintText: hint == "이메일" ? "$hint을 입력하세요" : "$hint를 입력하세요", + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + ), + ), + ); + } +} diff --git a/unibond/lib/view/widgets/custom_text_form_field.dart b/unibond/lib/view/widgets/custom_text_form_field.dart index d040873..21e6638 100644 --- a/unibond/lib/view/widgets/custom_text_form_field.dart +++ b/unibond/lib/view/widgets/custom_text_form_field.dart @@ -18,8 +18,8 @@ class CustomTextFormField extends StatelessWidget { return Padding( padding: const EdgeInsets.symmetric(vertical: 5.0), child: TextFormField( - controller: controller, - initialValue: value, + // controller: controller, + // initialValue: value, validator: funvalidator, obscureText: hint == "비밀번호" ? true : false, style: const TextStyle(fontSize: 14), diff --git a/unibond/lib/view/widgets/custon_elevated_button.dart b/unibond/lib/view/widgets/custon_elevated_button.dart index 03d38c2..ee24576 100644 --- a/unibond/lib/view/widgets/custon_elevated_button.dart +++ b/unibond/lib/view/widgets/custon_elevated_button.dart @@ -1,5 +1,3 @@ -// ignore_for_file: unnecessary_string_interpolations - import 'package:flutter/material.dart'; class CustomElevatedButton extends StatelessWidget { diff --git a/unibond/pubspec.lock b/unibond/pubspec.lock index ccb6254..5644cfb 100644 --- a/unibond/pubspec.lock +++ b/unibond/pubspec.lock @@ -1048,4 +1048,4 @@ sdks: version: "13.0.0" sdks: dart: ">=3.2.0-0 <4.0.0" - flutter: ">=1.10.0" + flutter: ">=1.10.0" \ No newline at end of file diff --git a/unibond/test/widget_test.dart b/unibond/test/widget_test.dart index 2cad708..5a2cc61 100644 --- a/unibond/test/widget_test.dart +++ b/unibond/test/widget_test.dart @@ -13,7 +13,7 @@ import 'package:unibond/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); + await tester.pumpWidget(MyApp()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget);