diff --git a/extensions/likes/extend.php b/extensions/likes/extend.php index 55327b7b7..58a03544d 100644 --- a/extensions/likes/extend.php +++ b/extensions/likes/extend.php @@ -15,8 +15,10 @@ use Flarum\Likes\Event\PostWasLiked; use Flarum\Likes\Event\PostWasUnliked; use Flarum\Likes\Listener; use Flarum\Likes\Notification\PostLikedBlueprint; +use Flarum\Likes\Query\LikedByFilter; use Flarum\Post\Event\Deleted; use Flarum\Post\Event\Saving; +use Flarum\Post\Filter\PostFilterer; use Flarum\Post\Post; use Flarum\User\User; @@ -59,4 +61,7 @@ return [ ->listen(PostWasUnliked::class, Listener\SendNotificationWhenPostIsUnliked::class) ->listen(Deleted::class, [Listener\SaveLikesToDatabase::class, 'whenPostIsDeleted']) ->listen(Saving::class, [Listener\SaveLikesToDatabase::class, 'whenPostIsSaving']), + + (new Extend\Filter(PostFilterer::class)) + ->addFilter(LikedByFilter::class), ]; diff --git a/extensions/likes/js/src/forum/addLikesTabToUserProfile.tsx b/extensions/likes/js/src/forum/addLikesTabToUserProfile.tsx new file mode 100644 index 000000000..6603bcb74 --- /dev/null +++ b/extensions/likes/js/src/forum/addLikesTabToUserProfile.tsx @@ -0,0 +1,21 @@ +import { extend } from 'flarum/common/extend'; +import app from 'flarum/forum/app'; +import UserPage from 'flarum/forum/components/UserPage'; +import LinkButton from 'flarum/common/components/LinkButton'; +import LikesUserPage from './components/LikesUserPage'; +import ItemList from 'flarum/common/utils/ItemList'; +import type Mithril from 'mithril'; + +export default function addLikesTabToUserProfile() { + app.routes['user.likes'] = { path: '/u/:username/likes', component: LikesUserPage }; + extend(UserPage.prototype, 'navItems', function (items: ItemList) { + const user = this.user; + items.add( + 'likes', + + {app.translator.trans('flarum-likes.forum.user.likes_link')} + , + 88 + ); + }); +} diff --git a/extensions/likes/js/src/forum/components/LikesUserPage.tsx b/extensions/likes/js/src/forum/components/LikesUserPage.tsx new file mode 100644 index 000000000..941716ac2 --- /dev/null +++ b/extensions/likes/js/src/forum/components/LikesUserPage.tsx @@ -0,0 +1,24 @@ +import app from 'flarum/forum/app'; +import PostsUserPage from 'flarum/forum/components/PostsUserPage'; + +/** + * The `LikesUserPage` component shows posts which user the user liked. + */ +export default class LikesUserPage extends PostsUserPage { + /** + * Load a new page of the user's activity feed. + * + * @param offset The position to start getting results from. + * @protected + */ + loadResults(offset: number) { + return app.store.find('posts', { + filter: { + type: 'comment', + likedBy: this.user.id(), + }, + page: { offset, limit: this.loadLimit }, + sort: '-createdAt', + }); + } +} diff --git a/extensions/likes/js/src/forum/index.js b/extensions/likes/js/src/forum/index.js index 648feaf49..5f9184a77 100644 --- a/extensions/likes/js/src/forum/index.js +++ b/extensions/likes/js/src/forum/index.js @@ -7,6 +7,7 @@ import NotificationGrid from 'flarum/forum/components/NotificationGrid'; import addLikeAction from './addLikeAction'; import addLikesList from './addLikesList'; import PostLikedNotification from './components/PostLikedNotification'; +import addLikesTabToUserProfile from './addLikesTabToUserProfile'; app.initializers.add('flarum-likes', () => { app.notificationComponents.postLiked = PostLikedNotification; @@ -16,6 +17,7 @@ app.initializers.add('flarum-likes', () => { addLikeAction(); addLikesList(); + addLikesTabToUserProfile(); extend(NotificationGrid.prototype, 'notificationTypes', function (items) { items.add('postLiked', { diff --git a/extensions/likes/locale/en.yml b/extensions/likes/locale/en.yml index 08a3de4b8..1d7a39e0b 100644 --- a/extensions/likes/locale/en.yml +++ b/extensions/likes/locale/en.yml @@ -35,3 +35,7 @@ flarum-likes: # These translations are used in the Settings page. settings: notify_post_liked_label: Someone likes one of my posts + + # These translations are used in the User profile page. + user: + likes_link: Likes diff --git a/extensions/likes/src/Query/LikedByFilter.php b/extensions/likes/src/Query/LikedByFilter.php new file mode 100644 index 000000000..09207473a --- /dev/null +++ b/extensions/likes/src/Query/LikedByFilter.php @@ -0,0 +1,34 @@ +getQuery() + ->whereIn('id', function ($query) use ($likedId, $negate) { + $query->select('post_id') + ->from('post_likes') + ->where('user_id', $negate ? '!=' : '=', $likedId); + }); + } +}