feat(lib): create responses to text messages
This commit is contained in:
@@ -314,20 +314,14 @@ extension CommunicationChannelExtension on AppService {
|
||||
}
|
||||
|
||||
extension MessagingExtension on AppService {
|
||||
void sendMessage(String message) {
|
||||
try {
|
||||
if (connectedDevice == null) return;
|
||||
_nearbyService.send(
|
||||
OutgoingNearbyMessage(
|
||||
content: NearbyMessageTextContent(value: message),
|
||||
receiver: connectedDevice!.info,
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
if (kDebugMode) {
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
void sendTextRequest(String message) {
|
||||
if (connectedDevice == null) return;
|
||||
_nearbyService.send(
|
||||
OutgoingNearbyMessage(
|
||||
content: NearbyMessageTextRequest.create(value: message),
|
||||
receiver: connectedDevice!.info,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void sendFilesRequest(List<String> paths) {
|
||||
@@ -344,15 +338,24 @@ extension MessagingExtension on AppService {
|
||||
);
|
||||
}
|
||||
|
||||
void sendFilesResponse(String requestId, {required bool response}) {
|
||||
void sendTextResponse(String requestId) {
|
||||
if (connectedDevice == null) return;
|
||||
|
||||
_nearbyService.send(
|
||||
OutgoingNearbyMessage(
|
||||
receiver: connectedDevice!.info,
|
||||
content: NearbyMessageFilesResponse(
|
||||
id: requestId,
|
||||
response: response,
|
||||
),
|
||||
content: NearbyMessageTextResponse(id: requestId),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void sendFilesResponse(String requestId, {required bool response}) {
|
||||
if (connectedDevice == null) return;
|
||||
print('send');
|
||||
_nearbyService.send(
|
||||
OutgoingNearbyMessage(
|
||||
receiver: connectedDevice!.info,
|
||||
content: NearbyMessageFilesResponse(id: requestId, isAccepted: response),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:nearby_service/nearby_service.dart';
|
||||
import 'package:nearby_service_example_full/uikit/uikit.dart';
|
||||
|
||||
class FilesListener {
|
||||
FilesListener._();
|
||||
|
||||
static void call(BuildContext context, ReceivedNearbyFilesPack pack) {
|
||||
final senderSubtitle = 'From ${pack.sender.displayName} '
|
||||
'(ID: ${pack.sender.id})';
|
||||
AppShackBar.show(
|
||||
Scaffold.of(context).context,
|
||||
'${pack.files.length} files saved! \n${pack.files.map((e) => e.name).join('\n')}',
|
||||
subtitle: senderSubtitle,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:nearby_service/nearby_service.dart';
|
||||
import 'package:nearby_service_example_full/domain/app_service.dart';
|
||||
import 'package:nearby_service_example_full/uikit/uikit.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class MessagesListener {
|
||||
MessagesListener._();
|
||||
|
||||
static void call(BuildContext context, ReceivedNearbyMessage message) {
|
||||
final senderSubtitle = 'From ${message.sender.displayName} '
|
||||
'(ID: ${message.sender.id})';
|
||||
message.content.byType(
|
||||
onTextRequest: (textRequest) {
|
||||
AppShackBar.show(
|
||||
Scaffold.of(context).context,
|
||||
'${textRequest.value} (Message ID=${textRequest.id})',
|
||||
subtitle: senderSubtitle,
|
||||
)?.closed.whenComplete(() {
|
||||
// mark as read
|
||||
context.read<AppService>().sendTextResponse(textRequest.id);
|
||||
});
|
||||
},
|
||||
onTextResponse: (textResponse) {
|
||||
AppShackBar.show(
|
||||
Scaffold.of(context).context,
|
||||
'Your message with ID=${textResponse.id} was delivered to ${message.sender.displayName}',
|
||||
);
|
||||
},
|
||||
onFilesRequest: (filesRequest) {
|
||||
ActionDialog.show(
|
||||
context,
|
||||
title: 'Request to send ${filesRequest.files.length} files',
|
||||
subtitle: senderSubtitle,
|
||||
).then(
|
||||
// accept or dismiss the files request
|
||||
(isAccepted) => context.read<AppService>().sendFilesResponse(
|
||||
filesRequest.id,
|
||||
response: isAccepted ?? false,
|
||||
),
|
||||
);
|
||||
},
|
||||
onFilesResponse: (filesResponse) {
|
||||
AppShackBar.show(
|
||||
Scaffold.of(context).context,
|
||||
filesResponse.isAccepted
|
||||
? 'Request is accepted!'
|
||||
: 'Request was denied :(',
|
||||
subtitle: senderSubtitle,
|
||||
actionType:
|
||||
filesResponse.isAccepted ? ActionType.idle : ActionType.warning,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -69,7 +69,7 @@ class _CommunicationViewState extends State<CommunicationView> {
|
||||
Flexible(
|
||||
child: ActionButton(
|
||||
title: 'Send',
|
||||
onTap: () => service.sendMessage(message),
|
||||
onTap: () => service.sendTextRequest(message),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:nearby_service/nearby_service.dart';
|
||||
import 'package:nearby_service_example_full/domain/app_service.dart';
|
||||
import 'package:nearby_service_example_full/presentation/listener/files_listener.dart';
|
||||
import 'package:nearby_service_example_full/presentation/listener/messages_listener.dart';
|
||||
import 'package:nearby_service_example_full/uikit/uikit.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
@@ -48,8 +50,14 @@ class ConnectedView extends StatelessWidget {
|
||||
ActionButton(
|
||||
title: 'Start communicate',
|
||||
onTap: () => service.startCommunicationChannel(
|
||||
listener: (event) => _listener(context, event),
|
||||
onFilesSaved: (files) => _onFileSaved(context, files),
|
||||
listener: (event) => MessagesListener.call(
|
||||
context,
|
||||
event,
|
||||
),
|
||||
onFilesSaved: (files) => FilesListener.call(
|
||||
context,
|
||||
files,
|
||||
),
|
||||
),
|
||||
)
|
||||
else
|
||||
@@ -64,50 +72,4 @@ class ConnectedView extends StatelessWidget {
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _listener(BuildContext context, ReceivedNearbyMessage message) {
|
||||
final senderSubtitle = 'From ${message.sender.displayName} '
|
||||
'(ID: ${message.sender.id})';
|
||||
message.content.byType(
|
||||
onText: (content) {
|
||||
AppShackBar.show(
|
||||
Scaffold.of(context).context,
|
||||
content.value,
|
||||
subtitle: senderSubtitle,
|
||||
);
|
||||
},
|
||||
onFilesRequest: (content) {
|
||||
ActionDialog.show(
|
||||
context,
|
||||
title: 'Request to send ${content.files.length} files',
|
||||
subtitle: senderSubtitle,
|
||||
).then((value) {
|
||||
if (value is bool) {
|
||||
context.read<AppService>().sendFilesResponse(
|
||||
content.id,
|
||||
response: value,
|
||||
);
|
||||
}
|
||||
});
|
||||
},
|
||||
onFilesResponse: (content) {
|
||||
AppShackBar.show(
|
||||
Scaffold.of(context).context,
|
||||
content.response ? 'Request is accepted!' : 'Request was denied :(',
|
||||
subtitle: senderSubtitle,
|
||||
actionType: content.response ? ActionType.idle : ActionType.warning,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _onFileSaved(BuildContext context, ReceivedNearbyFilesPack pack) {
|
||||
final senderSubtitle = 'From ${pack.sender.displayName} '
|
||||
'(ID: ${pack.sender.id})';
|
||||
AppShackBar.show(
|
||||
Scaffold.of(context).context,
|
||||
'${pack.files.length} files saved! \n${pack.files.map((e) => e.name).join('\n')}',
|
||||
subtitle: senderSubtitle,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,12 +15,12 @@ class AppShackBar {
|
||||
SnackBar(
|
||||
content: RichText(
|
||||
text: TextSpan(
|
||||
text: '$title \n',
|
||||
text: title,
|
||||
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||
children: [
|
||||
if (subtitle != null)
|
||||
TextSpan(
|
||||
text: subtitle,
|
||||
text: '\n$subtitle',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.normal,
|
||||
fontSize: 14,
|
||||
|
||||
Reference in New Issue
Block a user