Я использую expo для создания событий в календаре IOS / Android.
Ниже приведен код, который я использую для создания событий в календаре. Но в экспо-проверке нет механизма, если событие уже существует до создания нового, что привело к дублированию созданных событий, в этом нужна помощь.
export default class CalendarEvents extends React.Component {
constructor(props) {
super(props);
this.state = {
items: {},
itemsCalendar: {},
events: {},
isLoading : true
}
}
_askForCalendarPermissions = async () => {
const response = await Permissions.askAsync(Permissions.CALENDAR)
return response.status === 'granted'
}
_askForReminderPermissions = async () => {
if (Platform.OS === 'android') {
return true
}
const response = await Permissions.askAsync(Permissions.REMINDERS)
return response.status === 'granted'
}
_findCalendars = async () => {
const calendarGranted = await this._askForCalendarPermissions()
const reminderGranted = await this._askForReminderPermissions()
let calendars = []
if (calendarGranted && reminderGranted) {
calendars = await Calendar.getCalendarsAsync()
}
return calendars
}
_createNewCalendar = async (calendars) => {
const newCalendar = {
title: 'T&D Events',
entityType: Calendar.EntityTypes.EVENT,
color: '#2196F3',
sourceId:
Platform.OS === 'ios'
? calendars.find(cal => cal.source && cal.source.name === 'Default').source.id
: undefined,
source:
Platform.OS === 'android'
? {
name: calendars.find(cal => cal.accessLevel === Calendar.CalendarAccessLevel.OWNER).source.name,
isLocalAccount: true
}
: undefined,
name: 'T&D Events',
accessLevel: Calendar.CalendarAccessLevel.OWNER,
ownerAccount:
Platform.OS === 'android'
? calendars.find(cal => cal.accessLevel == Calendar.CalendarAccessLevel.OWNER).ownerAccount
: undefined
}
let calendarId = null
try {
await calendars.filter(element => {
if(element.title == newCalendar.title)
{
//await Calendar.createCalendarAsync(newCalendar);
calendarId = element.id;
}
else
{
}
});
if(calendarId == null){
calendarId = await Calendar.createCalendarAsync(newCalendar);
}
} catch (e) {
Alert.alert('the calendar has not been saved', e.message)
}
return calendarId
}
_addEventsToCalendar = async (calendarId,item) => {
const event = {
title:item.name,
location: item.location,
date:item.date,
startDate: moment(item.start_time).toDate(),
endDate: moment(item.end_time).toDate(),
timeZone: 'GMT+3'
}
try {
await Calendar.createEventAsync(calendarId, event)
} catch (e) {
Alert.alert('An error occurred while adding your unavailability to your calendar')
}
}
synchronizeCalendar = async (item) => {
let calendars = await this._findCalendars();
const calendarId = await this._createNewCalendar(calendars);
try {
await this._addEventsToCalendar(calendarId,item)
Alert.alert('The calendar has been synchronized')
} catch (e) {
Alert.alert('An error occurred while adding events to the calendar', e.message)
}
}
renderItem(item) {
return (
<View style={[styles.item, { height: item.height }]}>
<Text>Date: {moment(item.start_time).format('YYYY-MM-DD').toString()}</Text>
<Text>From: {moment(item.start_time).format('h a').toString()}</Text>
<Text>To: {moment(item.end_time).format('h a').toString()}</Text>
<Text>Name:{item.name}</Text>
<Text>Location: {item.location}</Text>
<Text>Audience:{item.audience}</Text>
{/* <Text>Type: {item.type}</Text> */}
<TouchableOpacity style={styles.addCover} onPress={() => this.synchronizeCalendar(item)}>
<Image source={ TDIcons[0].addCalendar.image} style={styles.tdicon} />
<Text style={styles.addCalendar}>Add to Calendar</Text>
</TouchableOpacity>
</View>
);
}
renderEmptyDate() {
return (
<View style={styles.emptyDate}>
<Text />
</View>
);
}
rowHasChanged(r1, r2) {
return r1.name !== r2.name;
}
timeToString(time) {
const date = new Date(time);
return date.toISOString().split("T")[0];
}
}
Я использую для создания событий в календаре. Но в экспо-проверке отсутствует механизм, если событие уже существует до создания нового, что привело к дублированию создаваемых событий, и в этом нужна помощь.