@umituz/react-native-contacts
v1.1.0
Published
Device contacts access for React Native apps - Privacy-first design with permission management
Downloads
99
Maintainers
Readme
@umituz/react-native-contacts
Device contacts access for React Native apps - Privacy-first design with permission management.
Features
- ✅ Contact Access - Read device contacts with permission management
- ✅ Contact Search - Search contacts by name, company, nickname
- ✅ Contact Picker - iOS contact picker (no permission needed)
- ✅ Contact CRUD - Create, update, delete contacts (requires WRITE permission)
- ✅ Phone/Email Extraction - Get primary phone numbers and emails
- ✅ Contact Utilities - Format, sort, group, and validate contacts
- ✅ Privacy-First - Explicit permission handling
Installation
npm install @umituz/react-native-contactsPeer Dependencies
npm install expo-contactsUsage
Basic Contact Access
import { useContacts } from '@umituz/react-native-contacts';
function MyComponent() {
const {
permission,
isPermissionGranted,
contacts,
isLoading,
requestPermission,
loadContacts,
} = useContacts();
useEffect(() => {
requestPermission().then(perm => {
if (perm.status === 'granted') {
loadContacts();
}
});
}, []);
if (!isPermissionGranted) {
return <Button title="Request Permission" onPress={requestPermission} />;
}
return (
<FlatList
data={contacts}
renderItem={({ item }) => <Text>{item.name}</Text>}
/>
);
}Contact Search
const { searchContacts, contacts } = useContacts();
const handleSearch = (query: string) => {
searchContacts(query);
};iOS Contact Picker (No Permission Needed)
const { presentContactPicker } = useContacts();
const handlePicker = async () => {
const contact = await presentContactPicker(['phoneNumbers', 'emails']);
if (contact) {
console.log('Selected:', contact);
}
};Contact Utilities
import { ContactUtils } from '@umituz/react-native-contacts';
// Get display name
const name = ContactUtils.getDisplayName(contact);
// Get primary phone/email
const phone = ContactUtils.getPrimaryPhone(contact);
const email = ContactUtils.getPrimaryEmail(contact);
// Format phone number
const formatted = ContactUtils.formatPhone('1234567890'); // "(123) 456-7890"
// Get initials
const initials = ContactUtils.getInitials(contact); // "JD"
// Group by first letter
const groups = ContactUtils.groupByFirstLetter(contacts);API Reference
useContacts()
React hook for contacts management.
Returns:
permission- Current permission statusisPermissionGranted- Boolean permission statuscontacts- Array of contactsisLoading- Loading staterequestPermission()- Request contacts permissionloadContacts(query?)- Load all contactssearchContacts(query, options?)- Search contactspresentContactPicker(fields?)- iOS contact pickercreateContact(contact)- Create new contactupdateContact(id, contact)- Update contactdeleteContact(id)- Delete contact
ContactsService
Static service class for contacts operations.
Methods:
requestPermission()- Request permissiongetAllContacts(query?)- Get all contactssearchContacts(query, options?)- Search contactsgetContactById(id, fields?)- Get contact by IDpresentContactPicker(fields?)- iOS contact pickercreateContact(contact)- Create contactupdateContact(id, contact)- Update contactdeleteContact(id)- Delete contact
ContactUtils
Utility class for contact operations.
Methods:
getDisplayName(contact)- Get display namegetPrimaryPhone(contact)- Get primary phonegetPrimaryEmail(contact)- Get primary emailformatPhone(phone)- Format phone numbergetInitials(contact)- Get contact initialsgroupByFirstLetter(contacts)- Group by first lettersearchByName(contacts, query)- Search by namesortByName(contacts, order?)- Sort by name
Privacy
This package requires explicit user permission:
- Android:
READ_CONTACTSpermission - iOS:
NSContactsUsageDescriptionin Info.plist
For iOS, you can use presentContactPicker() without full permission - it's more privacy-friendly.
License
MIT
Author
Ümit UZ [email protected]
