Skip to content

Commit e1423d7

Browse files
authored
feat: [LAR-28] add articles livewire page (#171)
1 parent 78d362b commit e1423d7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+677
-1087
lines changed

app/Actions/Article/CreateArticleAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace App\Actions\Article;
66

7-
use App\Data\Article\CreateArticleData;
7+
use App\Data\CreateArticleData;
88
use App\Gamify\Points\ArticleCreated;
99
use App\Models\Article;
1010
use App\Notifications\PostArticleToTelegram;

app/Actions/Discussion/CreateDiscussionAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace App\Actions\Discussion;
66

7-
use App\Data\Discussion\CreateDiscussionData;
7+
use App\Data\CreateDiscussionData;
88
use App\Gamify\Points\DiscussionCreated;
99
use App\Models\Discussion;
1010
use App\Notifications\PostDiscussionToTelegram;

app/Data/Article/CreateArticleData.php renamed to app/Data/CreateArticleData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace App\Data\Article;
5+
namespace App\Data;
66

77
use Carbon\Carbon;
88
use Illuminate\Http\UploadedFile;

app/Data/Discussion/CreateDiscussionData.php renamed to app/Data/CreateDiscussionData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace App\Data\Discussion;
5+
namespace App\Data;
66

77
use Spatie\LaravelData\Data;
88

app/Http/Controllers/ArticlesController.php

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,8 @@
55
namespace App\Http\Controllers;
66

77
use App\Models\Article;
8-
use App\Models\User;
98
use App\Policies\ArticlePolicy;
109
use Illuminate\Contracts\View\View;
11-
use Illuminate\Support\Facades\Auth;
12-
use Illuminate\Support\Facades\Cache;
1310

1411
final class ArticlesController extends Controller
1512
{
@@ -18,43 +15,6 @@ public function __construct()
1815
$this->middleware(['auth', 'verified'], ['except' => ['index', 'show']]);
1916
}
2017

21-
public function index(): View
22-
{
23-
return view('articles.index');
24-
}
25-
26-
public function show(Article $article): View
27-
{
28-
/** @var User $user */
29-
$user = Auth::user();
30-
31-
views($article)->record();
32-
33-
/** @var Article $article */
34-
$article = Cache::remember('post-'.$article->id, now()->addHour(), fn () => $article);
35-
36-
abort_unless(
37-
$article->isPublished() || ($user && $article->isAuthoredBy($user)) || ($user && $user->hasAnyRole(['admin', 'moderator'])), // @phpstan-ignore-line
38-
404
39-
);
40-
41-
$image = $article->getFirstMediaUrl('media');
42-
// @phpstan-ignore-next-line
43-
seo()
44-
->title($article->title)
45-
->description($article->excerpt(100))
46-
->image($image)
47-
->twitterTitle($article->title)
48-
->twitterDescription($article->excerpt(100))
49-
->twitterImage($image)
50-
->twitterSite('laravelcm')
51-
->withUrl();
52-
53-
return view('articles.show', [
54-
'article' => $article->loadCount('views'),
55-
]);
56-
}
57-
5818
public function create(): View
5919
{
6020
return view('articles.new');

app/Livewire/Articles/Browse.php

Lines changed: 0 additions & 78 deletions
This file was deleted.

app/Livewire/Articles/Create.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace App\Livewire\Articles;
66

77
use App\Actions\Article\CreateArticleAction;
8-
use App\Data\Article\CreateArticleData;
8+
use App\Data\CreateArticleData;
99
use App\Models\Tag;
1010
use App\Models\User;
1111
use App\Traits\WithArticleAttributes;

app/Livewire/Discussions/Create.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace App\Livewire\Discussions;
66

77
use App\Actions\Discussion\CreateDiscussionAction;
8-
use App\Data\Discussion\CreateDiscussionData;
8+
use App\Data\CreateDiscussionData;
99
use App\Models\Tag;
1010
use App\Traits\WithTagsAssociation;
1111
use Illuminate\Contracts\View\View;

app/Livewire/Pages/Articles/Index.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Livewire\Pages\Articles;
6+
7+
use App\Models\Article;
8+
use App\Models\Tag;
9+
use App\Traits\WithInfiniteScroll;
10+
use Illuminate\Contracts\View\View;
11+
use Livewire\Component;
12+
13+
final class Index extends Component
14+
{
15+
use WithInfiniteScroll;
16+
17+
public function render(): View
18+
{
19+
return view('livewire.pages.articles.index', [
20+
'articles' => Article::with(['tags', 'user', 'user.transactions'])
21+
->withCount(['views', 'reactions'])
22+
->scopes(['published', 'notPinned'])
23+
->orderByDesc('sponsored_at')
24+
->orderByDesc('published_at')
25+
->paginate($this->perPage),
26+
'tags' => Tag::query()->whereHas('articles', function ($query): void {
27+
$query->published();
28+
})->orderBy('name')->get(),
29+
])
30+
->title(__('pages/article.title'));
31+
}
32+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Livewire\Pages\Articles;
6+
7+
use App\Models\Article;
8+
use App\Models\User;
9+
use Illuminate\Contracts\View\View;
10+
use Illuminate\Support\Facades\Auth;
11+
use Livewire\Component;
12+
13+
final class SinglePost extends Component
14+
{
15+
public Article $article;
16+
17+
public function mount(Article $article): void
18+
{
19+
/** @var User $user */
20+
$user = Auth::user();
21+
views($article)->cooldown(now()->addHours(2))->record();
22+
23+
$article = $article->load(['media', 'user'])->loadCount('views');
24+
25+
abort_unless(
26+
$article->isPublished() || ($user && $article->isAuthoredBy($user)) || ($user && $user->hasAnyRole(['admin', 'moderator'])), // @phpstan-ignore-line
27+
404
28+
);
29+
30+
$image = empty($article->getFirstMediaUrl('media'))
31+
? $article->getFirstMediaUrl('media')
32+
: asset('/images/socialcard.png');
33+
34+
// @phpstan-ignore-next-line
35+
seo()
36+
->title($article->title)
37+
->description($article->excerpt(150))
38+
->image($image)
39+
->twitterTitle($article->title)
40+
->twitterDescription($article->excerpt(150))
41+
->twitterImage($image)
42+
->twitterSite('laravelcm')
43+
->withUrl();
44+
45+
$this->article = $article;
46+
}
47+
48+
public function render(): View
49+
{
50+
return view('livewire.pages.articles.single-post')->title($this->article->title);
51+
}
52+
}

0 commit comments

Comments
 (0)