React Native Expo - создать проблему дублирования событий? - PullRequest
0 голосов
/ 22 марта 2020

Я использую 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];
  }
}

Я использую для создания событий в календаре. Но в экспо-проверке отсутствует механизм, если событие уже существует до создания нового, что привело к дублированию создаваемых событий, и в этом нужна помощь.

...