Ошибка: реакция и реакция-получена не загружают следующую страницу

На странице реакции/полученной реакции в разделе активности/уведомления обнаружена ошибка.

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

Проблема вызвана несоответствием между фронтендом и бэкендом. В фронтенде идентификатор id определен как post_id, тогда как бэкенд требует reaction_id.

Черновик PR доступен по ссылке, пожалуйста, рассмотрите его, когда будет удобно.

3 лайка

Спасибо за черновик PR. Похоже, что пагинация реакций сейчас работает некорректно и приводит к дублированию.

Не уверен, что правильное решение — установка post_id. Похоже, что пагинация использует before_reaction_user_id (см. здесь). Возможно, даже удаление строки 27 (из PR) поможет, так как значение, скорее всего, уже установлено в сглаженном объекте reaction выше.

1 лайк

Спасибо за ваш ответ.
Я проверю это завтра и посмотрю, можно ли что-то исправить.

1 лайк

Круто, спасибо!

Для ясности: я считаю, что before_reaction_user_id должен быть идентификатором из таблицы discourse_reactions_reaction_users — мне кажется, это имя переменной немного запутывает. Не стесняйтесь уточнить что-либо здесь или в чате.

1 лайк

Я провёл расследование и выяснил, почему не прошли тесты rspec.

Исходный тест проверяет наличие компонента с атрибутом expect(page).to have_css(".user-stream-item [data-post-id='#{post_1.id}']").

Однако в последнем коммите атрибут data-post-id был заменён на reaction_user_id, что привело к несоответствию и, как следствие, к падению теста.


Первоначальная идея заключалась в том, чтобы изменить id для соответствия требованиям API. Однако я упустил тот факт, что id также используется в компоненте PostList как post_id, как показано ниже:

<PostList
    @posts={{@model}}
    @fetchMorePosts={{@controller.loadMore}}
    @emptyText={{i18n "notifications.empty"}}
    @additionalItemClasses="user-stream-item"
    @showUserInfo={{false}}
    class="user-stream"
  >

А атрибут id, используемый здесь, мапится в компоненте post.gjs:

data-post-id={{@post.id}}
data-topic-id={{@post.topicId}}
data-user-id={{@post.user_id}}

Таким образом, исходное поведение id не должно изменяться, так как это может вызвать серьёзные несоответствия в PostList, что и привело к падению тестов rspec вчера.


В качестве обходного решения существует другой способ:

Добавить новое поле reaction_user_id: reaction.id в flattenForPostList, а затем изменить строку return array.length ? array[array.length - 1].id : null; в функции #getLastIdFrom(array) на return array.length ? array[array.length - 1].reaction_user_id.


TL;DR:

reaction_id, post_id и теперь reaction_user_id — это совершенно разные идентификаторы, но id, используемый в компоненте PostList, должен быть post_id. В то же время id, необходимый для загрузки следующей страницы, должен быть reaction_user_id, что крайне запутанно.

@nat

Спасибо за расследование и PR @small-lovely-cat :+1:

Я добавил спецификацию в PR и сейчас его мержу.

2 лайка

Эта тема была автоматически закрыта через 19 часов. Новые ответы больше не принимаются.