Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Commit af78aa8

Browse files
committed
feat: Add bluetooth share functionality to location sharing
1 parent ea202e6 commit af78aa8

File tree

8 files changed

+493
-138
lines changed

8 files changed

+493
-138
lines changed

lib/extensions/string.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
extension StringExtensions on String {
2+
String capitalize() {
3+
return "${this[0].toUpperCase()}${substring(1)}";
4+
}
5+
}

lib/l10n/app_en.arb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,15 @@
181181
"transferScreen_send_startTransfer": "Transfer",
182182
"transferScreen_receive_connect_description": "Received a transfer request. This is the PIN. Make sure the PIN matches the one on your old device. If it does, tap \"Connect\".",
183183
"transferScreen_receive_connected_label": "Please start the transfer on your old device now.",
184-
"bluetoothReceive_title": "Receive View Key",
185-
"bluetoothReceive_description": "Receive a view key from another device via Bluetooth",
186-
"bluetoothReceive_name_description": "This is your name visible to others:",
184+
"importTask_bluetooth_receive_title": "Receive View Key",
185+
"importTask_bluetooth_receive_description": "Receive a view key from another device via Bluetooth. Ask the other person to open a task. Then go to details, tap on share location and select Bluetooth. Make sure you have Bluetooth enabled.",
186+
"importTask_bluetooth_receive_id_description": "This is your name visible to others:",
187+
"importTask_bluetooth_send_title": "Share location via Bluetooth",
188+
"importTask_bluetooth_send_description": "Make sure you have Bluetooth enabled. Looking for devices...",
189+
"importTask_bluetooth_receive_request_title": "Do you want to accept the request?",
190+
"importTask_bluetooth_receive_request_description": "A connect request to share a location has been made. We can't tell what location is being shared until you accept the connection. If you expected this connection, you can connect. Otherwise, the request will be rejected.",
191+
"importTask_bluetooth_receive_request_decline": "Decline",
192+
"importTask_bluetooth_receive_request_accept": "Accept",
187193
"mainScreen_overview": "Overview",
188194
"mainScreen_createTask": "Create Task",
189195
"mainScreen_logs": "Logs",
@@ -322,6 +328,7 @@
322328
"shareLocation_actions_shareFile_text": "Here's my Locus View Key to see my location",
323329
"shareLocation_actions_shareLink": "Share Link",
324330
"shareLocation_actions_shareLink_text": "Here's my Locus link to see my location",
331+
"shareLocation_actions_shareBluetooth": "Share via Bluetooth",
325332
"shareLocation_scanToImport": "Scan this QR Code to import task {task}",
326333
"@shareLocation_scanToImport": {
327334
"placeholders": {

lib/screens/ImportTaskSheet.dart

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import 'package:provider/provider.dart';
1616

1717
import '../services/task_service.dart';
1818
import '../widgets/ModalSheet.dart';
19-
import 'import_task_sheet_widgets/BluetoothReceive.dart';
19+
import 'import_task_sheet_widgets/ReceiveViewByBluetooth.dart';
2020

2121
enum ImportScreen {
2222
ask,
@@ -112,11 +112,40 @@ class _ImportTaskSheetState extends State<ImportTaskSheet> with TickerProviderSt
112112
super.dispose();
113113
}
114114

115-
void _importFile() async {
115+
void parseViewData(final TaskView taskView) async {
116116
final l10n = AppLocalizations.of(context);
117117
final taskService = context.read<TaskService>();
118118
final viewService = context.read<ViewService>();
119119

120+
try {
121+
final errorMessage = await taskView.validate(
122+
taskService: taskService,
123+
viewService: viewService,
124+
);
125+
126+
if (errorMessage != null) {
127+
setState(() {
128+
this.errorMessage = errorMessage;
129+
});
130+
131+
return;
132+
} else {
133+
setState(() {
134+
_taskView = taskView;
135+
_screen = ImportScreen.present;
136+
});
137+
}
138+
} catch (_) {
139+
setState(() {
140+
errorMessage = l10n.unknownError;
141+
_screen = ImportScreen.error;
142+
});
143+
}
144+
}
145+
146+
void _importFile() async {
147+
final l10n = AppLocalizations.of(context);
148+
120149
FilePickerResult? result;
121150

122151
setState(() {
@@ -143,31 +172,9 @@ class _ImportTaskSheetState extends State<ImportTaskSheet> with TickerProviderSt
143172
reset();
144173
} else {
145174
final rawData = const Utf8Decoder().convert(result.files[0].bytes!);
146-
final data = jsonDecode(rawData);
147-
148-
final taskView = TaskView(
149-
relays: List<String>.from(data["relays"]),
150-
nostrPublicKey: data["nostrPublicKey"],
151-
encryptionPassword: data["encryptionPassword"],
152-
);
175+
final taskView = TaskView.fromJSON(jsonDecode(rawData));
153176

154-
final errorMessage = await taskView.validate(
155-
taskService: taskService,
156-
viewService: viewService,
157-
);
158-
159-
if (errorMessage != null) {
160-
setState(() {
161-
this.errorMessage = errorMessage;
162-
});
163-
164-
return;
165-
} else {
166-
setState(() {
167-
_taskView = taskView;
168-
_screen = ImportScreen.present;
169-
});
170-
}
177+
parseViewData(taskView);
171178
}
172179
} catch (_) {
173180
} finally {
@@ -180,8 +187,6 @@ class _ImportTaskSheetState extends State<ImportTaskSheet> with TickerProviderSt
180187
Future<void> _importURL() async {
181188
final url = _urlController.text;
182189
final l10n = AppLocalizations.of(context);
183-
final taskService = context.read<TaskService>();
184-
final viewService = context.read<ViewService>();
185190

186191
try {
187192
setState(() {
@@ -191,22 +196,8 @@ class _ImportTaskSheetState extends State<ImportTaskSheet> with TickerProviderSt
191196

192197
final parameters = TaskView.parseLink(url);
193198
final taskView = await TaskView.fetchFromNostr(parameters);
194-
final errorMessage = await taskView.validate(
195-
taskService: taskService,
196-
viewService: viewService,
197-
);
198199

199-
if (errorMessage == null) {
200-
setState(() {
201-
_taskView = taskView;
202-
_screen = ImportScreen.present;
203-
});
204-
} else {
205-
setState(() {
206-
this.errorMessage = errorMessage;
207-
_screen = ImportScreen.error;
208-
});
209-
}
200+
parseViewData(taskView);
210201
} catch (_) {
211202
setState(() {
212203
errorMessage = l10n.unknownError;
@@ -288,7 +279,9 @@ class _ImportTaskSheetState extends State<ImportTaskSheet> with TickerProviderSt
288279
],
289280
)
290281
else if (_screen == ImportScreen.bluetoothReceive)
291-
BluetoothReceive()
282+
ReceiveViewByBluetooth(
283+
onImport: parseViewData,
284+
)
292285
else if (_screen == ImportScreen.present)
293286
ViewImportOverview(
294287
view: _taskView!,

lib/screens/import_task_sheet_widgets/BluetoothReceive.dart

Lines changed: 0 additions & 87 deletions
This file was deleted.

0 commit comments

Comments
 (0)