mirror of
https://github.com/flarum/core.git
synced 2025-07-20 08:11:27 +02:00
feat(likes): Add likes tab to user profile (#3528)
This commit is contained in:
@@ -15,8 +15,10 @@ use Flarum\Likes\Event\PostWasLiked;
|
|||||||
use Flarum\Likes\Event\PostWasUnliked;
|
use Flarum\Likes\Event\PostWasUnliked;
|
||||||
use Flarum\Likes\Listener;
|
use Flarum\Likes\Listener;
|
||||||
use Flarum\Likes\Notification\PostLikedBlueprint;
|
use Flarum\Likes\Notification\PostLikedBlueprint;
|
||||||
|
use Flarum\Likes\Query\LikedByFilter;
|
||||||
use Flarum\Post\Event\Deleted;
|
use Flarum\Post\Event\Deleted;
|
||||||
use Flarum\Post\Event\Saving;
|
use Flarum\Post\Event\Saving;
|
||||||
|
use Flarum\Post\Filter\PostFilterer;
|
||||||
use Flarum\Post\Post;
|
use Flarum\Post\Post;
|
||||||
use Flarum\User\User;
|
use Flarum\User\User;
|
||||||
|
|
||||||
@@ -59,4 +61,7 @@ return [
|
|||||||
->listen(PostWasUnliked::class, Listener\SendNotificationWhenPostIsUnliked::class)
|
->listen(PostWasUnliked::class, Listener\SendNotificationWhenPostIsUnliked::class)
|
||||||
->listen(Deleted::class, [Listener\SaveLikesToDatabase::class, 'whenPostIsDeleted'])
|
->listen(Deleted::class, [Listener\SaveLikesToDatabase::class, 'whenPostIsDeleted'])
|
||||||
->listen(Saving::class, [Listener\SaveLikesToDatabase::class, 'whenPostIsSaving']),
|
->listen(Saving::class, [Listener\SaveLikesToDatabase::class, 'whenPostIsSaving']),
|
||||||
|
|
||||||
|
(new Extend\Filter(PostFilterer::class))
|
||||||
|
->addFilter(LikedByFilter::class),
|
||||||
];
|
];
|
||||||
|
21
extensions/likes/js/src/forum/addLikesTabToUserProfile.tsx
Normal file
21
extensions/likes/js/src/forum/addLikesTabToUserProfile.tsx
Normal file
@@ -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<Mithril.Children>) {
|
||||||
|
const user = this.user;
|
||||||
|
items.add(
|
||||||
|
'likes',
|
||||||
|
<LinkButton href={app.route('user.likes', { username: user.slug() })} icon="far fa-thumbs-up">
|
||||||
|
{app.translator.trans('flarum-likes.forum.user.likes_link')}
|
||||||
|
</LinkButton>,
|
||||||
|
88
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
24
extensions/likes/js/src/forum/components/LikesUserPage.tsx
Normal file
24
extensions/likes/js/src/forum/components/LikesUserPage.tsx
Normal file
@@ -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',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -7,6 +7,7 @@ import NotificationGrid from 'flarum/forum/components/NotificationGrid';
|
|||||||
import addLikeAction from './addLikeAction';
|
import addLikeAction from './addLikeAction';
|
||||||
import addLikesList from './addLikesList';
|
import addLikesList from './addLikesList';
|
||||||
import PostLikedNotification from './components/PostLikedNotification';
|
import PostLikedNotification from './components/PostLikedNotification';
|
||||||
|
import addLikesTabToUserProfile from './addLikesTabToUserProfile';
|
||||||
|
|
||||||
app.initializers.add('flarum-likes', () => {
|
app.initializers.add('flarum-likes', () => {
|
||||||
app.notificationComponents.postLiked = PostLikedNotification;
|
app.notificationComponents.postLiked = PostLikedNotification;
|
||||||
@@ -16,6 +17,7 @@ app.initializers.add('flarum-likes', () => {
|
|||||||
|
|
||||||
addLikeAction();
|
addLikeAction();
|
||||||
addLikesList();
|
addLikesList();
|
||||||
|
addLikesTabToUserProfile();
|
||||||
|
|
||||||
extend(NotificationGrid.prototype, 'notificationTypes', function (items) {
|
extend(NotificationGrid.prototype, 'notificationTypes', function (items) {
|
||||||
items.add('postLiked', {
|
items.add('postLiked', {
|
||||||
|
@@ -35,3 +35,7 @@ flarum-likes:
|
|||||||
# These translations are used in the Settings page.
|
# These translations are used in the Settings page.
|
||||||
settings:
|
settings:
|
||||||
notify_post_liked_label: Someone likes one of my posts
|
notify_post_liked_label: Someone likes one of my posts
|
||||||
|
|
||||||
|
# These translations are used in the User profile page.
|
||||||
|
user:
|
||||||
|
likes_link: Likes
|
||||||
|
34
extensions/likes/src/Query/LikedByFilter.php
Normal file
34
extensions/likes/src/Query/LikedByFilter.php
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Flarum.
|
||||||
|
*
|
||||||
|
* For detailed copyright and license information, please view the
|
||||||
|
* LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Flarum\Likes\Query;
|
||||||
|
|
||||||
|
use Flarum\Filter\FilterInterface;
|
||||||
|
use Flarum\Filter\FilterState;
|
||||||
|
|
||||||
|
class LikedByFilter implements FilterInterface
|
||||||
|
{
|
||||||
|
public function getFilterKey(): string
|
||||||
|
{
|
||||||
|
return 'likedBy';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function filter(FilterState $filterState, string $filterValue, bool $negate)
|
||||||
|
{
|
||||||
|
$likedId = trim($filterValue, '"');
|
||||||
|
|
||||||
|
$filterState
|
||||||
|
->getQuery()
|
||||||
|
->whereIn('id', function ($query) use ($likedId, $negate) {
|
||||||
|
$query->select('post_id')
|
||||||
|
->from('post_likes')
|
||||||
|
->where('user_id', $negate ? '!=' : '=', $likedId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user