forked from mirror/pixelfed
Merge pull request #928 from pixelfed/frontend-ui-refactor
Add Curated Discover
This commit is contained in:
commit
2a1d4124be
|
@ -60,23 +60,34 @@ class DiscoverController extends Controller
|
|||
->whereSlug($slug)
|
||||
->firstOrFail();
|
||||
|
||||
// todo refactor this mess
|
||||
$tagids = $tag->hashtags->pluck('id')->toArray();
|
||||
$sids = StatusHashtag::whereIn('hashtag_id', $tagids)->orderByDesc('status_id')->take(500)->pluck('status_id')->toArray();
|
||||
$posts = Status::whereIn('id', $sids)->whereNull('uri')->whereType('photo')->whereNull('in_reply_to_id')->whereNull('reblog_of_id')->orderByDesc('created_at')->paginate(21);
|
||||
$tag->posts_count = $tag->posts()->count();
|
||||
$posts = Cache::remember('discover:category-'.$tag->id.':posts', now()->addMinutes(15), function() use ($tag) {
|
||||
$tagids = $tag->hashtags->pluck('id')->toArray();
|
||||
$sids = StatusHashtag::whereIn('hashtag_id', $tagids)->orderByDesc('status_id')->take(500)->pluck('status_id')->toArray();
|
||||
$posts = Status::whereScope('public')->whereIn('id', $sids)->whereNull('uri')->whereType('photo')->whereNull('in_reply_to_id')->whereNull('reblog_of_id')->orderByDesc('created_at')->take(39)->get();
|
||||
return $posts;
|
||||
});
|
||||
$tag->posts_count = Cache::remember('discover:category-'.$tag->id.':posts_count', now()->addMinutes(30), function() use ($tag) {
|
||||
return $tag->posts()->whereScope('public')->count();
|
||||
});
|
||||
return view('discover.tags.category', compact('tag', 'posts'));
|
||||
}
|
||||
|
||||
public function showPersonal(Request $request)
|
||||
{
|
||||
$profile = Auth::user()->profile;
|
||||
// todo refactor this mess
|
||||
$tags = Hashtag::whereHas('posts')->orderByRaw('rand()')->take(5)->get();
|
||||
$following = $profile->following->pluck('id');
|
||||
$following = $following->push($profile->id)->toArray();
|
||||
$posts = Status::withCount(['likes','comments'])->whereNotIn('profile_id', $following)->whereHas('media')->whereType('photo')->orderByDesc('created_at')->paginate(21);
|
||||
$posts->post_count = Status::whereNotIn('profile_id', $following)->whereHas('media')->whereType('photo')->count();
|
||||
|
||||
$tags = Cache::remember('profile-'.$profile->id.':hashtags', now()->addMinutes(15), function() use ($profile){
|
||||
return $profile->hashtags()->groupBy('hashtag_id')->inRandomOrder()->take(8)->get();
|
||||
});
|
||||
$following = Cache::remember('profile:following:'.$profile->id, now()->addMinutes(60), function() use ($profile) {
|
||||
$res = Follower::whereProfileId($profile->id)->pluck('following_id');
|
||||
return $res->push($profile->id)->toArray();
|
||||
});
|
||||
$posts = Cache::remember('profile-'.$profile->id.':hashtag-posts', now()->addMinutes(5), function() use ($profile, $following) {
|
||||
$posts = Status::whereScope('public')->withCount(['likes','comments'])->whereNotIn('profile_id', $following)->whereHas('media')->whereType('photo')->orderByDesc('created_at')->take(39)->get();
|
||||
$posts->post_count = Status::whereScope('public')->whereNotIn('profile_id', $following)->whereHas('media')->whereType('photo')->count();
|
||||
return $posts;
|
||||
});
|
||||
return view('discover.personal', compact('posts', 'tags'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -279,4 +279,16 @@ class Profile extends Model
|
|||
{
|
||||
return $this->hasMany(Circle::class);
|
||||
}
|
||||
|
||||
public function hashtags()
|
||||
{
|
||||
return $this->hasManyThrough(
|
||||
Hashtag::class,
|
||||
StatusHashtag::class,
|
||||
'profile_id',
|
||||
'id',
|
||||
'id',
|
||||
'hashtag_id'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,10 +18,12 @@ background: linear-gradient(to right, #FFC371, #FF5F6D); /* W3C, IE 10+/ Edge, F
|
|||
<div class="container">
|
||||
<div class="pt-4 d-flex justify-content-between align-items-center">
|
||||
<p>
|
||||
@if($tags->count() > 0)
|
||||
<span class="font-weight-lighter pr-3">Related hashtags:</span>
|
||||
@foreach($tags as $hashtag)
|
||||
<a class="btn btn-outline-secondary btn-sm py-0 pr-2" href="{{$hashtag->url()}}">#{{$hashtag->name}}</a>
|
||||
@endforeach
|
||||
@endif
|
||||
</p>
|
||||
<p class="font-weight-lighter">
|
||||
{{$posts->post_count}} posts
|
||||
|
@ -50,27 +52,6 @@ background: linear-gradient(to right, #FFC371, #FF5F6D); /* W3C, IE 10+/ Edge, F
|
|||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-center pagination-container mt-4">
|
||||
{{$posts->links()}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
<script type="text/javascript">
|
||||
|
||||
$(document).ready(function() {
|
||||
$('.pagination-container').hide();
|
||||
$('.pagination').hide();
|
||||
let elem = document.querySelector('.tag-timeline');
|
||||
let infScroll = new InfiniteScroll( elem, {
|
||||
path: '.pagination__next',
|
||||
append: '.tag-timeline',
|
||||
status: '.page-load-status',
|
||||
history: true,
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
@endpush
|
||||
@endsection
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('content')
|
||||
|
||||
<div class="profile-header bg-light {{$tag->bgd ?? 'bgd-2'}}">
|
||||
<div class="profile-header bg-light bgd-2">
|
||||
<div class="container py-5">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-3">
|
||||
|
@ -24,10 +24,12 @@
|
|||
<div class="container">
|
||||
<div class="pt-4 d-flex justify-content-between align-items-center">
|
||||
<p>
|
||||
@if($tag->hashtags->count() > 0)
|
||||
<span class="font-weight-lighter pr-3">Related hashtags:</span>
|
||||
@foreach($tag->hashtags as $hashtag)
|
||||
<a class="btn btn-outline-secondary btn-sm py-0 pr-2" href="{{$hashtag->url()}}">#{{$hashtag->name}}</a>
|
||||
@endforeach
|
||||
@endif
|
||||
</p>
|
||||
<p class="font-weight-lighter">
|
||||
{{$tag->posts_count}} posts
|
||||
|
@ -56,9 +58,6 @@
|
|||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-center pagination-container mt-4">
|
||||
{{$posts->links()}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
|
@ -84,21 +83,3 @@
|
|||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
<script type="text/javascript">
|
||||
|
||||
$(document).ready(function() {
|
||||
$('.pagination-container').hide();
|
||||
$('.pagination').hide();
|
||||
let elem = document.querySelector('.tag-timeline');
|
||||
let infScroll = new InfiniteScroll( elem, {
|
||||
path: '.pagination__next',
|
||||
append: '.tag-timeline',
|
||||
status: '.page-load-status',
|
||||
history: true,
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
@endpush
|
||||
|
|
|
@ -44,31 +44,7 @@
|
|||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-center pagination-container mt-4">
|
||||
{{$posts->links()}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
|
||||
@push('meta')
|
||||
<meta property="og:description" content="Discover {{$tag->name}}">
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
<script type="text/javascript">
|
||||
|
||||
$(document).ready(function() {
|
||||
$('.pagination-container').hide();
|
||||
$('.pagination').hide();
|
||||
let elem = document.querySelector('.tag-timeline');
|
||||
let infScroll = new InfiniteScroll( elem, {
|
||||
path: '.pagination__next',
|
||||
append: '.tag-timeline',
|
||||
status: '.page-load-status',
|
||||
history: true,
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
@endpush
|
||||
|
|
|
@ -59,8 +59,10 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
|
|||
|
||||
Route::get('/home', 'HomeController@index')->name('home');
|
||||
|
||||
Route::get('discover/c/{slug}', 'DiscoverController@showCategory');
|
||||
Route::get('discover/personal', 'DiscoverController@showPersonal');
|
||||
Route::get('discover', 'DiscoverController@home')->name('discover');
|
||||
|
||||
|
||||
Route::group(['prefix' => 'api'], function () {
|
||||
Route::get('search/{tag}', 'SearchController@searchAPI')
|
||||
//->where('tag', '.*');
|
||||
|
@ -91,6 +93,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
|
|||
Route::get('shares/profile/{username}/status/{id}', 'PublicApiController@statusShares');
|
||||
Route::get('status/{id}/replies', 'InternalApiController@statusReplies');
|
||||
Route::post('moderator/action', 'InternalApiController@modAction');
|
||||
Route::get('discover/categories', 'InternalApiController@discoverCategories');
|
||||
});
|
||||
Route::group(['prefix' => 'local'], function () {
|
||||
Route::get('i/follow-suggestions', 'ApiController@followSuggestions');
|
||||
|
|
Loading…
Reference in New Issue