ソースを参照

[new]增加首页新人指引

zk 1 年間 前
コミット
b06ed4d007

BIN
assets/images/bg_audio_todo_popup.webp


BIN
assets/images/bg_guide_main_ai_popup.webp


BIN
assets/images/icon_guide_main_ai.webp


BIN
assets/images/icon_main_guide_arrow.webp


+ 5 - 0
assets/string/base/string.xml

@@ -169,4 +169,9 @@
     <string name="template_detail_update">编辑模板</string>
     <string name="template_dialog_delete_title">是否删除“%s”模板?</string>
     <string name="talk_template_add_popup_content_txt">不是您想要的总结方\n式?点这里!</string>
+    <string name="guide_record">录音</string>
+    <string name="guide_import">导入本地音频、视频</string>
+    <string name="guide_ai_secretary">AI秘书</string>
+    <string name="guide_ai_secretary_desc">专属秘书,无限问答点这里</string>
+    <string name="guide_ai_know">知道了</string>
 </resources>

+ 4 - 0
lib/data/consts/constants.dart

@@ -90,5 +90,9 @@ class Currency {
 }
 
 class GuideConstants {
+  GuideConstants._();
+
   static const String talkAddTemplateGuide = "talkAddTemplateGuide";
+
+  static const String mainGuide = "mainGuide";
 }

+ 156 - 0
lib/dialog/guide_dialog.dart

@@ -0,0 +1,156 @@
+import 'package:electronic_assistant/module/home/view.dart';
+import 'package:electronic_assistant/resource/assets.gen.dart';
+import 'package:electronic_assistant/resource/colors.gen.dart';
+import 'package:electronic_assistant/resource/string.gen.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:get/get.dart';
+
+void mainGuide(GlobalKey topGuide, {VoidCallback? knowCallback}) {
+  final topGuideOffset = getWidgetPosition(topGuide);
+  const tag = 'mainGuideDialog';
+  double padding = 7.5.w;
+  SmartDialog.show(
+      tag: tag,
+      backType: SmartBackType.block,
+      clickMaskDismiss: false,
+      maskColor: ColorName.black70,
+      builder: (_) {
+        return SizedBox(
+          width: double.infinity,
+          height: double.infinity,
+          child: Stack(
+            children: [
+              Positioned(
+                left: 0,
+                right: 0,
+                top: topGuideOffset.dy - padding,
+                child: Column(
+                  children: [
+                    Container(
+                        padding: EdgeInsets.all(padding),
+                        margin: EdgeInsets.symmetric(horizontal: 10.w),
+                        decoration: BoxDecoration(
+                          color: ColorName.white,
+                          borderRadius: BorderRadius.circular(14),
+                        ),
+                        child: getHomeHeadView()),
+                    Padding(
+                      padding: EdgeInsets.only(
+                          left: 17.5.w, right: 17.5.w, top: 4.w),
+                      child: Row(children: [
+                        Expanded(
+                          child: Column(children: [
+                            Assets.images.iconMainGuideArrow
+                                .image(width: 14.w, height: 27.w),
+                            SizedBox(height: 8.w),
+                            Text(StringName.guideRecord.tr,
+                                style: TextStyle(
+                                    fontSize: 14.sp, color: ColorName.white))
+                          ]),
+                        ),
+                        SizedBox(width: 8.w),
+                        Expanded(
+                          child: Column(children: [
+                            Assets.images.iconMainGuideArrow
+                                .image(width: 14.w, height: 27.w),
+                            SizedBox(height: 8.w),
+                            Text(StringName.guideImport.tr,
+                                style: TextStyle(
+                                    fontSize: 14.sp, color: ColorName.white))
+                          ]),
+                        ),
+                      ]),
+                    )
+                  ],
+                ),
+              ),
+              Positioned(
+                left: 0,
+                right: 0,
+                bottom: 8.h,
+                child: Column(
+                  children: [
+                    GestureDetector(
+                      onTap: () {
+                        SmartDialog.dismiss(tag: tag);
+                        knowCallback?.call();
+                      },
+                      child: Container(
+                        decoration: BoxDecoration(
+                          border:
+                              Border.all(color: ColorName.white, width: 2.w),
+                          borderRadius: BorderRadius.circular(100.w),
+                        ),
+                        padding: EdgeInsets.symmetric(
+                            horizontal: 28.w, vertical: 11.w),
+                        child: Text(
+                          StringName.guideAiKnow.tr,
+                          style: TextStyle(
+                              fontSize: 15.sp, color: ColorName.white),
+                        ),
+                      ),
+                    ),
+                    SizedBox(height: 32.h),
+                    Container(
+                        width: 274.w,
+                        decoration: BoxDecoration(
+                          image: DecorationImage(
+                            image: Assets.images.bgGuideMainAiPopup.provider(),
+                            fit: BoxFit.cover,
+                          ),
+                        ),
+                        child: AspectRatio(
+                          aspectRatio: 274 / 76,
+                          child: Align(
+                            alignment: const FractionalOffset(0.6016, 0.361),
+                            child: IntrinsicHeight(
+                              child: Column(
+                                crossAxisAlignment: CrossAxisAlignment.start,
+                                children: [
+                                  Text(
+                                    StringName.guideAiSecretary.tr,
+                                    style: TextStyle(
+                                        fontSize: 16.sp,
+                                        fontWeight: FontWeight.bold,
+                                        color: ColorName.white),
+                                  ),
+                                  Text(
+                                    StringName.guideAiSecretaryDesc.tr,
+                                    style: TextStyle(
+                                        fontSize: 12.sp,
+                                        color: ColorName.white90),
+                                  )
+                                ],
+                              ),
+                            ),
+                          ),
+                        )),
+                    SizedBox(height: 12.h),
+                    Assets.images.iconGuideMainAi
+                        .image(width: 66.w, height: 66.w),
+                  ],
+                ),
+              )
+            ],
+          ),
+        );
+      });
+}
+
+Offset getWidgetPosition(GlobalKey key) {
+  final context = key.currentContext;
+  if (context == null) {
+    throw Exception('Context is null');
+  }
+
+  final renderObject = context.findRenderObject();
+  if (renderObject == null || renderObject is! RenderBox) {
+    throw Exception('RenderObject is null or not a RenderBox');
+  }
+
+  final offset = renderObject.localToGlobal(Offset.zero);
+  return offset;
+}

