Files
MobilApp/lib/services/contact_export_service.dart

91 lines
2.6 KiB
Dart

import 'dart:io';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';
import '../models/contact.dart';
/// Kapcsolatok CSV-export — a kitűzési jegyzőkönyv-exporttal azonos elvek.
///
/// Két dialektus:
/// * MAGYAR (Excel-barát): pontosvessző elválasztó, UTF-8 BOM-mal
/// (enélkül az Excel elrontja az ékezeteket)
/// * NEMZETKÖZI: vessző elválasztó
///
/// Mivel a lista már projekthez szűrt (ContactsController.filtered), az
/// export mindig a JELENLEG LÁTOTT (kereséssel/projekttel szűrt) sorokat
/// menti — amit a képernyőn látsz, azt kapod a fájlban is.
class ContactExportService {
ContactExportService._();
static Future<void> exportAndShare({
required List<Contact> contacts,
required bool hungarian,
String projectName = '',
}) async {
if (contacts.isEmpty) {
throw StateError('Nincs exportálható kapcsolat.');
}
final rows = List<Contact>.from(contacts)
..sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
final sep = hungarian ? ';' : ',';
String txt(String s) {
final v = s.trim();
return v.contains(sep) || v.contains('"') || v.contains('\n')
? '"${v.replaceAll('"', '""')}"'
: v;
}
final header = [
'Nev',
'Cim',
'Telefon',
'Email',
'Megjegyzes',
'Szélesség',
'Hosszúság',
'EOV_Y',
'EOV_X'
].join(sep);
final sb = StringBuffer();
sb.write('\uFEFF'); // UTF-8 BOM — az Excel enélkül elrontja az ékezeteket
sb.writeln(header);
for (final c in rows) {
sb.writeln([
txt(c.name),
txt(c.address),
txt(c.phone),
txt(c.email),
txt(c.note),
c.lat?.toString() ?? '',
c.lon?.toString() ?? '',
c.eovY?.toString() ?? '',
].join(sep));
}
final dir = await getTemporaryDirectory();
final stamp = DateTime.now()
.toIso8601String()
.substring(0, 16)
.replaceAll(':', '')
.replaceAll('-', '')
.replaceAll('T', '_');
final safeName = projectName.isEmpty
? 'kapcsolatok'
: 'kapcsolatok_${projectName.replaceAll(RegExp(r'[^\w\-]'), '_')}';
final path = p.join(dir.path, '${safeName}_$stamp.csv');
await File(path).writeAsString(sb.toString(), flush: true);
await SharePlus.instance.share(ShareParams(
files: [XFile(path, mimeType: 'text/csv')],
subject: 'Kapcsolatok — $projectName',
text: '${rows.length} kapcsolat',
));
}
}