Я работаю над многопользовательским приложением с react-native
.
Одной из функций является то, что пользователи могут делиться сообщениями текстовой базы и ставить им лайки, а также иметь проблемы с отображением текущего состояния лайков (сделал ли пользователь понравился этот пост или нет) и подсчитайте их (сколько лайков получит каждый пост).
Моя база данных - firebase
realtime database
, и я новичок в создании собственной базы данных. Поразмыслив над журналом, я решил хранить свои лайки в виде объекта внутри каждого сообщения, где я бы поместил идентификатор пользователя и истину для представления, что им понравилось, а при втором нажатии просто удалил. Тогда я мог бы легко использовать идентификатор пользователя, чтобы узнать, понравился ли пользователю пост занавеса и сколько ключей имеет сам объект для подсчета лайков.
Итак, в конце концов, я получаю данные как объект сообщения, где у каждого сообщения есть строка идентификатора, текстовая строка для тела сообщения, строка идентификатора пользователя для того, кто им поделился, и объект лайков с идентификаторами пользователей, которым он понравился.
фактические данные о лайках и представление их как понравившихся или нет. Я использую redux
и написал промежуточное ПО для получения таких лайков
export const getAndListenLikes = (postID) => (dispatch, getState) => {
try {
const state = getState();
const feedID = selectActivePosts(state);
const likesCout = fbApp.db.ref(`posts/${feedID}/${postID}/likes`);
likesCout.on('value', (snapshot) => {
if (snapshot.exists()) {
const likesCoutObj = snapshot.val();
return likesCoutObj
}
});
return () => likesCout.off();
} catch (err) {
console.log('getAndListenLikes', err);
}
};
Я использую его для применения middewhre
const store = createStore(rootPersistReducer, composeWithDevTools(applyMiddleware(thunk)));
, и вот мой компонент, где Я пытаюсь использовать его
export const HomeScreenPostLikes = connect(null, {
toggleLike, getAndListenLikes
})(({ postID, toggleLike , getAndListenLikes}) => {
const [ isLiked, setIsLiked ] = useState();
//state shoud represent the currents state of like(liked or not)
const like = getAndListenLikes(postID)
console.log('like',like)//gets null for some reason
const handleLike=()=>{
setIsLiked((v)=>!v)
toggleLike(postID)
}
return (
<View style={styles.container}>
<TouchableOpacity onPress={handleLike}>
<AntDesign name="heart" size={15} color={isLiked ? COLORS.acsentColor : COLORS.textColorDark} />
</TouchableOpacity>
<Text style={styles.count}>{}</Text>
</View>
);
});
Я хотел установить объект лайков, а затем установить статус лайков, отфильтровав его с помощью идентификатора пользователя, к которому у меня есть доступ на моем reducer
. Однако возврат фактического объекта не работает.
Я не могу использовать redux
для сохранения лайков каждого сообщения, потому что тогда я получаю только лайки из последнего опубликованного сообщения. Я попытался написать специальное промежуточное ПО для получения статуса пользователя и установки его значения на начальное значение хука useState. Но это тоже не сработало.
Как лучше вернуть данные?