diff --git a/android/app/build.gradle b/android/app/build.gradle
index 276fa6de..3518949a 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -46,6 +46,10 @@ android {
}
buildTypes {
+ debug {
+ minifyEnabled false
+ shrinkResources false
+ }
release {
signingConfig = signingConfigs.release
minifyEnabled true
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
index 921ee4d4..08dccc6a 100644
--- a/android/app/proguard-rules.pro
+++ b/android/app/proguard-rules.pro
@@ -6,4 +6,8 @@
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-dontwarn io.flutter.embedding.**
--dontwarn com.google.android.play.core.splitcompat.SplitCompatApplication
\ No newline at end of file
+-dontwarn com.google.android.play.core.splitcompat.SplitCompatApplication
+
+# Kakao SDK
+-keep class com.kakao.** { *; }
+-dontwarn com.kakao.**
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index b68cf66b..ea7343dd 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -27,6 +27,14 @@
+
+
+
+
+
+
+
+
-
-
-
diff --git a/assets/icons/ic_article_grey10.svg b/assets/icons/ic_article_grey10.svg
new file mode 100644
index 00000000..4dd3435b
--- /dev/null
+++ b/assets/icons/ic_article_grey10.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_comm_grey10.svg b/assets/icons/ic_comm_grey10.svg
new file mode 100644
index 00000000..46d96263
--- /dev/null
+++ b/assets/icons/ic_comm_grey10.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_copy_grey10.svg b/assets/icons/ic_copy_grey10.svg
new file mode 100644
index 00000000..bbeb1c48
--- /dev/null
+++ b/assets/icons/ic_copy_grey10.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_debateseason.svg b/assets/icons/ic_debateseason.svg
new file mode 100644
index 00000000..4f8f5be6
--- /dev/null
+++ b/assets/icons/ic_debateseason.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_info_grey50.svg b/assets/icons/ic_info_grey50.svg
new file mode 100644
index 00000000..1f37670a
--- /dev/null
+++ b/assets/icons/ic_info_grey50.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_kakao_login.svg b/assets/icons/ic_kakao_login.svg
deleted file mode 100644
index 8546bcc0..00000000
--- a/assets/icons/ic_kakao_login.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/assets/icons/ic_login_apple.svg b/assets/icons/ic_login_apple.svg
new file mode 100644
index 00000000..c6f3d761
--- /dev/null
+++ b/assets/icons/ic_login_apple.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_login_kakao.svg b/assets/icons/ic_login_kakao.svg
new file mode 100644
index 00000000..c4edd078
--- /dev/null
+++ b/assets/icons/ic_login_kakao.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_logo.svg b/assets/icons/ic_logo.svg
new file mode 100644
index 00000000..921be69d
--- /dev/null
+++ b/assets/icons/ic_logo.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_more_grey50.svg b/assets/icons/ic_more_grey50.svg
new file mode 100644
index 00000000..706a8bf6
--- /dev/null
+++ b/assets/icons/ic_more_grey50.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_youtube_grey10.svg b/assets/icons/ic_youtube_grey10.svg
new file mode 100644
index 00000000..a9e272c0
--- /dev/null
+++ b/assets/icons/ic_youtube_grey10.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_youtube_logo_grey50.svg b/assets/icons/ic_youtube_logo_grey50.svg
new file mode 100644
index 00000000..5149c8af
--- /dev/null
+++ b/assets/icons/ic_youtube_logo_grey50.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/images/img_media_thumbnail.png b/assets/images/img_media_thumbnail.png
new file mode 100644
index 00000000..3537b97b
Binary files /dev/null and b/assets/images/img_media_thumbnail.png differ
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 2eed59cb..ae119555 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -29,6 +29,7 @@
UIMainStoryboardFile
Main
UISupportedInterfaceOrientations
+
UIInterfaceOrientationPortrait
UIInterfaceOrientationLandscapeLeft
@@ -52,5 +53,7 @@
https
http
+ ITSAppUsesNonExemptEncryption
+
diff --git a/lib/core/constants/de_colors.dart b/lib/core/constants/de_colors.dart
index 08a28778..af5e5213 100644
--- a/lib/core/constants/de_colors.dart
+++ b/lib/core/constants/de_colors.dart
@@ -28,5 +28,13 @@ class DeColors {
static const blueDark = Color(0xFF242345);
static const blueMine = Color(0xFF4F4C71);
+ static const imageRed = Color(0xFFFE2222);
+ static const imageOrange = Color(0xFFFF813D);
+ static const imageYellow = Color(0xFFFFE93F);
+ static const imageGreen = Color(0xFF2CCD3F);
+ static const imageBlue = Color(0xFF371DFF);
+ static const imageNavy = Color(0xFF350FC1);
+ static const imagePurple = Color(0xFF9500AF);
+
static const kakao = Color(0xFFFEE500);
}
diff --git a/lib/core/constants/de_dimensions.dart b/lib/core/constants/de_dimensions.dart
index 20afba2f..67317c6b 100644
--- a/lib/core/constants/de_dimensions.dart
+++ b/lib/core/constants/de_dimensions.dart
@@ -8,10 +8,16 @@ class DeDimensions {
static const EdgeInsets all16 = EdgeInsets.all(16);
static const EdgeInsets all20 = EdgeInsets.all(20);
+ static const EdgeInsets padding6x2 =
+ EdgeInsets.symmetric(horizontal: 6, vertical: 2);
static const EdgeInsets padding8x10 =
EdgeInsets.symmetric(horizontal: 8, vertical: 10);
+ static const EdgeInsets padding10x4 =
+ EdgeInsets.symmetric(horizontal: 10, vertical: 4);
static const EdgeInsets padding10x5 =
EdgeInsets.symmetric(horizontal: 10, vertical: 5);
+ static const EdgeInsets padding10x8 =
+ EdgeInsets.symmetric(horizontal: 10, vertical: 8);
static const EdgeInsets padding12x4 =
EdgeInsets.symmetric(horizontal: 12, vertical: 4);
static const EdgeInsets padding12x16 =
@@ -28,6 +34,7 @@ class DeDimensions {
static const EdgeInsets horizontal20 = EdgeInsets.symmetric(horizontal: 20);
static const EdgeInsets vertical2 = EdgeInsets.symmetric(vertical: 2);
+ static const EdgeInsets vertical8 = EdgeInsets.symmetric(vertical: 8);
static const EdgeInsets vertical10 = EdgeInsets.symmetric(vertical: 10);
static const EdgeInsets vertical12 = EdgeInsets.symmetric(vertical: 12);
static const EdgeInsets vertical16 = EdgeInsets.symmetric(vertical: 16);
diff --git a/lib/core/constants/de_gaps.dart b/lib/core/constants/de_gaps.dart
index 250ccbf7..79f3f3c1 100644
--- a/lib/core/constants/de_gaps.dart
+++ b/lib/core/constants/de_gaps.dart
@@ -15,9 +15,11 @@ class DeGaps {
static const v32 = SizedBox(height: 32);
static const v36 = SizedBox(height: 36);
static const v40 = SizedBox(height: 40);
+ static const v42 = SizedBox(height: 42);
static const h2 = SizedBox(width: 2);
static const h4 = SizedBox(width: 4);
+ static const h6 = SizedBox(width: 6);
static const h8 = SizedBox(width: 8);
static const h12 = SizedBox(width: 12);
static const h14 = SizedBox(width: 14);
diff --git a/lib/core/constants/de_icons.dart b/lib/core/constants/de_icons.dart
index 26dd3cce..0505a04e 100644
--- a/lib/core/constants/de_icons.dart
+++ b/lib/core/constants/de_icons.dart
@@ -2,7 +2,9 @@ class DeIcons {
//colorable
static const icAddGrey30 = 'assets/icons/ic_add_grey30.svg';
static const icBackGrey50 = 'assets/icons/ic_back_grey50.svg';
+ static const icCopyGrey10 = 'assets/icons/ic_copy_grey10.svg';
static const icMoreGrey10 = 'assets/icons/ic_more_grey10.svg';
+ static const icMoreGrey50 = 'assets/icons/ic_more_grey50.svg';
static const icSendGrey10 = 'assets/icons/ic_send_grey10.svg';
static const icSendGrey70 = 'assets/icons/ic_send_grey70.svg';
static const icXGrey50 = 'assets/icons/ic_x_grey50.svg';
@@ -15,8 +17,13 @@ class DeIcons {
static const icSignOutGrey50 = 'assets/icons/ic_sign_out_grey50.svg';
static const icBookmarkGrey50 = 'assets/icons/ic_bookmark_grey50.svg';
static const icAssistantGrey50 = 'assets/icons/ic_assistant_grey50.svg';
+ static const icInfoGrey50 = 'assets/icons/ic_info_grey50.svg';
+ static const icYoutubeLogoGrey50 = 'assets/icons/ic_youtube_logo_grey50.svg';
+ static const icYoutubeGrey10 = 'assets/icons/ic_youtube_grey10.svg';
+ static const icArticleGrey10 = 'assets/icons/ic_article_grey10.svg';
+ static const icCommGrey10 = 'assets/icons/ic_comm_grey10.svg';
//none colorable
- static const icKakaoLogin = 'assets/icons/ic_kakao_login.svg';
- static const icAppleLogin = 'assets/icons/ic_apple_login.svg';
+ static const icKakaoLogin = 'assets/icons/ic_login_kakao.svg';
+ static const icAppleLogin = 'assets/icons/ic_login_apple.svg';
}
diff --git a/lib/core/routers/get_router.dart b/lib/core/routers/get_router.dart
index b856916d..3870e24d 100644
--- a/lib/core/routers/get_router.dart
+++ b/lib/core/routers/get_router.dart
@@ -5,6 +5,11 @@ import 'package:debateseason_frontend_v1/features/chat/bindings/chat_binding.dar
import 'package:debateseason_frontend_v1/features/chat/bindings/debate_binding.dart';
import 'package:debateseason_frontend_v1/features/chat/presentation/views/chat_room_screen.dart';
import 'package:debateseason_frontend_v1/features/chat/presentation/views/debate_room_screen.dart';
+import 'package:debateseason_frontend_v1/features/chat/presentation/views/inappropriate_chat_report_screen.dart';
+import 'package:debateseason_frontend_v1/features/home/bindings/media_binding.dart';
+import 'package:debateseason_frontend_v1/features/home/bindings/recommend_binding.dart';
+import 'package:debateseason_frontend_v1/features/home/presentation/views/home_screen.dart';
+import 'package:debateseason_frontend_v1/features/home/presentation/views/live_all_page.dart';
import 'package:debateseason_frontend_v1/features/issue/bindings/issue_binding.dart';
import 'package:debateseason_frontend_v1/features/issue/presentation/views/issue_room_screen.dart';
import 'package:debateseason_frontend_v1/features/issuemap/bindings/issuemap_binding.dart';
@@ -12,12 +17,14 @@ import 'package:debateseason_frontend_v1/features/issuemap/presentation/views/is
import 'package:debateseason_frontend_v1/features/main/main_binding.dart';
import 'package:debateseason_frontend_v1/features/main/main_screen.dart';
import 'package:debateseason_frontend_v1/features/profile/bindings/profile_binding.dart';
+import 'package:debateseason_frontend_v1/features/profile/bindings/profile_image_binding.dart';
import 'package:debateseason_frontend_v1/features/profile/bindings/profile_input_binding.dart';
import 'package:debateseason_frontend_v1/features/profile/bindings/terms_binding.dart';
-import 'package:debateseason_frontend_v1/features/profile/presentation/views/profile_input_page.dart';
-import 'package:debateseason_frontend_v1/features/profile/presentation/views/terms_page.dart';
+import 'package:debateseason_frontend_v1/features/profile/presentation/views/profile_image_screen.dart';
+import 'package:debateseason_frontend_v1/features/profile/presentation/views/profile_input_screen.dart';
import 'package:debateseason_frontend_v1/features/profile/presentation/views/profile_screen.dart';
-import 'package:debateseason_frontend_v1/features/profile/presentation/views/profile_withdraw_page.dart';
+import 'package:debateseason_frontend_v1/features/profile/presentation/views/profile_withdraw_screen.dart';
+import 'package:debateseason_frontend_v1/features/profile/presentation/views/terms_screen.dart';
import 'package:debateseason_frontend_v1/features/splash/presentation/splash_screen.dart';
import 'package:get/get.dart';
@@ -44,23 +51,33 @@ class GetRouter {
),
GetPage(
name: GetRouterName.terms,
- page: () => TermsPage(),
+ page: () => TermsScreen(),
binding: TermsBinding(),
),
GetPage(
name: GetRouterName.profileInput,
- page: () => ProfileInputPage(),
+ page: () => ProfileInputScreen(),
binding: ProfileInputBinding(),
),
+ GetPage(
+ name: GetRouterName.profileImage,
+ page: () => ProfileImageScreen(),
+ binding: ProfileImageBinding(),
+ ),
GetPage(
name: GetRouterName.profileWithdraw,
- page: () => ProfileWithdrawPage(),
+ page: () => ProfileWithdrawScreen(),
),
GetPage(
name: GetRouterName.chat,
page: () => ChatRoomScreen(),
binding: ChatBinding(),
),
+ GetPage(
+ name: GetRouterName.reportMessage,
+ page: () => InappropriateChatReportScreen(),
+ binding: null,
+ ),
GetPage(
name: GetRouterName.profile,
page: () => ProfileScreen(),
@@ -81,5 +98,20 @@ class GetRouter {
page: () => DebateRoomScreen(),
binding: DebateBinding(),
),
+ GetPage(
+ name: GetRouterName.recommend,
+ page: () => HomeScreen(),
+ binding: RecommendBinding(),
+ ),
+ GetPage(
+ name: GetRouterName.media,
+ page: () => HomeScreen(),
+ binding: MediaBinding(),
+ ),
+ GetPage(
+ name: GetRouterName.lives,
+ page: () => LiveAllPage(),
+ binding: MediaBinding(),
+ )
];
}
diff --git a/lib/core/routers/get_router_name.dart b/lib/core/routers/get_router_name.dart
index f02ad940..5c7c5398 100644
--- a/lib/core/routers/get_router_name.dart
+++ b/lib/core/routers/get_router_name.dart
@@ -8,10 +8,15 @@ class GetRouterName {
static const String issue = '/issue';
static const String category = '/category';
static const String debate = '/debate';
+ static const String reportMessage = '/report_message';
+ static const String recommend = '/home/recommend';
+ static const String media = '/home/media';
+ static const String lives = '/lives';
/// Profile
static const String profile = '/profile';
static const String profileInput = '/profile_input';
+ static const String profileImage = '/profile_image';
static const String profileWithdraw = '/profile_withdraw';
static const String terms = '/terms';
}
diff --git a/lib/core/services/pip_controller.dart b/lib/core/services/pip_controller.dart
new file mode 100644
index 00000000..e914c387
--- /dev/null
+++ b/lib/core/services/pip_controller.dart
@@ -0,0 +1,212 @@
+import 'package:debateseason_frontend_v1/widgets/de_pip.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:get/get.dart';
+import 'package:youtube_player_flutter/youtube_player_flutter.dart';
+
+class PipController extends GetxController with WidgetsBindingObserver {
+ YoutubePlayerController? youtubePlayerController;
+ final showPip = false.obs;
+ final isControlVisible = false.obs;
+ String? currentVideoId;
+
+ final pipOffset = Rx(const Offset(20, 40));
+ Size pipSize = Size.zero;
+ Offset? originalOffsetBeforeKeyboard;
+ bool movedByUserWhileKeyboardUp = false;
+
+ OverlayEntry? _overlayEntry;
+
+ void _ensureOverlay() {
+ if (_overlayEntry != null) return;
+ final overlay = Overlay.of(Get.overlayContext!);
+ _overlayEntry = OverlayEntry(builder: (_) => const DePip());
+ overlay.insert(_overlayEntry!);
+ }
+
+ void _removeOverlay() {
+ _overlayEntry?.remove();
+ _overlayEntry = null;
+ }
+
+ void initYoutube(String videoId) {
+ if (currentVideoId == videoId && youtubePlayerController != null) return;
+ currentVideoId = videoId;
+
+ youtubePlayerController?.dispose();
+ youtubePlayerController = YoutubePlayerController(
+ initialVideoId: videoId,
+ flags: const YoutubePlayerFlags(
+ autoPlay: true,
+ mute: false,
+ disableDragSeek: true,
+ hideControls: false,
+ ),
+ );
+ }
+
+ void show(String videoId) {
+ _ensureOverlay();
+
+ if (youtubePlayerController == null) {
+ initYoutube(videoId);
+ } else if (currentVideoId != videoId) {
+ youtubePlayerController!.load(videoId);
+ currentVideoId = videoId;
+ }
+ showPip.value = true;
+ }
+
+ void hide() {
+ showPip.value = false;
+ _removeOverlay();
+ youtubePlayerController?.pause();
+ }
+
+ void updateOffset(Offset delta) {
+ pipOffset.value += delta;
+
+ final keyboardVisible =
+ Get.mediaQuery.viewInsets.bottom > 0;
+ if (keyboardVisible) {
+ movedByUserWhileKeyboardUp = true;
+ }
+ }
+
+ void snapToCorner(Size screenSize, Size size) {
+ pipSize = size;
+ final Offset current = pipOffset.value;
+ final double screenW = screenSize.width;
+ final double screenH = screenSize.height;
+ final double pipW = pipSize.width;
+ final double pipH = pipSize.height;
+
+ final keyboardHeight = Get.mediaQuery.viewInsets.bottom;
+ final double bottomLimit = screenH - keyboardHeight;
+
+ final List corners = [
+ const Offset(20, 40), // top-left
+ Offset(screenW - pipW - 20, 40), // top-right
+ Offset(20, screenH - pipH - 20), // bottom-left
+ Offset(screenW - pipW - 20, screenH - pipH - 20), // bottom-right
+ Offset(20, (screenH - pipH) / 2), // left-center
+ Offset(screenW - pipW - 20, (screenH - pipH) / 2), // right-center
+ ];
+
+ if (keyboardHeight > 0) {
+ final double snapY = bottomLimit - pipH - 10;
+ corners.addAll([
+ Offset(20, snapY), // 키보드 좌상단
+ Offset(screenW - pipW - 20, snapY), // 키보드 우상단
+ ]);
+ }
+
+ final isBelowKeyboard = current.dy + pipH > bottomLimit;
+ final filtered = corners.where((offset) {
+ return offset.dy + pipH <= bottomLimit;
+ }).toList();
+
+ if (isBelowKeyboard && filtered.isEmpty) {
+ pipOffset.value = Offset(
+ pipOffset.value.dx,
+ bottomLimit - pipH - 10,
+ );
+ return;
+ }
+
+ Offset closest = filtered.first;
+ double minDistance = (current - closest).distance;
+
+ for (final corner in filtered) {
+ double distance = (current - corner).distance;
+ if (distance < minDistance) {
+ minDistance = distance;
+ closest = corner;
+ }
+ }
+
+ pipOffset.value = closest;
+ }
+
+ void showControls() {
+ isControlVisible.value = true;
+ Future.delayed(const Duration(seconds: 3), () {
+ isControlVisible.value = false;
+ });
+ }
+
+ @override
+ void onClose() {
+ WidgetsBinding.instance.removeObserver(this);
+ _removeOverlay();
+ youtubePlayerController?.dispose();
+ super.onClose();
+ }
+
+ @override
+ void onInit() {
+ super.onInit();
+ WidgetsBinding.instance.addObserver(this);
+ }
+
+ @override
+ void didChangeMetrics() {
+ if (!showPip.value) return;
+ if (pipSize.height == 0) return;
+
+ final keyboardHeight = Get.mediaQuery.viewInsets.bottom;
+ final isKeyboardVisible = keyboardHeight > 0;
+
+ if (pipSize.height == 0) return;
+
+ final pipBottom = pipOffset.value.dy + pipSize.height;
+ final screenBottom = Get.height;
+ final keyboardTop = screenBottom - keyboardHeight;
+ final overlapsKeyboard = pipBottom > keyboardTop;
+
+ if (isKeyboardVisible) {
+ if (overlapsKeyboard) {
+ if (originalOffsetBeforeKeyboard == null) {
+ originalOffsetBeforeKeyboard = pipOffset.value;
+ movedByUserWhileKeyboardUp = false;
+ }
+
+ final newY = keyboardTop - pipSize.height - 20;
+ pipOffset.value = Offset(pipOffset.value.dx, newY);
+ }
+ } else {
+ if (originalOffsetBeforeKeyboard != null && !movedByUserWhileKeyboardUp) {
+ final snapY = Get.height - pipSize.height - 20;
+ final wasSnappedToKeyboardTop =
+ originalOffsetBeforeKeyboard!.dy <= keyboardTop - pipSize.height;
+
+ if (wasSnappedToKeyboardTop) {
+ pipOffset.value = Offset(pipOffset.value.dx, snapY);
+ } else {
+ pipOffset.value = originalOffsetBeforeKeyboard!;
+ }
+ }
+
+ if (movedByUserWhileKeyboardUp) {
+ final Offset current = pipOffset.value;
+ final screenW = Get.width;
+ final pipW = pipSize.width;
+
+ final bool isTopLeft =
+ (current.dx - 20).abs() < 10 && (current.dy - 40).abs() < 10;
+ final bool isTopRight =
+ (current.dx - (screenW - pipW - 20)).abs() < 10 &&
+ (current.dy - 40).abs() < 10;
+
+ if (!isTopLeft && !isTopRight) {
+ pipOffset.value = Offset(
+ current.dx,
+ Get.height - pipSize.height - 20,
+ );
+ }
+ }
+
+ originalOffsetBeforeKeyboard = null;
+ movedByUserWhileKeyboardUp = false;
+ }
+ }
+}
diff --git a/lib/features/auth/auth_constants.dart b/lib/features/auth/auth_constants.dart
index cb79d796..ac25bd13 100644
--- a/lib/features/auth/auth_constants.dart
+++ b/lib/features/auth/auth_constants.dart
@@ -1,6 +1,6 @@
class AuthConstants {
static const kakaoLoginType = 'kakao';
static const appleLoginType = 'apple';
- static const kakaoLogin = '카카오 로그인';
- static const appleLogin = '애플 로그인';
+ static const kakaoLogin = '카카오로 로그인';
+ static const appleLogin = 'Apple로 로그인';
}
diff --git a/lib/features/auth/presentation/view_models/auth_view_model.dart b/lib/features/auth/presentation/view_models/auth_view_model.dart
index 2d60b0dc..3915e736 100644
--- a/lib/features/auth/presentation/view_models/auth_view_model.dart
+++ b/lib/features/auth/presentation/view_models/auth_view_model.dart
@@ -3,6 +3,7 @@ import 'package:debateseason_frontend_v1/features/auth/auth_constants.dart';
import 'package:debateseason_frontend_v1/features/auth/domain/entities/users_login_entity.dart';
import 'package:debateseason_frontend_v1/features/auth/domain/repositories/users_login_repository.dart';
import 'package:debateseason_frontend_v1/features/profile/domain/repositories/profile_repository.dart';
+import 'package:debateseason_frontend_v1/utils/amplitude_util.dart';
import 'package:debateseason_frontend_v1/utils/base/ui_state.dart';
import 'package:debateseason_frontend_v1/utils/logger.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
@@ -19,6 +20,7 @@ class AuthViewModel extends GetxController {
void onInit() {
super.onInit();
+ AmplitudeUtil.trackEvent(eventName: 'Auth');
_usersLoginRepository = Get.find();
_profileRepository = Get.find();
_kakaoSdkInit();
diff --git a/lib/features/auth/presentation/views/auth_screen.dart b/lib/features/auth/presentation/views/auth_screen.dart
index 890bf094..bb664440 100644
--- a/lib/features/auth/presentation/views/auth_screen.dart
+++ b/lib/features/auth/presentation/views/auth_screen.dart
@@ -57,7 +57,7 @@ class AuthScreen extends GetView {
if (loginStatus.$2) {
//profileStatus
if (loginStatus.$1) {
- Get.offNamed(GetRouterName.issuemap);
+ Get.offNamed(GetRouterName.main);
} else {
Get.offNamed(GetRouterName.profileInput);
}
@@ -91,7 +91,7 @@ class AuthScreen extends GetView {
if (loginStatus.$2) {
// profileStatus
if (loginStatus.$1) {
- Get.offNamed(GetRouterName.issuemap);
+ Get.offNamed(GetRouterName.main);
} else {
Get.offNamed(GetRouterName.profileInput);
}
@@ -139,7 +139,7 @@ class AuthScreen extends GetView {
? DeIcons.icKakaoLogin
: DeIcons.icAppleLogin,
),
- DeGaps.h8,
+ DeGaps.h4,
Text(
loginType == AuthConstants.kakaoLoginType
? AuthConstants.kakaoLogin
diff --git a/lib/features/chat/bindings/chat_binding.dart b/lib/features/chat/bindings/chat_binding.dart
index 6588abcf..f8b07034 100644
--- a/lib/features/chat/bindings/chat_binding.dart
+++ b/lib/features/chat/bindings/chat_binding.dart
@@ -16,6 +16,11 @@ class ChatBinding extends Bindings {
Get.find(),
),
);
+ Get.lazyPut(
+ () => ChatRoomsMessagesRepositoryImpl(
+ Get.find(),
+ ),
+ );
Get.lazyPut(() => ChatRoomViewModel());
}
diff --git a/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.dart b/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.dart
index 89873e9a..36b6b928 100644
--- a/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.dart
+++ b/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.dart
@@ -1,3 +1,4 @@
+import 'package:debateseason_frontend_v1/features/chat/data/models/report_reason_req.dart';
import 'package:debateseason_frontend_v1/features/chat/domain/entities/chat_message_entity.dart';
import 'package:debateseason_frontend_v1/utils/base/base_res.dart';
import 'package:dio/dio.dart';
@@ -15,6 +16,12 @@ abstract class ChatRoomsMessagesDataSource {
@Path('roomId') required int roomId,
@Query('cursor') int? cursor,
});
+
+ @POST('/api/v1/chat/messages/{messageId}/report')
+ Future reportMessage({
+ @Path() required int messageId,
+ @Body() required ReportReasonReq body,
+ });
}
// 내부적으로 사용되지 않는 일회용 클래스이므로 data_source 에 정의함.
diff --git a/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.g.dart b/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.g.dart
index 19e80ac0..4c43a490 100644
--- a/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.g.dart
+++ b/lib/features/chat/data/data_sources/chat_rooms_messages_data_source.g.dart
@@ -75,6 +75,40 @@ class _ChatRoomsMessagesDataSource implements ChatRoomsMessagesDataSource {
return _value;
}
+ @override
+ Future> reportMessage({
+ required int messageId,
+ required ReportReasonReq body,
+ }) async {
+ final _extra = {};
+ final queryParameters = {};
+ final _headers = {};
+ final _data = {};
+ _data.addAll(body.toJson());
+ final _options = _setStreamType>(
+ Options(method: 'POST', headers: _headers, extra: _extra)
+ .compose(
+ _dio.options,
+ '/api/v1/chat/messages/${messageId}/report',
+ queryParameters: queryParameters,
+ data: _data,
+ )
+ .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
+ );
+ final _result = await _dio.fetch