Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-08-21 10:57:48 +08:00
parent 76f1d0129b
commit b6ce93cbd2
11 changed files with 150 additions and 143 deletions

View File

@@ -2,17 +2,11 @@ import 'dart:async';
import 'dart:io';
import 'dart:math' show max;
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/models_new/upload_bfs/data.dart';
import 'package:PiliPlus/utils/context_ext.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:chat_bottom_container/chat_bottom_container.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart' hide ContextExtensionss;
import 'package:image_picker/image_picker.dart';
abstract class CommonPublishPage<T> extends StatefulWidget {
const CommonPublishPage({
@@ -40,10 +34,6 @@ abstract class CommonPublishPageState<T extends CommonPublishPage>
late final RxBool readOnly = false.obs;
late final RxBool enablePublish = false.obs;
late final imagePicker = ImagePicker();
late final RxList<String> pathList = <String>[].obs;
int get limit => widget.imageLengthLimit ?? 9;
bool? hasPub;
void initPubState();
@@ -87,7 +77,8 @@ abstract class CommonPublishPageState<T extends CommonPublishPage>
if (state == AppLifecycleState.resumed) {
if (mounted &&
widget.autofocus &&
panelType.value == PanelType.keyboard) {
(panelType.value == PanelType.keyboard ||
panelType.value == PanelType.none)) {
controller.restoreChatPanel();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (focusNode.hasFocus) {
@@ -211,42 +202,7 @@ abstract class CommonPublishPageState<T extends CommonPublishPage>
);
}
Future<void> onPublish() async {
feedBack();
List<Map<String, dynamic>>? pictures;
if (pathList.isNotEmpty) {
SmartDialog.showLoading(msg: '正在上传图片...');
final cancelToken = CancelToken();
try {
pictures = await Future.wait<Map<String, dynamic>>(
pathList.map((path) async {
Map result = await MsgHttp.uploadBfs(
path: path,
category: 'daily',
biz: 'new_dyn',
cancelToken: cancelToken,
);
if (!result['status']) throw HttpException(result['msg']);
UploadBfsResData data = result['data'];
return {
'img_width': data.imageWidth,
'img_height': data.imageHeight,
'img_size': data.imgSize,
'img_src': data.imageUrl,
};
}),
eagerError: true,
);
SmartDialog.dismiss();
} on HttpException catch (e) {
cancelToken.cancel();
SmartDialog.dismiss();
SmartDialog.showToast(e.message);
return;
}
}
onCustomPublish(pictures: pictures);
}
Future<void> onPublish();
Future<void> onCustomPublish({List? pictures});

View File

@@ -4,14 +4,18 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';
import 'package:PiliPlus/common/widgets/text_field/controller.dart';
import 'package:PiliPlus/common/widgets/text_field/text_field.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/models_new/dynamic/dyn_mention/item.dart';
import 'package:PiliPlus/models_new/emote/emote.dart' as e;
import 'package:PiliPlus/models_new/live/live_emote/emoticon.dart';
import 'package:PiliPlus/models_new/upload_bfs/data.dart';
import 'package:PiliPlus/pages/common/publish/common_publish_page.dart';
import 'package:PiliPlus/pages/dynamics_mention/view.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:dio/dio.dart' show CancelToken;
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -36,6 +40,9 @@ abstract class CommonRichTextPubPage
abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
extends CommonPublishPageState<T> {
final key = GlobalKey<RichTextFieldState>();
late final imagePicker = ImagePicker();
late final RxList<String> pathList = <String>[].obs;
int get limit => widget.imageLengthLimit ?? 9;
@override
late final RichTextEditingController editController =
@@ -380,9 +387,7 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
}
@override
void onSave() {
widget.onSave?.call(editController.items);
}
void onSave() => widget.onSave?.call(editController.items);
Widget get emojiBtn => Obx(
() {
@@ -430,4 +435,42 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
);
},
);
@override
Future<void> onPublish() async {
feedBack();
List<Map<String, dynamic>>? pictures;
if (pathList.isNotEmpty) {
SmartDialog.showLoading(msg: '正在上传图片...');
final cancelToken = CancelToken();
try {
pictures = await Future.wait<Map<String, dynamic>>(
pathList.map((path) async {
Map result = await MsgHttp.uploadBfs(
path: path,
category: 'daily',
biz: 'new_dyn',
cancelToken: cancelToken,
);
if (!result['status']) throw HttpException(result['msg']);
UploadBfsResData data = result['data'];
return {
'img_width': data.imageWidth,
'img_height': data.imageHeight,
'img_size': data.imgSize,
'img_src': data.imageUrl,
};
}),
eagerError: true,
);
SmartDialog.dismiss();
} on HttpException catch (e) {
cancelToken.cancel();
SmartDialog.dismiss();
SmartDialog.showToast(e.message);
return;
}
}
onCustomPublish(pictures: pictures);
}
}

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/pages/common/publish/common_publish_page.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:flutter/material.dart';
abstract class CommonTextPubPage extends CommonPublishPage<String> {
@@ -24,7 +25,11 @@ abstract class CommonTextPubPageState<T extends CommonTextPubPage>
}
@override
void onSave() {
widget.onSave?.call(editController.text);
void onSave() => widget.onSave?.call(editController.text);
@override
Future<void> onPublish() {
feedBack();
return onCustomPublish();
}
}