65 lines
1.8 KiB
Dart
65 lines
1.8 KiB
Dart
import 'package:dialer/features/contacts/contact_state.dart';
|
|
import 'package:dialer/features/contacts/widgets/alphabet_scroll_page.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:dialer/widgets/loading_indicator.dart';
|
|
import 'package:flutter_contacts/flutter_contacts.dart';
|
|
|
|
const bool _privacyMode = bool.fromEnvironment('privacy-mode', defaultValue: false);
|
|
|
|
List<Contact> _maskContacts(List<Contact> original) {
|
|
if (!_privacyMode) return original;
|
|
return original.map((c) {
|
|
final maskedName = _maskName(c.displayName);
|
|
final phones = c.phones.map((p) => Phone(
|
|
_maskPhone(p.number),
|
|
label: p.label,
|
|
)).toList();
|
|
final masked = Contact()
|
|
..displayName = maskedName
|
|
..thumbnail = c.thumbnail
|
|
..phones = phones
|
|
..id = c.id;
|
|
return masked;
|
|
}).toList();
|
|
}
|
|
|
|
String _maskName(String name) {
|
|
final parts = name.split(' ');
|
|
return parts.map((part) {
|
|
if (part.length < 2) return part;
|
|
return '${part[0]}${'*' * (part.length - 1)}';
|
|
}).join(' ');
|
|
}
|
|
|
|
String _maskPhone(String phone) {
|
|
if (phone.length < 3) return phone;
|
|
return phone.substring(0, 2) + '*' * (phone.length - 2);
|
|
}
|
|
|
|
class FavoritesPage extends StatefulWidget {
|
|
const FavoritesPage({super.key});
|
|
|
|
@override
|
|
_FavoritesPageState createState() => _FavoritesPageState();
|
|
}
|
|
|
|
class _FavoritesPageState extends State<FavoritesPage> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final contactState = ContactState.of(context);
|
|
return Scaffold(
|
|
body: contactState.loading
|
|
? const LoadingIndicatorWidget()
|
|
: AlphabetScrollPage(
|
|
scrollOffset: contactState.scrollOffset,
|
|
contacts: _maskContacts(contactState.favoriteContacts),
|
|
),
|
|
);
|
|
}
|
|
}
|