diff --git a/lib/presentation/album_edit/widget/album_delete_dialog.dart b/lib/presentation/album_edit/widget/album_delete_dialog.dart index 1890ed3b..ddadbf81 100644 --- a/lib/presentation/album_edit/widget/album_delete_dialog.dart +++ b/lib/presentation/album_edit/widget/album_delete_dialog.dart @@ -7,7 +7,6 @@ import 'package:grimity/presentation/album_edit/provider/album_edit_provider.dar void showAlbumDeleteDialog(BuildContext context, WidgetRef ref, Album album) { final alert = GdsAlert( - type: GdsAlertType.content, size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, title: '앨범을 삭제할까요?', description: '앨범을 삭제하면\n그림은 전체 항목으로 이동돼요', diff --git a/lib/presentation/album_organize/view/album_organize_body_view.dart b/lib/presentation/album_organize/view/album_organize_body_view.dart index d37f8200..ccb8d574 100644 --- a/lib/presentation/album_organize/view/album_organize_body_view.dart +++ b/lib/presentation/album_organize/view/album_organize_body_view.dart @@ -115,7 +115,6 @@ class AlbumOrganizeBodyView extends HookConsumerWidget with AlbumOrganizeMixin { } final alert = GdsAlert( - type: GdsAlertType.content, size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, title: '선택한 그림을 삭제할까요?', description: '삭제 이후 되돌릴 수 없어요', diff --git a/lib/presentation/app_update/show_app_update_dialog.dart b/lib/presentation/app_update/show_app_update_dialog.dart index 0a971bc8..69560d18 100644 --- a/lib/presentation/app_update/show_app_update_dialog.dart +++ b/lib/presentation/app_update/show_app_update_dialog.dart @@ -1,10 +1,9 @@ -import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:gds/gds.dart'; import 'package:grimity/app/update/update_factory.dart'; Future showAppUpdateDialog(BuildContext context) { final alert = GdsAlert( - type: GdsAlertType.normal, size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, title: 'Grimity 업데이트 알림', description: '더 나은 서비스를 위해 그리미티 앱이\n업데이트 되었습니다. 최신 앱을 설치해주세요.', diff --git a/lib/presentation/chat/components/show_delete_chats_dialog.dart b/lib/presentation/chat/components/show_delete_chats_dialog.dart index 695d2b0a..2f55fb52 100644 --- a/lib/presentation/chat/components/show_delete_chats_dialog.dart +++ b/lib/presentation/chat/components/show_delete_chats_dialog.dart @@ -7,7 +7,6 @@ import 'package:grimity/domain/dto/chat_request_params.dart'; Future showDeleteChatsDialog({required BuildContext context, required List chatIds}) { final alert = GdsAlert( - type: GdsAlertType.content, size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, title: '채팅방을 나가시겠어요?', description: '지금까지 대화한 내용이 모두 사라지고\n복구가 불가능합니다.', diff --git a/lib/presentation/chat_message/components/show_delete_chat_dialog.dart b/lib/presentation/chat_message/components/show_delete_chat_dialog.dart index 7d7c150d..ac2d84ec 100644 --- a/lib/presentation/chat_message/components/show_delete_chat_dialog.dart +++ b/lib/presentation/chat_message/components/show_delete_chat_dialog.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:gds/gds.dart'; import 'package:go_router/go_router.dart'; import 'package:grimity/app/di/di_setup.dart'; @@ -6,7 +6,6 @@ import 'package:grimity/data/data_source/remote/chat_api.dart'; Future showDeleteChatDialog({required BuildContext context, required String chatId}) { final alert = GdsAlert( - type: GdsAlertType.content, size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, title: '채팅방을 나가시겠어요?', description: '지금까지 대화한 내용이 모두 사라지고\n복구가 불가능합니다.', diff --git a/lib/presentation/chat_message/view/chat_message_app_bar.dart b/lib/presentation/chat_message/view/chat_message_app_bar.dart index 38e2cae4..44bcf8f3 100644 --- a/lib/presentation/chat_message/view/chat_message_app_bar.dart +++ b/lib/presentation/chat_message/view/chat_message_app_bar.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:gds/gds.dart'; import 'package:go_router/go_router.dart'; -import 'package:grimity/app/config/app_router.dart'; import 'package:grimity/app/enum/report.enum.dart'; import 'package:grimity/presentation/chat_message/components/show_delete_chat_dialog.dart'; import 'package:grimity/presentation/chat_message/provider/chat_message_provider.dart'; +import 'package:grimity/presentation/report/report_page.dart'; class ChatMessageAppBar extends ConsumerWidget { const ChatMessageAppBar({super.key, required this.chatId}); @@ -24,7 +24,7 @@ class ChatMessageAppBar extends ConsumerWidget { onBack: () => context.pop(), onReport: () { // 신고 페이지로 이동. - ReportRoute(refType: ReportRefType.chat, refId: chatId).push(context); + ReportPage.push(context, refType: ReportRefType.chat, refId: chatId); }, onSignOut: () => showDeleteChatDialog(context: context, chatId: chatId), ); diff --git a/lib/presentation/comment/widget/comment_fragment.dart b/lib/presentation/comment/widget/comment_fragment.dart index ebd6bd1c..028d40f7 100644 --- a/lib/presentation/comment/widget/comment_fragment.dart +++ b/lib/presentation/comment/widget/comment_fragment.dart @@ -10,6 +10,7 @@ import 'package:grimity/presentation/comment/provider/comments_data_provider.dar import 'package:grimity/presentation/common/hook/layer_link.dart'; import 'package:grimity/presentation/common/provider/user_auth_provider.dart'; import 'package:grimity/presentation/common/widget/popup/grimity_menu_popup.dart'; +import 'package:grimity/presentation/report/report_page.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; class CommentFragment extends HookConsumerWidget { @@ -153,7 +154,7 @@ class CommentFragment extends HookConsumerWidget { label: '신고하기', onTap: () { context.pop(); - ReportRoute(refType: commentType.reportRefType, refId: comment.id).push(context); + ReportPage.push(context, refId: comment.id, refType: commentType.reportRefType); }, ), GdsMenuItem( diff --git a/lib/presentation/common/dialog/cancel_upload_dialog.dart b/lib/presentation/common/dialog/cancel_upload_dialog.dart index 16d50eef..5a2773eb 100644 --- a/lib/presentation/common/dialog/cancel_upload_dialog.dart +++ b/lib/presentation/common/dialog/cancel_upload_dialog.dart @@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart'; Future showCancelUploadDialog(BuildContext context) { final alert = GdsAlert( - type: GdsAlertType.content, size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, title: '업로드를 취소하고 나가시겠어요?', description: '작성한 내용들은 모두 초기화돼요', diff --git a/lib/presentation/common/widget/popup/grimity_modal_bottom_sheet.dart b/lib/presentation/common/widget/popup/grimity_modal_bottom_sheet.dart index 402c5b4e..1aad5673 100644 --- a/lib/presentation/common/widget/popup/grimity_modal_bottom_sheet.dart +++ b/lib/presentation/common/widget/popup/grimity_modal_bottom_sheet.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:grimity/app/config/app_color.dart'; -import 'package:grimity/app/config/app_router.dart'; import 'package:grimity/app/config/app_typeface.dart'; import 'package:grimity/app/enum/report.enum.dart'; import 'package:grimity/presentation/common/widget/grimity_gesture.dart'; +import 'package:grimity/presentation/report/report_page.dart'; class GrimityModalBottomSheet extends StatelessWidget { final List buttons; @@ -68,7 +68,7 @@ class GrimityModalButtonModel { title: '신고하기', onTap: () { context.pop(); - ReportRoute(refType: refType, refId: refId).push(context); + ReportPage.push(context, refId: refId, refType: refType); }, ); } diff --git a/lib/presentation/feed_detail/view/feed_content_view.dart b/lib/presentation/feed_detail/view/feed_content_view.dart index 78629640..6c2245f7 100644 --- a/lib/presentation/feed_detail/view/feed_content_view.dart +++ b/lib/presentation/feed_detail/view/feed_content_view.dart @@ -18,6 +18,7 @@ import 'package:grimity/presentation/common/widget/popup/grimity_menu_popup.dart import 'package:grimity/presentation/common/widget/popup/grimity_share_popup.dart'; import 'package:grimity/presentation/feed_detail/widget/feed_detail_delete_dialog.dart'; import 'package:grimity/presentation/feed_detail/widget/feed_util_bar.dart'; +import 'package:grimity/presentation/report/report_page.dart'; /// 피드 본문 View class FeedContentView extends ConsumerWidget { @@ -128,7 +129,7 @@ class FeedContentView extends ConsumerWidget { label: '신고하기', onTap: () { context.pop(); - ReportRoute(refType: ReportRefType.feed, refId: feed.id).push(context); + ReportPage.push(context, refId: feed.id, refType: ReportRefType.feed); }, ), ], diff --git a/lib/presentation/feed_detail/widget/feed_detail_delete_dialog.dart b/lib/presentation/feed_detail/widget/feed_detail_delete_dialog.dart index 7e0bf21d..19dea0a7 100644 --- a/lib/presentation/feed_detail/widget/feed_detail_delete_dialog.dart +++ b/lib/presentation/feed_detail/widget/feed_detail_delete_dialog.dart @@ -9,7 +9,6 @@ Future showDeleteFeedAlert(String feedId, BuildContext context, WidgetRef final router = ref.read(routerProvider); final alert = GdsAlert( - type: GdsAlertType.content, size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, title: '게시글을 삭제할까요?', description: '삭제 이후 되돌릴 수 없어요', diff --git a/lib/presentation/report/provider/report_provider.dart b/lib/presentation/report/provider/report_provider.dart index 407c8e51..47382e82 100644 --- a/lib/presentation/report/provider/report_provider.dart +++ b/lib/presentation/report/provider/report_provider.dart @@ -13,6 +13,14 @@ part 'report_provider.freezed.dart'; @riverpod class Report extends _$Report { + bool get enabled { + final isOther = state.type == ReportType.other; + final isNotUploading = state.uploading == false; + final isContentNotEmpty = state.content?.trim().isNotEmpty ?? false; + + return isNotUploading && state.type != null && (isOther ? isContentNotEmpty : true); + } + @override ReportState build(ReportRefType refType, String refId) { return ReportState(refType: refType, refId: refId); diff --git a/lib/presentation/report/report_page.dart b/lib/presentation/report/report_page.dart index 0fbd308a..162e3c11 100644 --- a/lib/presentation/report/report_page.dart +++ b/lib/presentation/report/report_page.dart @@ -1,30 +1,42 @@ import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:gds/gds.dart'; +import 'package:grimity/app/config/app_router.dart'; import 'package:grimity/app/enum/report.enum.dart'; -import 'package:grimity/presentation/report/provider/report_argument_provider.dart'; +import 'package:grimity/presentation/common/widget/navigation/grimity_drawer.dart'; +import 'package:grimity/presentation/common/widget/navigation/grimity_title_top_navigation.dart'; import 'package:grimity/presentation/report/report_view.dart'; -import 'package:grimity/presentation/report/widget/report_app_bar.dart'; -import 'package:grimity/presentation/report/view/report_body_view.dart'; -import 'package:grimity/presentation/report/widget/report_send_button.dart'; class ReportPage extends StatelessWidget { - final ReportRefType refType; - final String refId; + const ReportPage({ + super.key, + required this.refId, + required this.refType, + }); - const ReportPage({super.key, required this.refType, required this.refId}); + final String refId; + final ReportRefType refType; @override Widget build(BuildContext context) { - return ProviderScope( - overrides: [ - reportRefTypeArgumentProvider.overrideWithValue(refType), - reportRefIdArgumentProvider.overrideWithValue(refId), - ], - child: ReportView( - reportAppBar: ReportAppBar(), - reportBodyView: ReportBodyView(), - reportSendButton: ReportSendButton(), - ), + return GdsScaffold( + appBar: GrimityTitleTopNavigation(title: '신고하기', showIcons: false), + drawer: GrimityDrawer(), + body: ReportView(refId: refId, refType: refType, isModal: false), ); } + + static Future push( + BuildContext context, { + required String refId, + required ReportRefType refType, + }) { + if (context.isMobile) { + return ReportRoute(refType: refType, refId: refId).push(context); + } else { + final child = ReportView(refId: refId, refType: refType, isModal: true); + final modal = GdsModal(title: '신고하기', body: child); + + return modal.open(context); + } + } } diff --git a/lib/presentation/report/report_view.dart b/lib/presentation/report/report_view.dart index 9dd9e6b0..e3c21d7e 100644 --- a/lib/presentation/report/report_view.dart +++ b/lib/presentation/report/report_view.dart @@ -1,19 +1,29 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:grimity/app/enum/report.enum.dart'; +import 'package:grimity/presentation/report/provider/report_argument_provider.dart'; +import 'package:grimity/presentation/report/view/report_body_view.dart'; class ReportView extends StatelessWidget { const ReportView({ super.key, - required this.reportAppBar, - required this.reportBodyView, - required this.reportSendButton, + required this.refId, + required this.refType, + required this.isModal, }); - final PreferredSizeWidget reportAppBar; - final Widget reportBodyView; - final Widget reportSendButton; + final String refId; + final ReportRefType refType; + final bool isModal; @override Widget build(BuildContext context) { - return Scaffold(appBar: reportAppBar, body: reportBodyView, bottomNavigationBar: reportSendButton); + return ProviderScope( + overrides: [ + reportRefIdArgumentProvider.overrideWithValue(refId), + reportRefTypeArgumentProvider.overrideWithValue(refType), + ], + child: ReportBodyView(isModal: isModal), + ); } } diff --git a/lib/presentation/report/view/report_action_view.dart b/lib/presentation/report/view/report_action_view.dart new file mode 100644 index 00000000..ebb1b8fd --- /dev/null +++ b/lib/presentation/report/view/report_action_view.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:gds/gds.dart'; +import 'package:go_router/go_router.dart'; +import 'package:grimity/presentation/report/provider/report_provider.dart'; +import 'package:grimity/presentation/report/widget/report_confirm_alert.dart'; +import 'package:grimity/presentation/report/widget/report_suceess_alert.dart'; + +class ReportActionView extends ConsumerWidget with ReportMixin { + const ReportActionView({ + super.key, + required this.isModal, + }); + + final bool isModal; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final notifier = reportNotifier(ref); + + final Widget child = Row( + mainAxisSize: MainAxisSize.min, + spacing: GdsSpacing.spacing8, + children: [ + Expanded( + child: GdsOutlinedButton( + size: GdsOutlinedButtonSize.large, + text: '닫기', + expanded: true, + onPressed: context.pop, + ), + ), + Expanded( + child: GdsSolidButton( + size: GdsSolidButtonSize.large, + text: '신고하기', + enabled: notifier.enabled, + expanded: true, + onPressed: () async { + final isAgreed = await showConfirmReportAlert(context); + + // 사용자가 신고하는 것을 최종적으로 동의한 경우 + if (isAgreed ?? false) { + final isSucceeded = await notifier.sendReport(); + + // 사용자가 신고에 최종적으로 성공한 경우 + if (isSucceeded && context.mounted) { + showSuccessReportAlert(context); + } + } + }, + ), + ), + ], + ); + + if (isModal) return child; + + return Padding( + padding: EdgeInsets.only( + top: GdsSpacing.spacing8, + left: GdsSpacing.spacing16, + right: GdsSpacing.spacing16, + bottom: GdsSpacing.spacing24, + ), + child: child, + ); + } +} diff --git a/lib/presentation/report/view/report_body_view.dart b/lib/presentation/report/view/report_body_view.dart index 9e5935b8..3bca6614 100644 --- a/lib/presentation/report/view/report_body_view.dart +++ b/lib/presentation/report/view/report_body_view.dart @@ -1,112 +1,124 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:grimity/presentation/common/widget/grimity_gesture.dart'; -import 'package:grimity/presentation/common/widget/text_field/grimity_text_field.dart'; -import 'package:grimity/presentation/common/widget/system/check/grimity_radio_button.dart'; -import 'package:grimity/presentation/report/provider/report_provider.dart'; +import 'package:gds/gds.dart'; import 'package:gap/gap.dart'; -import 'package:grimity/app/config/app_color.dart'; -import 'package:grimity/app/config/app_typeface.dart'; +import 'package:grimity/presentation/report/provider/report_provider.dart'; import 'package:grimity/app/enum/report.enum.dart'; +import 'package:grimity/presentation/report/view/report_action_view.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; class ReportBodyView extends HookConsumerWidget with ReportMixin { - const ReportBodyView({super.key}); + const ReportBodyView({ + super.key, + required this.isModal, + }); + + final bool isModal; @override Widget build(BuildContext context, WidgetRef ref) { final state = reportState(ref); final notifier = reportNotifier(ref); - final contentController = useTextEditingController(text: state.content ?? ''); final contentFocusNode = useFocusNode(); - useEffect(() { - final text = state.content ?? ''; - if (contentController.text != state.content) { - contentController.value = contentController.value.copyWith( - text: text, - selection: TextSelection.collapsed(offset: text.length), - composing: TextRange.empty, - ); - } - return null; - }, [state.content]); + final Widget child = ListView( + shrinkWrap: isModal, + physics: isModal ? NeverScrollableScrollPhysics() : null, + padding: EdgeInsets.only( + top: isModal ? GdsSpacing.spacing8 : GdsSpacing.spacing16, + left: isModal ? 0 : GdsSpacing.spacing16, + right: isModal ? 0 : GdsSpacing.spacing16, + bottom: isModal ? GdsSpacing.spacing20 : GdsSpacing.spacing16, + ), + children: [ + buildContainer( + context, + title: '신고 사유를 선택해주세요', + isRequired: true, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ...ReportType.values.map((type) { + final isSelected = state.type == type; - return Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 16, - children: [ - Padding( - padding: EdgeInsets.only(top: 24), - child: Text('신고사유를 선택해주세요', style: AppTypeface.subTitle1.copyWith(color: AppColor.gray700)), - ), - ListView.separated( - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - final reportType = ReportType.values[index]; - final selected = state.type == reportType; + return GdsListItem.radio( + text: type.displayName, + state: isSelected ? GdsListItemState.pressed : GdsListItemState.enabled, + isZeroPadding: true, + onTap: () { + notifier.updateType(type); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _ReportReasonTile( - label: reportType.displayName, - selected: selected, - onTap: () { - notifier.updateType(reportType); - if (reportType == ReportType.other) { - Future.microtask(() => contentFocusNode.requestFocus()); - } - }, - ), - // 신고 사유 중 기타 선택 시 TextField 활성화 - if (reportType == ReportType.other && selected) ...[ - Gap(16), - GrimityTextField.normal( - controller: contentController, - focusNode: contentFocusNode, - hintText: '사유를 입력하세요', - onChanged: (content) => notifier.updateContent(content), - maxLines: 5, - maxLength: 100, - textInputAction: TextInputAction.done, - ), - ], - ], + if (type == ReportType.other) { + Future.microtask(() => contentFocusNode.requestFocus()); + } + }, ); - }, - separatorBuilder: (_, _) => Gap(16), - itemCount: ReportType.values.length, - ), - ], + }), + ], + ), ), - ), + Gap(context.isMobile ? GdsSpacing.spacing12 : GdsSpacing.spacing20), + buildContainer( + context, + title: '자세한 내용을 알려주세요', + isRequired: state.type == ReportType.other, + child: GdsTextArea( + placeholder: '구체적인 사유를 적어주세요', + maxLength: 500, + focusNode: contentFocusNode, + onChanged: notifier.updateContent, + ), + ), + ], ); - } -} - -class _ReportReasonTile extends StatelessWidget { - const _ReportReasonTile({required this.label, required this.selected, required this.onTap}); - final String label; - final bool selected; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return GrimityGesture( - onTap: onTap, - child: Row( - spacing: 12, + if (isModal) { + return Column( + mainAxisSize: MainAxisSize.min, children: [ - GrimityRadioButton(value: selected, onTap: onTap), - Text(label, style: AppTypeface.body2.copyWith(color: AppColor.gray800)), + child, + ReportActionView(isModal: isModal), ], - ), + ); + } + + return Column( + children: [ + Expanded(child: child), + ReportActionView(isModal: isModal), + ], + ); + } + + static Widget buildContainer( + BuildContext context, { + required Widget child, + required String title, + required bool isRequired, + }) { + final colors = context.gdsColors; + + return Column( + mainAxisSize: MainAxisSize.min, + spacing: GdsSpacing.spacing10, + children: [ + Row( + spacing: GdsSpacing.spacing2, + children: [ + Text( + title, + style: GdsTypography.subtitle2.copyWith(color: colors.text.grayBold), + ), + Text( + isRequired ? '(필수)' : '(선택)', + style: GdsTypography.subtitle2.copyWith( + color: isRequired ? colors.text.primaryNormal : colors.text.graySubtle, + ), + ), + ], + ), + child, + ], ); } } diff --git a/lib/presentation/report/widget/report_app_bar.dart b/lib/presentation/report/widget/report_app_bar.dart deleted file mode 100644 index f320dbf4..00000000 --- a/lib/presentation/report/widget/report_app_bar.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:grimity/app/config/app_color.dart'; -import 'package:grimity/app/config/app_theme.dart'; -import 'package:grimity/app/config/app_typeface.dart'; -import 'package:grimity/gen/assets.gen.dart'; -import 'package:grimity/presentation/common/widget/grimity_gesture.dart'; - -class ReportAppBar extends StatelessWidget implements PreferredSizeWidget { - const ReportAppBar({super.key}); - - @override - Widget build(BuildContext context) { - return AppBar( - toolbarHeight: AppTheme.kToolbarHeight.height, - leading: Center( - child: GrimityGesture( - onTap: () => context.pop(), - child: Assets.icons.icon.close.svg(width: 24, height: 24), - ), - ), - title: Text('신고하기', style: AppTypeface.subTitle3), - titleSpacing: 0, - bottom: const PreferredSize( - preferredSize: Size.fromHeight(1), - child: Divider(height: 1, color: AppColor.gray300), - ), - ); - } - - @override - Size get preferredSize => AppTheme.kToolbarHeight; -} diff --git a/lib/presentation/report/widget/report_confirm_alert.dart b/lib/presentation/report/widget/report_confirm_alert.dart new file mode 100644 index 00000000..f004d919 --- /dev/null +++ b/lib/presentation/report/widget/report_confirm_alert.dart @@ -0,0 +1,17 @@ +import 'package:flutter/widgets.dart'; +import 'package:gds/gds.dart'; +import 'package:go_router/go_router.dart'; + +Future showConfirmReportAlert(BuildContext context) { + final alert = GdsAlert( + size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, + title: '신고하시겠어요?', + description: '신고 접수 후에는 취소가 어려워요.\n허위 신고 시 서비스 이용이 제한될 수 있어요.', + primaryLabel: '신고하기', + onPrimaryTap: () => context.pop(true), + secondaryLabel: '아니요', + onSecondaryTap: () => context.pop(false), + ); + + return alert.open(context); +} diff --git a/lib/presentation/report/widget/report_send_button.dart b/lib/presentation/report/widget/report_send_button.dart deleted file mode 100644 index 35ac603b..00000000 --- a/lib/presentation/report/widget/report_send_button.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:grimity/presentation/common/widget/button/grimity_button.dart'; -import 'package:grimity/presentation/report/provider/report_provider.dart'; -import 'package:grimity/presentation/report/widget/report_suceess_dialog.dart'; - -class ReportSendButton extends ConsumerWidget with ReportMixin { - const ReportSendButton({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final state = reportState(ref); - final notifier = reportNotifier(ref); - final buttonEnabled = state.uploading == false && state.type != null; - - return Padding( - padding: EdgeInsets.symmetric(vertical: 24, horizontal: 16), - child: GrimityButton.large( - text: '신고하기', - onTap: () async { - final result = await notifier.sendReport(); - if (result && context.mounted) { - showSuccessReportDialog(context); - } - }, - status: buttonEnabled ? ButtonStatus.on : ButtonStatus.off, - ), - ); - } -} diff --git a/lib/presentation/report/widget/report_suceess_alert.dart b/lib/presentation/report/widget/report_suceess_alert.dart new file mode 100644 index 00000000..db7925ed --- /dev/null +++ b/lib/presentation/report/widget/report_suceess_alert.dart @@ -0,0 +1,18 @@ +import 'package:flutter/widgets.dart'; +import 'package:gds/gds.dart'; +import 'package:go_router/go_router.dart'; + +Future showSuccessReportAlert(BuildContext context) { + final alert = GdsAlert( + size: context.isMobile ? GdsAlertSize.md : GdsAlertSize.xl, + title: '신고가 접수되었어요', + description: '관리자의 검토 후\n적절한 조치가 이루어질 예정이에요', + primaryLabel: '확인', + onPrimaryTap: () { + context.pop(); + context.pop(); + }, + ); + + return alert.open(context); +} diff --git a/lib/presentation/report/widget/report_suceess_dialog.dart b/lib/presentation/report/widget/report_suceess_dialog.dart deleted file mode 100644 index b5a2a739..00000000 --- a/lib/presentation/report/widget/report_suceess_dialog.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:grimity/gen/assets.gen.dart'; -import 'package:grimity/presentation/common/widget/alert/grimity_dialog.dart'; - -void showSuccessReportDialog(BuildContext context) { - showDialog( - context: context, - builder: - (context) => GrimityDialog( - title: '신고가 접수되었어요', - content: '관리자의 검토 후\n적절한 조치가 이루어질 예정이에요', - icon: Assets.icons.illust.success, - confirmText: '확인', - onConfirm: () { - context.pop(); - context.pop(); - }, - ), - ); -} diff --git a/pubspec.lock b/pubspec.lock index b712e1eb..2b14ce34 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1146,7 +1146,7 @@ packages: description: path: "." ref: main - resolved-ref: f01dff791305e9cd34c7f19ead8678f4f0ea28d3 + resolved-ref: a5f57f5ff134ad0e88e6ca2cbfc97174b4ecd3c1 url: "https://github.com/Grimity/gds-flutter" source: git version: "0.0.1" @@ -1154,8 +1154,8 @@ packages: dependency: transitive description: path: "packages/components" - ref: f01dff791305e9cd34c7f19ead8678f4f0ea28d3 - resolved-ref: f01dff791305e9cd34c7f19ead8678f4f0ea28d3 + ref: a5f57f5ff134ad0e88e6ca2cbfc97174b4ecd3c1 + resolved-ref: a5f57f5ff134ad0e88e6ca2cbfc97174b4ecd3c1 url: "https://github.com/Grimity/gds-flutter" source: git version: "0.0.1" @@ -1163,8 +1163,8 @@ packages: dependency: transitive description: path: "packages/foundation" - ref: f01dff791305e9cd34c7f19ead8678f4f0ea28d3 - resolved-ref: f01dff791305e9cd34c7f19ead8678f4f0ea28d3 + ref: a5f57f5ff134ad0e88e6ca2cbfc97174b4ecd3c1 + resolved-ref: a5f57f5ff134ad0e88e6ca2cbfc97174b4ecd3c1 url: "https://github.com/Grimity/gds-flutter" source: git version: "0.0.1" @@ -1172,8 +1172,8 @@ packages: dependency: transitive description: path: "packages/tokens" - ref: f01dff791305e9cd34c7f19ead8678f4f0ea28d3 - resolved-ref: f01dff791305e9cd34c7f19ead8678f4f0ea28d3 + ref: a5f57f5ff134ad0e88e6ca2cbfc97174b4ecd3c1 + resolved-ref: a5f57f5ff134ad0e88e6ca2cbfc97174b4ecd3c1 url: "https://github.com/Grimity/gds-flutter" source: git version: "0.0.1"