+ 21 - 2
lib/module/home/controller.dart

@@ -2,6 +2,7 @@ import 'dart:io';
 
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
+import 'package:electronic_assistant/data/consts/Constants.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/agenda_repository.dart';
 import 'package:electronic_assistant/data/repositories/config_repository.dart';
@@ -14,12 +15,14 @@ import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/utils/event_bus.dart';
 import 'package:electronic_assistant/utils/file_upload_check_helper.dart';
+import 'package:electronic_assistant/utils/mmkv_util.dart';
 import 'package:electronic_assistant/widget/pull_to_refresh.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import '../../data/api/response/example_info_response.dart';
 import '../../data/bean/agenda.dart';
 import '../../data/repositories/account_repository.dart';
+import '../../dialog/guide_dialog.dart';
 import '../../resource/colors.gen.dart';
 import '../../utils/error_handler.dart';
 import '../../utils/toast_util.dart';
@@ -41,6 +44,10 @@ class HomePageController extends BaseController {
 
   RxList<Agenda> get agendaList => agendaRepository.agendaList;
 
+  final mainController = Get.find<MainController>();
+
+  GlobalKey headGuideKey = GlobalKey();
+
   @override
   void onReady() {
     super.onReady();
@@ -55,6 +62,18 @@ class HomePageController extends BaseController {
       agendaRepository.setAgendaList([]);
       requestHomeData();
     });
+
+    _checkMainGuide();
+  }
+
+  void _checkMainGuide() {
+    if (!KVUtil.getBool(GuideConstants.mainGuide, true)) {
+      return;
+    }
+    //新人引导
+    mainGuide(headGuideKey, knowCallback: () {
+      KVUtil.putBool(GuideConstants.mainGuide, false);
+    });
   }
 
   @override
