Selaa lähdekoodia

[New]新增聊天、录音登录状态失效处理

zhipeng 1 vuosi sitten
vanhempi
commit
fe7440e04e

+ 3 - 1
lib/data/consts/error_code.dart

@@ -1,5 +1,7 @@
 abstract class ErrorCode {
   ErrorCode._();
 
-  static const int ERROR_CODE_NO_LOGIN = 1006;
+  static const int errorCodeNoLogin = 1006;
+  static const int errorCodeNoProfession = 5003;
+  static const int errorCodeNoEnergy = 5004;
 }

+ 1 - 1
lib/data/repositories/account_repository.dart

@@ -73,7 +73,7 @@ class AccountRepository {
     _getUserInfoFuture = AsyncUtil.retryWithExponentialBackoff(
         () => _getUserInfo(), 10, (error) {
       if (error is ServerErrorException) {
-        return error.code != ErrorCode.ERROR_CODE_NO_LOGIN;
+        return error.code != ErrorCode.errorCodeNoLogin;
       }
       return true;
     });

+ 2 - 2
lib/data/repositories/task_repository.dart

@@ -33,7 +33,7 @@ class TaskRepository {
     debugPrint('开始获取未完成任务==');
     AsyncUtil.retryWithExponentialBackoff(() => _tasksRunning(), 10, (error) {
       if (error is ServerErrorException) {
-        return error.code != ErrorCode.ERROR_CODE_NO_LOGIN;
+        return error.code != ErrorCode.errorCodeNoLogin;
       }
       return true;
     }).then((data) {
@@ -61,7 +61,7 @@ class TaskRepository {
         () => _checkAllTaskStatusFinished(), 0, const Duration(seconds: 3),
         (error) {
       if (error is ServerErrorException) {
-        return error.code != ErrorCode.ERROR_CODE_NO_LOGIN;
+        return error.code != ErrorCode.errorCodeNoLogin;
       }
       return true;
     });

+ 21 - 5
lib/module/chat/controller.dart

@@ -18,6 +18,7 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
 import 'package:uuid/uuid.dart';
 
 import '../../data/bean/talks.dart';
+import '../../data/consts/error_code.dart';
 import '../../router/app_pages.dart';
 import '../../utils/http_handler.dart';
 
@@ -103,16 +104,16 @@ class ChatController extends BaseController {
     });
   }
 
-  void loadMoreHistory() {
+  Future<void> loadMoreHistory() {
     bool isEmpty = chatItems.isEmpty;
 
-    chatRepository
+    return chatRepository
         .chatHistory(chatItems.isEmpty ? null : chatItems.last.id)
         .then((value) => chatItems.addAll(value))
         .whenComplete(() => refreshController.loadComplete())
         .whenComplete(() {
       if (isEmpty) {
-        scrollToBottom();
+        _scrollToBottom();
       }
     });
   }
@@ -143,7 +144,7 @@ class ChatController extends BaseController {
     );
     chatItems.insert(0, progressingChatItem);
 
-    scrollToBottom();
+    _scrollToBottom();
 
     chatRepository
         .streamChat(chatContent,
@@ -178,6 +179,17 @@ class ChatController extends BaseController {
       progressingChatItem.isFailed.value = true;
       if (error is ServerErrorException) {
         progressingChatItem.error.value = error.message ?? "服务出错,请稍后再试";
+        if (error.code == ErrorCode.errorCodeNoLogin) {
+          Get.toNamed(RoutePath.login)?.then((loginSuccess) async {
+            if (loginSuccess != null && loginSuccess) {
+              _clearChat();
+              await loadMoreHistory();
+              _sendMessage(chatContent);
+            }
+          });
+        } else if (error.code == ErrorCode.errorCodeNoProfession) {
+          showStartSheet();
+        }
       } else {
         progressingChatItem.error.value = "网络错误,请检查网络连接";
         debugPrint("error: $error");
@@ -186,7 +198,11 @@ class ChatController extends BaseController {
     });
   }
 
-  void scrollToBottom() {
+  void _clearChat() async {
+    return chatItems.clear();
+  }
+
+  void _scrollToBottom() {
     Future.delayed(const Duration(milliseconds: 300), () {
       listScrollController.animateTo(
         0,

+ 11 - 0
lib/module/chat/start/controller.dart

@@ -1,11 +1,15 @@
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/consts/error_code.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
+import 'package:electronic_assistant/utils/http_handler.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 
+import '../../../router/app_pages.dart';
+
 class ChatStartController extends BaseController {
   final professionController = TextEditingController();
   final postController = TextEditingController();
@@ -38,6 +42,13 @@ class ChatStartController extends BaseController {
       Get.back();
       ToastUtil.showToast(StringName.accountProfessionAndPostUpdateSuccess.tr);
     }).catchError((error) {
+      if (error is ServerErrorException) {
+        if (error.code == ErrorCode.errorCodeNoLogin) {
+          Get.toNamed(RoutePath.login)?.then((loginSuccess) {
+            loginSuccess != null && loginSuccess ? onNextStep() : null;
+          });
+        }
+      }
       ErrorHandler.toastError(error);
     });
   }

+ 7 - 7
lib/module/login/controller.dart

@@ -1,12 +1,10 @@
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
-import 'package:electronic_assistant/popup/talk_popup.dart';
+import 'package:electronic_assistant/dialog/alert_dialog.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
-import 'package:electronic_assistant/dialog/alert_dialog.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 
 class LoginController extends BaseController {
@@ -14,10 +12,12 @@ class LoginController extends BaseController {
   final code = "".obs;
   final isAgree = false.obs;
 
+  final FocusNode phoneFocusNode = FocusNode();
+
   @override
-  void onInit() {
-    // TODO: implement onInit
-    super.onInit();
+  void onReady() {
+    super.onReady();
+    phoneFocusNode.requestFocus();
   }
 
   void getUserCode() {
@@ -122,7 +122,7 @@ class LoginController extends BaseController {
     }
     accountRepository.login(phone.value, code.value).then((data) {
       ToastUtil.showToast("登录成功");
-      Get.back();
+      Get.back(result: true);
     }).catchError((error) {
       ErrorHandler.toastError(error);
     });

+ 6 - 40
lib/module/login/view.dart

@@ -1,4 +1,5 @@
 import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/utils/expand.dart';
@@ -35,9 +36,9 @@ class LoginPage extends BasePage<LoginController> {
           backgroundColor: Colors.transparent,
           appBar: AppBar(
             leading: IconButton(
-              icon: const Icon(Icons.arrow_back_ios),
+              icon: const Icon(Icons.arrow_back_ios_new_rounded),
               onPressed: () {
-                Navigator.pop(context);
+                Get.back(result: accountRepository.isLogin.value);
               },
             ),
             backgroundColor: Colors.transparent,
@@ -61,42 +62,6 @@ class LoginPage extends BasePage<LoginController> {
         ),
       ],
     );
-    // return Scaffold(
-    //   body: Column(
-    //     children: <Widget>[
-    //       TextField(
-    //         onChanged: (text) {
-    //           controller.setPhone(text);
-    //         },
-    //         decoration: const InputDecoration(
-    //             labelText: "手机号",
-    //             hintText: "您的手机号",
-    //             prefixIcon: Icon(Icons.person)),
-    //       ),
-    //       TextField(
-    //         onChanged: (text) {
-    //           controller.setCode(text);
-    //         },
-    //         decoration: const InputDecoration(
-    //             labelText: "验证码",
-    //             hintText: "您的验证码",
-    //             prefixIcon: Icon(Icons.lock)),
-    //       ),
-    //       ElevatedButton(
-    //         child: const Text("获取验证码"),
-    //         onPressed: () {
-    //           controller.getUserCode();
-    //         },
-    //       ),
-    //       ElevatedButton(
-    //         child: const Text("登录"),
-    //         onPressed: () {
-    //           controller.login();
-    //         },
-    //       )
-    //     ],
-    //   ),
-    // );
   }
 
   // 背景图片
@@ -119,9 +84,10 @@ class LoginPage extends BasePage<LoginController> {
         ),
       ),
       child: TextField(
+        focusNode: controller.phoneFocusNode,
         maxLines: 1,
         textAlignVertical: TextAlignVertical.center,
-        textInputAction: TextInputAction.search,
+        textInputAction: TextInputAction.next,
         decoration: InputDecoration(
           hintText: '输入手机号码',
           hintStyle: TextStyle(fontSize: 16, color: "#AFAFAF".toColor()),
@@ -161,7 +127,7 @@ class LoginPage extends BasePage<LoginController> {
             child: TextField(
               maxLines: 1,
               textAlignVertical: TextAlignVertical.center,
-              textInputAction: TextInputAction.search,
+              textInputAction: TextInputAction.done,
               decoration: InputDecoration(
                 hintText: '输入验证码',
                 hintStyle: TextStyle(fontSize: 16, color: "#AFAFAF".toColor()),

+ 21 - 0
lib/module/record/controller.dart

@@ -2,10 +2,12 @@ import 'dart:io';
 import 'dart:typed_data';
 
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/consts/error_code.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:electronic_assistant/dialog/alert_dialog.dart';
 import 'package:electronic_assistant/module/record/constants.dart';
 import 'package:electronic_assistant/module/talk/view.dart';
+import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/utils/http_handler.dart';
 import 'package:electronic_assistant/utils/mmkv_util.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
@@ -207,6 +209,13 @@ class RecordController extends BaseController {
     }).catchError((error) {
       if (error is ServerErrorException) {
         ToastUtil.showToast("${error.message}");
+        if (error.code == ErrorCode.errorCodeNoLogin) {
+          Get.toNamed(RoutePath.login)?.then((loginSuccess) {
+            loginSuccess != null && loginSuccess
+                ? _saveCurrentRecord()
+                : null;
+          });
+        }
       } else {
         ToastUtil.showToast("保存失败, 请重试");
       }
@@ -218,8 +227,20 @@ class RecordController extends BaseController {
     status == RecordStatus.recording ? frameAnimationController.play() : null;
   }
 
+  /// 获取录音文件地址
   static Future<File> getRecordFile(String talkId) async {
     Directory documentDir = await getApplicationDocumentsDirectory();
     return File("${documentDir.path}/.atmob/record/$talkId.wav");
   }
+
+  /// 判断是否有未上传的录音
+  static Future<bool> hasUnUploadRecord() async {
+    String? lastRecordId = KVUtil.getString(keyLastRecordId, null);
+    if (lastRecordId == null || lastRecordId.isEmpty) {
+      return false;
+    }
+    Directory documentDir = await getApplicationDocumentsDirectory();
+    File file = File("${documentDir.path}/.atmob/record/$lastRecordId");
+    return await file.exists() && await file.length() > 0;
+  }
 }