diff --git a/asset/image/icon/payment/ic_kakaopay.svg b/asset/image/icon/payment/ic_kakaopay.svg new file mode 100644 index 00000000..adb456b5 --- /dev/null +++ b/asset/image/icon/payment/ic_kakaopay.svg @@ -0,0 +1,44 @@ + + + + diff --git a/asset/image/icon/payment/ic_kakaopay_radio.svg b/asset/image/icon/payment/ic_kakaopay_radio.svg deleted file mode 100644 index f42a7493..00000000 --- a/asset/image/icon/payment/ic_kakaopay_radio.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/lib/model/card_info/card_info.dart b/lib/model/card_info/card_info.dart new file mode 100644 index 00000000..8c8bdeac --- /dev/null +++ b/lib/model/card_info/card_info.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'card_info.freezed.dart'; +part 'card_info.g.dart'; + +@freezed +class CardInfo with _$CardInfo { + const factory CardInfo({ + required int id, + required String cardCode, + required String? cardName, + required String cardNo, + required String cardAbleStatus, + }) = _CardInfo; + factory CardInfo.fromJson(Map json) => _$CardInfoFromJson(json); +} \ No newline at end of file diff --git a/lib/model/card_info/card_info.freezed.dart b/lib/model/card_info/card_info.freezed.dart new file mode 100644 index 00000000..7e018080 --- /dev/null +++ b/lib/model/card_info/card_info.freezed.dart @@ -0,0 +1,238 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'card_info.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +CardInfo _$CardInfoFromJson(Map json) { + return _CardInfo.fromJson(json); +} + +/// @nodoc +mixin _$CardInfo { + int get id => throw _privateConstructorUsedError; + String get cardCode => throw _privateConstructorUsedError; + String? get cardName => throw _privateConstructorUsedError; + String get cardNo => throw _privateConstructorUsedError; + String get cardAbleStatus => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $CardInfoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CardInfoCopyWith<$Res> { + factory $CardInfoCopyWith(CardInfo value, $Res Function(CardInfo) then) = + _$CardInfoCopyWithImpl<$Res, CardInfo>; + @useResult + $Res call( + {int id, + String cardCode, + String? cardName, + String cardNo, + String cardAbleStatus}); +} + +/// @nodoc +class _$CardInfoCopyWithImpl<$Res, $Val extends CardInfo> + implements $CardInfoCopyWith<$Res> { + _$CardInfoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? cardCode = null, + Object? cardName = freezed, + Object? cardNo = null, + Object? cardAbleStatus = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + cardCode: null == cardCode + ? _value.cardCode + : cardCode // ignore: cast_nullable_to_non_nullable + as String, + cardName: freezed == cardName + ? _value.cardName + : cardName // ignore: cast_nullable_to_non_nullable + as String?, + cardNo: null == cardNo + ? _value.cardNo + : cardNo // ignore: cast_nullable_to_non_nullable + as String, + cardAbleStatus: null == cardAbleStatus + ? _value.cardAbleStatus + : cardAbleStatus // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$CardInfoImplCopyWith<$Res> + implements $CardInfoCopyWith<$Res> { + factory _$$CardInfoImplCopyWith( + _$CardInfoImpl value, $Res Function(_$CardInfoImpl) then) = + __$$CardInfoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int id, + String cardCode, + String? cardName, + String cardNo, + String cardAbleStatus}); +} + +/// @nodoc +class __$$CardInfoImplCopyWithImpl<$Res> + extends _$CardInfoCopyWithImpl<$Res, _$CardInfoImpl> + implements _$$CardInfoImplCopyWith<$Res> { + __$$CardInfoImplCopyWithImpl( + _$CardInfoImpl _value, $Res Function(_$CardInfoImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? cardCode = null, + Object? cardName = freezed, + Object? cardNo = null, + Object? cardAbleStatus = null, + }) { + return _then(_$CardInfoImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + cardCode: null == cardCode + ? _value.cardCode + : cardCode // ignore: cast_nullable_to_non_nullable + as String, + cardName: freezed == cardName + ? _value.cardName + : cardName // ignore: cast_nullable_to_non_nullable + as String?, + cardNo: null == cardNo + ? _value.cardNo + : cardNo // ignore: cast_nullable_to_non_nullable + as String, + cardAbleStatus: null == cardAbleStatus + ? _value.cardAbleStatus + : cardAbleStatus // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$CardInfoImpl implements _CardInfo { + const _$CardInfoImpl( + {required this.id, + required this.cardCode, + required this.cardName, + required this.cardNo, + required this.cardAbleStatus}); + + factory _$CardInfoImpl.fromJson(Map json) => + _$$CardInfoImplFromJson(json); + + @override + final int id; + @override + final String cardCode; + @override + final String? cardName; + @override + final String cardNo; + @override + final String cardAbleStatus; + + @override + String toString() { + return 'CardInfo(id: $id, cardCode: $cardCode, cardName: $cardName, cardNo: $cardNo, cardAbleStatus: $cardAbleStatus)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CardInfoImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.cardCode, cardCode) || + other.cardCode == cardCode) && + (identical(other.cardName, cardName) || + other.cardName == cardName) && + (identical(other.cardNo, cardNo) || other.cardNo == cardNo) && + (identical(other.cardAbleStatus, cardAbleStatus) || + other.cardAbleStatus == cardAbleStatus)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => + Object.hash(runtimeType, id, cardCode, cardName, cardNo, cardAbleStatus); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$CardInfoImplCopyWith<_$CardInfoImpl> get copyWith => + __$$CardInfoImplCopyWithImpl<_$CardInfoImpl>(this, _$identity); + + @override + Map toJson() { + return _$$CardInfoImplToJson( + this, + ); + } +} + +abstract class _CardInfo implements CardInfo { + const factory _CardInfo( + {required final int id, + required final String cardCode, + required final String? cardName, + required final String cardNo, + required final String cardAbleStatus}) = _$CardInfoImpl; + + factory _CardInfo.fromJson(Map json) = + _$CardInfoImpl.fromJson; + + @override + int get id; + @override + String get cardCode; + @override + String? get cardName; + @override + String get cardNo; + @override + String get cardAbleStatus; + @override + @JsonKey(ignore: true) + _$$CardInfoImplCopyWith<_$CardInfoImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/model/card_info/card_info.g.dart b/lib/model/card_info/card_info.g.dart new file mode 100644 index 00000000..62bb830d --- /dev/null +++ b/lib/model/card_info/card_info.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'card_info.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$CardInfoImpl _$$CardInfoImplFromJson(Map json) => + _$CardInfoImpl( + id: json['id'] as int, + cardCode: json['cardCode'] as String, + cardName: json['cardName'] as String?, + cardNo: json['cardNo'] as String, + cardAbleStatus: json['cardAbleStatus'] as String, + ); + +Map _$$CardInfoImplToJson(_$CardInfoImpl instance) => + { + 'id': instance.id, + 'cardCode': instance.cardCode, + 'cardName': instance.cardName, + 'cardNo': instance.cardNo, + 'cardAbleStatus': instance.cardAbleStatus, + }; diff --git a/lib/modules/payment/controller/payment_controller.dart b/lib/modules/payment/controller/payment_controller.dart index 1065db3b..df97a752 100644 --- a/lib/modules/payment/controller/payment_controller.dart +++ b/lib/modules/payment/controller/payment_controller.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:match/model/card_info/card_info.dart'; import 'package:match/model/match_history/match_history.dart'; import 'package:match/modules/project/controller/project_controller.dart'; import 'package:match/provider/api/order_api.dart'; @@ -23,6 +24,11 @@ class PaymentController extends GetxController { //TODO) 후원자 정보 Rx donator = tmpDonator.obs; + //TODO) 카드 정보 + RxList cardInfoList = [].obs; + RxList cardCodeList = [tmpCardInfo.cardCode].obs; + RxList cardNumList = [tmpCardInfo.cardNo].obs; + RxList cardIdList = [tmpCardInfo.id].obs; //TODO) 기부금 정보 final RxBool isPayAble = false.obs; //금액, 날짜 선택 모두 했는지 @@ -38,6 +44,7 @@ class PaymentController extends GetxController { } } + //TODO) 결제 정보 /// 동의항목 var selectedItems = [].obs; @@ -46,7 +53,10 @@ class PaymentController extends GetxController { void selectCard(int index) { selectedCardIndex.value = index; } + /// 결제할 카드 & 프로젝트 정보 + RxInt cardId = 1.obs; + //TODO) 카드 신규 등록 /// 카드 번호 Rx cardNumTextController = TextEditingController().obs; /// 유효기간 @@ -62,6 +72,11 @@ class PaymentController extends GetxController { void onInit() async { super.onInit(); payList.assignAll(await PaymentApi.getPaymentDetail(regularPayId: id)); + cardInfoList.assignAll(await OrderApi.getCardList()); + cardCodeList.assignAll(cardInfoList.map((card) => card.cardCode.toString()).toList()); + cardNumList.assignAll(cardInfoList.map((card) => card.cardNo).toList()); + cardIdList.assignAll(cardInfoList.map((card) => card.id).toList()); + donateState.value = _projectController.projectDetail.value.regularStatus; } } diff --git a/lib/modules/payment/view/payment_card_info_view.dart b/lib/modules/payment/view/payment_card_info_view.dart index 7c413a98..de527008 100644 --- a/lib/modules/payment/view/payment_card_info_view.dart +++ b/lib/modules/payment/view/payment_card_info_view.dart @@ -1,8 +1,15 @@ +import 'dart:ffi'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:match/model/card_info/card_info.dart'; +import 'package:match/modules/payment/view/payment_method_info_view.dart'; import 'package:match/modules/payment/widget/select_pay_method_widget.dart'; +import 'package:match/provider/api/order_api.dart'; import 'package:match/util/components/gloabl_text_field.dart'; import 'package:match/util/components/global_app_bar.dart'; import 'package:match/util/components/global_button.dart'; @@ -30,11 +37,13 @@ class PaymentRegisterCardInfoScreen extends GetView { ['기타','ic_card_etc.svg',''], //나머지 모든 카드 '' 이면 전부 기타카드 ]; - final String cardNum = ''; - final String cardExp = ''; - final String cardCvc = ''; - final String cardUserBirth = ''; - final String cardPw = ''; + String cardNum = ''; + String cardExp = ''; + String cardCvc = ''; + String cardUserBirth = ''; + String cardPw = ''; + String cardExpYear = ''; + String cardExpMonth = ''; PaymentRegisterCardInfoScreen({Key? key, required this.selectedCardName}) : super(key: key); @@ -140,7 +149,8 @@ class PaymentRegisterCardInfoScreen extends GetView { CommonInputField.cardNum( textController : controller.cardNumTextController.value, onChange: (value) async { - print(">>> 입력한 카드번호: $value"); + cardNum = value; + print(">>> 입력한 카드번호: $cardNum"); }), SizedBox(height: 37.h), @@ -159,7 +169,12 @@ class PaymentRegisterCardInfoScreen extends GetView { child: CommonInputField.cardExp( textController : controller.cardExpTextController.value, onChange: (value) async { + cardExp = value; + cardExpYear = value.substring(2,4); + cardExpMonth = value.substring(0,2); print(">>> 입력한 유효기간: $value"); + print(">>> 입력한 유효기간 year: ${cardExpYear}"); + print(">>> 입력한 유효기간 month: ${cardExpMonth}"); }), ), ], @@ -186,7 +201,8 @@ class PaymentRegisterCardInfoScreen extends GetView { child: CommonInputField.cardCvc( textController : controller.cardCVCTextController.value, onChange: (value) async { - print(">>> 입력한 CVC: $value"); + cardCvc = value; + print(">>> 입력한 CVC: $cardCvc"); }), ), ], @@ -218,7 +234,8 @@ class PaymentRegisterCardInfoScreen extends GetView { child: CommonInputField.cardUserBirth( textController : controller.cardUserBirthTextController.value, onChange: (value) async { - print(">>> 입력한 생년월일: $value"); + cardUserBirth = value; + print(">>> 입력한 생년월일: $cardUserBirth"); }), ), ], @@ -245,7 +262,8 @@ class PaymentRegisterCardInfoScreen extends GetView { child: CommonInputField.cardPw( textController : controller.cardPWTextController.value, onChange: (value) async { - print(">>> 입력한 카드 비밀번호: $value"); + cardPw = value; + print(">>> 입력한 카드 비밀번호: $cardPw"); }), ), ], @@ -255,8 +273,6 @@ class PaymentRegisterCardInfoScreen extends GetView { SizedBox(height: 35.h), - - ], ), ], @@ -281,9 +297,34 @@ class PaymentRegisterCardInfoScreen extends GetView { child: Padding( padding: EdgeInsets.only(left: 6.w, right: 20), child: CommonButton.login( - text: "다음", + text: "등록", onTap: () async { - Get.back(); + if (cardNum != "" && cardExpYear != "" && cardExpMonth != "" && cardUserBirth != "" && cardPw != ""){ + var result = await OrderApi.setCard( + cardNo: cardNum, + expYear: cardExpYear, + expMonth: cardExpMonth, + idNo: cardUserBirth, + cardPw: cardPw); + if(result) { + // PaymentController 인스턴스를 가져옴 + final PaymentController paymentController = Get.find(); + + // 새로운 카드 정보를 가져와서 cardInfoList를 업데이트함 + List newCardInfoList = await OrderApi.getCardList(); + paymentController.cardInfoList.assignAll(newCardInfoList); + paymentController.cardCodeList.assignAll( + newCardInfoList.map((card) => card.cardCode.toString()).toList() + ); + paymentController.cardNumList.assignAll( + newCardInfoList.map((card) => card.cardNo).toList() + ); + + Get.to(PaymentMethodScreen()); + } + } else { + Fluttertoast.showToast(msg: "입력값 중 빈 값이 있습니다. 입력 정보를 다시 확인해주세요."); + } }, ), ), diff --git a/lib/modules/payment/view/payment_done_view.dart b/lib/modules/payment/view/payment_done_view.dart index 65b59548..4abb418a 100644 --- a/lib/modules/payment/view/payment_done_view.dart +++ b/lib/modules/payment/view/payment_done_view.dart @@ -7,6 +7,7 @@ import 'package:intl/intl.dart'; import 'package:match/model/enum/regular_status.dart'; import 'package:match/modules/payment/view/payment_donation_info_view.dart'; import 'package:match/modules/project/controller/project_controller.dart'; +import 'package:match/provider/routes/routes.dart'; import 'package:match/provider/service/auth_service.dart'; import 'package:match/util/components/global_app_bar.dart'; import 'package:match/util/components/global_button.dart'; @@ -194,7 +195,7 @@ class PaymentDoneScreen extends GetView { child: CommonButton.login( text: "확인", onTap: () async { - Get.back(); + Get.offAllNamed(Routes.main); }, ), ), diff --git a/lib/modules/payment/view/payment_method_info_view.dart b/lib/modules/payment/view/payment_method_info_view.dart index 0771a7e5..341a1261 100644 --- a/lib/modules/payment/view/payment_method_info_view.dart +++ b/lib/modules/payment/view/payment_method_info_view.dart @@ -2,10 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import 'package:intl/intl.dart'; import 'package:match/modules/payment/view/payment_done_view.dart'; import 'package:match/modules/payment/widget/select_pay_method_widget.dart'; import 'package:match/modules/project/controller/project_controller.dart'; +import 'package:match/provider/api/order_api.dart'; import 'package:match/util/components/global_app_bar.dart'; import 'package:match/util/components/global_button.dart'; import 'package:match/util/components/global_checkbox.dart'; @@ -172,7 +174,19 @@ class _PaymentScreenState extends State with WidgetsBinding ? CommonButton.login( text: "확인", onTap: () async { - Get.to(PaymentDoneScreen()); + if(state == 'REGULAR') { + var result = await OrderApi.postPay( + cardId: controller.cardId.value, + projectId: _projectController.projectId, + amount: controller.selectedDate.value, + payDate: controller.selectedAmount.value); + if (result){ + Get.to(PaymentDoneScreen()); + } + } + else{ + Get.back(); ///단기결제(2차) + } }, ) : CommonButton.loginDis( diff --git a/lib/modules/payment/widget/card_slider_widget.dart b/lib/modules/payment/widget/card_slider_widget.dart index cd4f6a94..32a3e193 100644 --- a/lib/modules/payment/widget/card_slider_widget.dart +++ b/lib/modules/payment/widget/card_slider_widget.dart @@ -3,7 +3,11 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:match/model/card_info/card_info.dart'; +import 'package:match/modules/payment/controller/payment_controller.dart'; import 'package:match/modules/payment/view/payment_select_card_view.dart'; +import 'package:match/modules/project/controller/project_controller.dart'; import 'package:match/util/const/global_variable.dart'; import 'package:match/util/const/style/global_color.dart'; import 'package:match/util/const/style/global_text_styles.dart'; @@ -15,6 +19,7 @@ class CardSlider extends StatefulWidget { } class _CardSliderState extends State { + final PaymentController _paymentController = Get.find(); final List> cardBankList = [ ['하나','ic_card_hana.svg','374'], @@ -28,46 +33,6 @@ class _CardSliderState extends State { ['우리','ic_card_woori.svg','041'], ['기타','ic_card_etc.svg',''], //나머지 모든 카드 '' 이면 전부 기타카드 ]; - //TODO) 카드정보 - final List> cardInfoList = [ - { - "id": 13, - "cardCode": "365", - "cardName": null, - "cardNo": "1234********2456", - "cardAbleStatus": "사용 가능" - }, - { - "id": 14, - "cardCode": "365", - "cardName": null, - "cardNo": "1111********4444", - "cardAbleStatus": "사용 가능" - }, - { - "id": 15, - "cardCode": "365", - "cardName": null, - "cardNo": "4444********1111", - "cardAbleStatus": "사용 가능" - }, - { - "id": 16, - "cardCode": "365", - "cardName": null, - "cardNo": "7777********7777", - "cardAbleStatus": "사용 가능" - }, - { - "id": 17, - "cardCode": "365", - "cardName": null, - "cardNo": "9999********9999", - "cardAbleStatus": "사용 가능" - } - ]; // id, cardCode, cardNo, cardAbleState 담은 json - final List cardCodeList = ['999','381','374','090']; // 카드 이름만 뽑은 리스트 - final List cardNumList = ['1234********2456','1111********3333','4444********1111','5555********1111']; // 카드 번호만 뽑은 리스트 int _currentSlide = 0; @@ -88,12 +53,15 @@ class _CardSliderState extends State { setState(() { _currentSlide = index; }); - print('>>> 선택한 카드 code : ${cardCodeList[index]} \n 선택한 카드 번호 : ${cardNumList[index]} \n'); + + print('>>> 선택한 카드 code : ${_paymentController.cardCodeList[index]} \n 선택한 카드 번호 : ${_paymentController.cardNumList[index]} \n'); + _paymentController.cardId.value = _paymentController.cardIdList[index]; + print('>>> 선택한 카드 id : ${_paymentController.cardIdList[index]}'); }, ), items: [ - ...cardCodeList.asMap().entries.map((entry) { + ..._paymentController.cardCodeList.asMap().entries.map((entry) { int idx = entry.key; String code = entry.value; @@ -125,13 +93,13 @@ class _CardSliderState extends State { bottom: 20.h, left: 18.w, child: Text( - cardNumList[idx].substring(0, 4) + + _paymentController.cardNumList[idx].substring(0, 4) + ' - **** - **** - ' + - cardNumList[idx].substring(cardNumList[idx].length - 4), + _paymentController.cardNumList[idx].substring(_paymentController.cardNumList[idx].length - 4), style: AppTextStyles.T1Bold14.copyWith(color: AppColors.white) ), ), - if (idx == _currentSlide) // <- 이 부분을 추가 + if (idx == _currentSlide) Positioned( top: 18.h, right: 15.w, @@ -159,9 +127,9 @@ class _CardSliderState extends State { ), SizedBox(height: 20.h), - (_currentSlide != cardCodeList.length) + (_currentSlide != _paymentController.cardCodeList.length) ? Text( - '${_currentSlide + 1}'+'/'+(cardCodeList.length).toString(), + '${_currentSlide + 1}'+'/'+(_paymentController.cardCodeList.length).toString(), style: AppTextStyles.T1Bold14.copyWith(color: AppColors.grey6) ) : Text( diff --git a/lib/modules/payment/widget/select_pay_method_widget.dart b/lib/modules/payment/widget/select_pay_method_widget.dart index a2936c39..4bb30269 100644 --- a/lib/modules/payment/widget/select_pay_method_widget.dart +++ b/lib/modules/payment/widget/select_pay_method_widget.dart @@ -70,7 +70,7 @@ class _DualRadioButtonsState extends State { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - if (widget.state == 'REGULAR') + if (widget.state != 'REGULAR') InkWell( onTap: () { widget.onChanged(widget.option1); diff --git a/lib/provider/api/order_api.dart b/lib/provider/api/order_api.dart index 8f86bd6c..33f864b5 100644 --- a/lib/provider/api/order_api.dart +++ b/lib/provider/api/order_api.dart @@ -1,5 +1,6 @@ import 'package:dio/dio.dart'; import 'package:fluttertoast/fluttertoast.dart'; +import 'package:match/model/card_info/card_info.dart'; import 'package:match/model/donator/donator.dart'; import 'package:match/provider/api/util/global_api_field.dart'; @@ -7,6 +8,75 @@ import '../../util/const/style/global_logger.dart'; import 'util/dio_services.dart'; class OrderApi { + ///

4-2API | 정기 결제용 카드 등록

+ static Future setCard({ + required String cardNo, + required String expYear, + required String expMonth, + required String idNo, + required String cardPw, +}) async { + try { + Response response = await DioServices().to().post("/order/pay/card", + data: {"cardNo": cardNo, "expYear": expYear, "expMonth": expMonth, "idNo": idNo, "cardPw": cardPw}); + if(!response.data[SUCCESS]) { + Fluttertoast.showToast(msg: response.data[MSG]); + logger.e(response.data[CODE]); + } + return response.data[SUCCESS]; + } catch (e) { + logger.e(e.toString()); + return false; + } + } + +///

4-5API | 정기 결제 등록

+ static Future postPay({ + required int cardId, + required int projectId, + required int amount, + required int payDate, +}) async { + try { + Response response = await DioServices().to().post("/order/pay/card/${cardId}/${projectId}", + // queryParameters: { + // "cardId": cardId, + // "projectId": projectId + // }, + data: {"amount": amount, "payDate": payDate}); + + if(!response.data[SUCCESS]) { + Fluttertoast.showToast(msg: response.data[MSG]); + logger.e(response.data[CODE]); + } + return response.data[SUCCESS]; + } catch (e) { + logger.e(e.toString()); + return false; + } + } + + ///

4-3API | 정기 결제용 카드 조회

+ static Future> getCardList() async { + try { + Response response = await DioServices().to().get("/order/pay/card"); + var data = response.data[RESULT]; + + if(data != null) { + return List.generate( + response.data[RESULT].length, + (index) => CardInfo.fromJson(response.data[RESULT][index]), + ); + } + else { + logger.e("response 값이 아무것도 담겨있지 않습니다."); + return []; + } + } catch (e) { + logger.e('>>> 카드 조회 실패: ${e.toString()}'); + return []; + } + } ///

4-7API | 후원자 정보 조회

static Future getProfile() async { diff --git a/lib/provider/api/util/dio_services.dart b/lib/provider/api/util/dio_services.dart index f0f110d8..3adde9b0 100644 --- a/lib/provider/api/util/dio_services.dart +++ b/lib/provider/api/util/dio_services.dart @@ -8,7 +8,7 @@ import 'dio_interceptor.dart'; class DioServices { ///*임시 jwt 토큰 String tmpToken = - "eyJ0eXBlIjoiand0IiwiYWxnIjoiSFM1MTIifQ.eyJ1c2VySWQiOjEsImlhdCI6MTY5OTE0ODU3OCwiZXhwIjoxNjk5MTgwMTE0fQ.UpAcPjsYafU-acbVW_pDADHymYvZR0rMRrkM9Jm5uUH9Nkd975azTN6gtOmIhZ8fl37DzoyMmeXVBrxtJj1bjQ"; + "eyJ0eXBlIjoiand0IiwiYWxnIjoiSFM1MTIifQ.eyJ1c2VySWQiOjQsImlhdCI6MTY5OTIzMjkxMywiZXhwIjoxNjk5MjY0NDQ5fQ.YLWTxFe9NJqS398WFx98uNA8E-c6kDXe16qF3mDCrBwVcbqdKSt3iVSvWlTQRsuUu-h_cJprJGvl_Pj3TZMtFA"; static final DioServices _dioServices = DioServices._internal(); //dioService singleton factory DioServices() => _dioServices; diff --git a/lib/util/components/gloabl_text_field.dart b/lib/util/components/gloabl_text_field.dart index 549fa3fe..ca02beea 100755 --- a/lib/util/components/gloabl_text_field.dart +++ b/lib/util/components/gloabl_text_field.dart @@ -198,7 +198,7 @@ class CommonInputField extends StatelessWidget { alwaysSuffix: false, onSubmitted: (value) async {}, onChanged: onChange, - autoFocus: true); + autoFocus: false); } /// pw 입력 factory CommonInputField.signInPW( @@ -210,7 +210,7 @@ class CommonInputField extends StatelessWidget { alwaysSuffix: false, onSubmitted: (value) async {}, onChanged: onChange, - autoFocus: true); + autoFocus: false); } /// 비밀번호 찾기 factory CommonInputField.findPW( diff --git a/lib/util/const/global_mock_data.dart b/lib/util/const/global_mock_data.dart index 5a2b746a..5da778cb 100644 --- a/lib/util/const/global_mock_data.dart +++ b/lib/util/const/global_mock_data.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:match/model/card_info/card_info.dart'; import 'package:match/model/donator/donator.dart'; import 'package:match/model/notice/notice.dart'; import 'package:match/model/notice_detail/notice_detail.dart'; @@ -124,6 +126,12 @@ var tmpDonator = const Donator( name: "테스트", birthDay: "2001-01-02", phoneNumber: "010-1234-5678"); +var tmpCardInfo = const CardInfo( + id: 1, + cardCode: "041", + cardName: "우리카드", + cardNo: "4170********0825", + cardAbleStatus: "사용 가능"); var tmpNoticeDetail = const NoticeDetail( noticeInfo: Notice( noticeId: 1, noticeType: '소분류', noticeDate: "2023.10.20", title: "fds"),