PSMessages
Danh sách tin nhắn của một cuộc hội thoại
Khi điều hướng đến màn hình chứa PSMessages, bạn cần truyền vào một trong hai tham số là targetThreadId
và targetUserId
nhằm xác định đối tượng khi nhắn tin. Tham số targetMessageId
là không bắt buộc, khi bạn truyền vào thì sẽ được nhảy đến message có ID tương ứng.
Ghi chú
targetThreadId && targetUserId không thể cùng null
context.push(
AppPage.messages.toPath,
extra: MessagesPageExtra(
targetThreadId: targetThreadId,
targetUserId:targetUserId,
targetMessageId: targetMessageId,
),
);
Ví dụ:
class MessagesPageExtra {
final String? targetThreadId;
final String? targetUserId;
final int? targetMessageId;
}
class MessagesPage extends StatelessWidget {
final MessagesPageExtra extra;
const MessagesPage({
super.key,
required this.extra,
});
@override
Widget build(BuildContext context) {
return Scaffold(
body: PSMessages(
targetThreadId: extra.targetThreadId,
targetUserId: extra.targetUserId,
targetMessageId: extra.targetMessageId,
allowedActions:[
PSMessageAction.copy,
PSMessageAction.edit,
],
customActions: [
PSCustomMessageAction(
icon: Assets.icons.icSearch.svg(),
text: 'Custom action',
positionInMenuOptions: 2,
onPress: (message) {},
),
],
customizedMessageItem: (index, message) {},
navigation: PSMessagesNavigationProvider(
onBackPress: () {
context.pop();
},
onThreadProfilePress: (String threadId) {
// Called when user taps on thread profile
},
onUrlPress: (String url) async {
await launchUrl(
Uri.parse(url),
mode: LaunchMode.inAppWebView,
);
},
onEmailPress: (String email) async {
await launchUrl(Uri.parse(email));
},
onPhoneNumberPress: (String phoneNumber) async {
await launchUrl(Uri.parse(phoneNumber));
},
onForwardMessage: (String threadId, List<int> messageIds) {
// Called when user taps on forward message option
},
onMessagesPinnedPress: (String threadId) {
// Called when user taps on messages pined area
},
onViewFilePress: (String filePath) => OpenFilex.open(filePath),
onUserPress: (
String psUserId,
String? currentThreadPartnerId,
) {
// Called when user taps on another user.
},
onShareMessagePress: (PSMessageModel message) async {
final media = message.body?.media;
final hasMedia = media != null && media.isNotEmpty;
if (hasMedia) {
final listXFile = <XFile>[];
for (var element in media) {
final file = await getXFile(element.srcUrl);
listXFile.add(file);
}
Share.shareXFiles(listXFile, subject: "Communi Chat");
},
onChatBotActionPress: (String uri) async {
if (uri.startsWith("http")) {
await launchUrl(
Uri.parse(uri),
mode: LaunchMode.inAppWebView,
);
} else if (uri.startsWith("tel:") || uri.startsWith("mailto:")) {
await launchUrl(Uri.parse(uri));
}
},
onMediaPress: (List<PSMessageMediaModel> media, int? startIndex) {
// Called when user taps on media file
},
),
),
);
}
}
Các thành phần:
class PSMessages extends StatefulWidget {
final String? targetThreadId;
final String? targetUserId;
final int? targetMessageId;
final String? screenContext;
final PSMessagesStyles? messagesStyles;
final PSMessagesNavigationProvider navigation;
final PSNullableMessageBuilder? customizedMessageItem;
final List<PSMessageAction>? allowedActions;
final List<PSCustomMessageAction>? customActions;
}
class PSMessagesNavigationProvider {
final void Function()? onBackPress;
final void Function(String threadId)? onThreadProfilePress;
final void Function(String url)? onUrlPress;
final void Function(String email)? onEmailPress;
final void Function(String phoneNumber)? onPhoneNumberPress;
final void Function(
String threadId,
List<int> messageIds,
)? onForwardMessage;
final void Function(String threadId)? onMessagesPinnedPress;
final void Function(String filePath)? onViewFilePress;
final void Function(
String psUserId,
String? currentThreadPartnerId,
)? onUserPress;
final void Function(PSMessageModel message)? onShareMessagePress;
final void Function(String uri)? onChatBotActionPress;
final void Function(List<PSMessageMediaModel> media, int? startIndex)?
onMediaPress;
...
}
Tên | Mô tả | Bắt buộc |
---|---|---|
targetThreadId | Tham số xác định id của cuộc hội thoại | ✗ |
targetUserId | Tham số xác định piscale_user_id của đối tác trong cuộc hội thoại 1-1 | ✗ |
targetMessageId | Tham số xác định id của message để cuộn tới | ✗ |
screenContext | Tham số xác định ngữ cảnh của màn hình hiện tại | ✗ |
customizedMessageItem | Tham số truyền vào để customMessage. Xem chi tiết tại Customize Message | ✗ |
allowedActions | Tham số truyền vào danh sách các hành động được phép thực hiện khi long-press vào một tin nhắn. Mặc định là null có nghĩa được phép sử dụng tất cả các hành động có sẵn | ✗ |
customActions | Ngoài những hành động được cung cấp sẵn, bạn có thể truyền vào những hành động tùy chỉnh theo nhu cầu | ✗ |
onBackPress | Hàm gọi lại khi cần back về state trước | ✗ |
onThreadProfilePress | Hàm gọi lại khi cần chuyển hướng tới PSThreadProfile | ✗ |
onUrlPress | Hàm gọi lại khi user nhấn vào link trong tin nhắn | ✗ |
onEmailPress | Hàm gọi lại khi user nhấn vào email trong tin nhắn | ✗ |
onPhoneNumberPress | Hàm gọi lại khi user nhấn vào phone number trong tin nhắn | ✗ |
onForwardMessage | Hàm gọi lại khi cần chuyển hướng tới PSForwardMessage | ✗ |
onMessagesPinnedPress | Hàm gọi lại khi cần chuyển hướng tới PSMessagesPinned | ✗ |
onViewFilePress | Hàm gọi lại khi user nhấn vào file | ✗ |
onUserPress | Hàm gọi lại khi user nhấn vào avatar hoặc mention | ✗ |
onShareMessagePress | Hàm gọi lại khi user muốn share | ✗ |
onChatBotActionPress | Hàm gọi lại khi user nhấn vào action của Bot trong tin nhắn | ✗ |
onMediaPress | Hàm gọi lại khi user nhấn vào media trong tin nhắn | ✗ |
Ghi chú
Một số chức năng sẽ không hoạt động hoặc không hoạt động đúng cách khi không khai báo những hàm gọi lại.