@@ -97,11 +116,11 @@ class HomePageController extends BaseController {
   }
 
   void goTalkRecordPage() {
-    Get.find<MainController>().updateIndexByPageName(StringName.mainTabFile);
+    mainController.updateIndexByPageName(StringName.mainTabFile);
   }
 
   void showLoginDrawer() {
-    Get.find<MainController>().openDrawer();
+    mainController.openDrawer();
   }
 
   void requestDelete(TalkBean item) {

+ 102 - 114
lib/module/home/view.dart

@@ -98,92 +98,14 @@ class HomePage extends BasePage<HomePageController> {
         ),
         padding:
             EdgeInsets.only(left: 12.w, right: 12.w, top: 8.h, bottom: 16.h),
-        child: Row(
-          children: [
-            Expanded(
-              child: _buildHeaderCard(
-                  StringName.homeTalkAudio.tr,
-                  StringName.homeTalkQuickAudio.tr,
-                  Assets.images.iconHomeTalkRecordCard.image().image, [
-                "#1763F9".toColor(),
-                "#28B2FF".toColor(),
-              ], onTap: () {
-                controller.onRecordClick();
-              }),
-            ),
-            SizedBox(width: 8.w),
-            Expanded(
-              child: _buildHeaderCard(
-                  StringName.homeTalkImportAudio.tr,
-                  StringName.homeTalkAnalyzeLocalAudio.tr,
-                  Assets.images.iconHomeTalkSelectCard.image().image, [
-                "#5869ED".toColor(),
-                "#6E8AF7".toColor(),
-              ], onTap: () {
-                controller.onPickerAudioFile();
-              }),
-            ),
-          ],
-        ),
-      ),
-    );
-  }
-
-  Widget _buildHeaderCard(
-    String title,
-    String content,
-    ImageProvider imageProvider,
-    List<Color> bgColor, {
-    VoidCallback? onTap,
-  }) {
-    return GestureDetector(
-      onTap: onTap,
-      child: AspectRatio(
-        aspectRatio: 164 / 80,
-        child: Container(
-          decoration: BoxDecoration(
-            gradient: LinearGradient(
-              begin: Alignment.topLeft,
-              end: Alignment.bottomRight,
-              colors: bgColor,
-            ),
-            borderRadius: BorderRadius.circular(12),
-          ),
-          child: Stack(
-            children: [
-              Align(
-                alignment: Alignment.centerRight,
-                child: AspectRatio(
-                  aspectRatio: 1,
-                  child: SizedBox(
-                      height: double.infinity,
-                      child: Image(image: imageProvider)),
-                ),
-              ),
-              Align(
-                alignment: Alignment.centerLeft,
-                child: IntrinsicHeight(
-                  child: Container(
-                    margin: EdgeInsets.only(left: 12.w),
-                    child: Column(
-                      crossAxisAlignment: CrossAxisAlignment.start,
-                      children: [
-                        Text(title,
-                            style: TextStyle(
-                                fontSize: 16.sp,
-                                color: ColorName.white,
-                                fontWeight: FontWeight.bold)),
-                        SizedBox(height: 4.h),
-                        Text(content,
-                            style: TextStyle(
-                                fontSize: 12.sp, color: ColorName.white80)),
-                      ],
-                    ),
-                  ),
-                ),
-              )
-            ],
-          ),
+        child: getHomeHeadView(
+          key: controller.headGuideKey,
+          recordClick: () {
+            controller.onRecordClick();
+          },
+          pickerAudioFileClick: () {
+            controller.onPickerAudioFile();
+          },
         ),
       ),
     );
@@ -598,34 +520,6 @@ class HomePage extends BasePage<HomePageController> {
     );
   }
 
-  void showUnfinishedRecordPopup() {
-    SmartDialog.showAttach(
-      targetContext: controller.todoTargetContext,
-      alignment: Alignment.bottomRight,
-      animationType: SmartAnimationType.fade,
-      clickMaskDismiss: true,
-      maskColor: Colors.transparent,
-      bindPage: true,
-      builder: (_) => Padding(
-        padding: const EdgeInsets.only(top: 7).h,
-        child: Stack(
-          alignment: Alignment.topCenter,
-          children: [
-            SizedBox(
-                width: 146.w,
-                height: 66.w,
-                child: Assets.images.bgAudioTodoPopup.image()),
-            Container(
-                alignment: Alignment.center,
-                padding: const EdgeInsets.only(top: 17).w,
-                width: 146.w,
-                child: Text(StringName.homePopupTipsTxt.tr,
-                    style: TextStyle(fontSize: 14.sp, color: Colors.white)))
-          ],
-        ),
-      ),
-    );
-  }
 
   void showRenameTalkDialog(TalkBean item) {
     reNameDialog(StringName.talkRenameTitle.tr, item.title.value,
@@ -677,3 +571,97 @@ Widget buildAgendaEmptyView(double top, {bool isVisible = true}) {
     ),
   );
 }
+
+Widget getHomeHeadView(
+    {GlobalKey? key,
+    VoidCallback? recordClick,
+    VoidCallback? pickerAudioFileClick}) {
+  return Row(
+    key: key,
+    children: [
+      Expanded(
+        child: _buildHeaderCard(
+            StringName.homeTalkAudio.tr,
+            StringName.homeTalkQuickAudio.tr,
+            Assets.images.iconHomeTalkRecordCard.image().image, [
+          "#1763F9".toColor(),
+          "#28B2FF".toColor(),
+        ], onTap: () {
+          recordClick?.call();
+        }),
+      ),
+      SizedBox(width: 8.w),
+      Expanded(
+        child: _buildHeaderCard(
+            StringName.homeTalkImportAudio.tr,
+            StringName.homeTalkAnalyzeLocalAudio.tr,
+            Assets.images.iconHomeTalkSelectCard.image().image, [
+          "#5869ED".toColor(),
+          "#6E8AF7".toColor(),
+        ], onTap: () {
+          pickerAudioFileClick?.call();
+        }),
+      ),
+    ],
+  );
+}
+
+Widget _buildHeaderCard(
+  String title,
+  String content,
+  ImageProvider imageProvider,
+  List<Color> bgColor, {
+  VoidCallback? onTap,
+}) {
+  return GestureDetector(
+    onTap: onTap,
+    child: AspectRatio(
+      aspectRatio: 164 / 80,
+      child: Container(
+        decoration: BoxDecoration(
+          gradient: LinearGradient(
+            begin: Alignment.topLeft,
+            end: Alignment.bottomRight,
+            colors: bgColor,
+          ),
+          borderRadius: BorderRadius.circular(12),
+        ),
+        child: Stack(
+          children: [
+            Align(
+              alignment: Alignment.centerRight,
+              child: AspectRatio(
+                aspectRatio: 1,
+                child: SizedBox(
+                    height: double.infinity,
+                    child: Image(image: imageProvider)),
+              ),
+            ),
+            Align(
+              alignment: Alignment.centerLeft,
+              child: IntrinsicHeight(
+                child: Container(
+                  margin: EdgeInsets.only(left: 12.w),
+                  child: Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    children: [
+                      Text(title,
+                          style: TextStyle(
+                              fontSize: 16.sp,
+                              color: ColorName.white,
+                              fontWeight: FontWeight.bold)),
+                      SizedBox(height: 4.h),
+                      Text(content,
+                          style: TextStyle(
+                              fontSize: 12.sp, color: ColorName.white80)),
+                    ],
+                  ),
+                ),
+              ),
+            )
+          ],
+        ),
+      ),
+    ),
+  );
+}

+ 1 - 1
lib/module/talk/controller.dart

@@ -895,7 +895,7 @@ class TalkController extends BaseController {
 
     talkRepository
         .talkSummaryGenerate(id, templateId)
-        .timeout(const Duration(seconds: 30))
+        .timeout(const Duration(seconds: 60))
         .then((data) {
       LoadingDialog.hide();
       talkBean.value?.updateBean(data);