Как лучше всего проверить, существует ли элемент в массиве firestore, и если он есть, запустить функцию, а если нет, добавить ее? - PullRequest
0 голосов
/ 23 мая 2019

Я разрабатываю кнопку «Мне нравится», и в настоящее время число лайков увеличивается на 1 при каждом нажатии кнопки «Нравится».Тем не менее, я хочу сделать это более надежным и динамичным, и если вошедшему в систему пользователю уже понравился пост, то я хочу, чтобы его «лайк» исчез из аля Facebook, Reddit (upvote) и т. Д.

В настоящее время я отслеживаю количество лайков и кому понравился пост.Структура выглядит следующим образом:

post: {
  likes: 3,
  likedBy: ['userA', 'userB', 'userC']
}

Итак, я хочу, чтобы: когда нажимается кнопка «Мне нравится», я хочу выполнить поиск в свойстве likesBy, чтобы увидеть, понравился ли зарегистрированному пользователю пост,а затем либо увеличьте значение «Нравится» на 1, и добавьте их в массив, либо уменьшите значение «Нравится» на 1 и удалите их из массива.

Мне трудно понять, как написать эту логику с помощью действия React, которое обрабатывает это взаимодействие с firestore.

Вот что я написал до сих пор:

export const newLike = (post) => {
  return (dispatch, getState, {getFirebase, getFirestore})  => {
    const firestore = getFirestore();
    const signedInUser = getState().firebase.auth;
    console.log(signedInUser)
    firestore.collection('posts').doc(post.id).update({
      likes: (post.likes + 1),
      likedBy: firestore.FieldValue.arrayUnion(signedInUser)
    }).then(()=> {
      dispatch({type: types.NEW_LIKE, post});
    }).catch((err) => {
      dispatch({ type: types.NEW_LIKE_ERROR, err});
    });
  };
};

1 Ответ

0 голосов
/ 23 мая 2019

В вашей структуре данных вам не нужно хранить likes, так как вы можете получить ее из избранного.Я не знаком с API Firestore, но приведенная ниже логика должна делать то, что вы хотите, вам просто нужно получить / установить дату в / из Firestore

  return (dispatch, getState, {getFirebase, getFirestore})  => {
    const signedInUser = getState().firebase.auth;
    const posts = ...// get current state of post, with likedBy field. Also, I assume here, that likedBy is always an array, with data or empty
    let updatedLikedBy;
    if(posts.likedBy.indexOf(signedInUser) ===-1){ //assuming that signedInUser is a string
      updatedLikedBy = [...post.likedBy, signedInUser]
    } else {
      updatedLikedBy = post.likedBy.filter(item=>item!==signedInUser)
    }

    const updatedPost = {likedBy: updatedLikedBy} // now you can send this to firestore, and fire actions after success or fail.
  };
};

Чтобы получить likes, теперь вам просто нужно сделатьposts.likedBy.length

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...