Skip to content

Commit 6f4a0d9

Browse files
committed
optimisation des composants livewire pour les articles
1 parent 1723abe commit 6f4a0d9

File tree

3 files changed

+92
-11
lines changed

3 files changed

+92
-11
lines changed

app/Http/Livewire/Articles/Create.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
use App\Gamify\Points\PostCreated;
66
use App\Models\Article;
77
use App\Models\Tag;
8+
use App\Models\User;
9+
use App\Notifications\SendSubmittedArticle;
810
use App\Traits\WithArticleAttributes;
911
use App\Traits\WithTagsAssociation;
1012
use Illuminate\Support\Facades\Auth;
13+
use Illuminate\Support\Facades\Notification;
1114
use Livewire\Component;
1215
use Livewire\WithFileUploads;
1316

@@ -19,9 +22,9 @@ class Create extends Component
1922

2023
public function mount()
2124
{
25+
/** @var User $user */
2226
$user = Auth::user();
2327

24-
$this->submitted = ! $user->hasAnyRole(['admin', 'moderator']);
2528
$this->submitted_at = $user->hasAnyRole(['admin', 'moderator']) ? now() : null;
2629
$this->approved_at = $user->hasAnyRole(['admin', 'moderator']) ? now() : null;
2730
}
@@ -37,23 +40,18 @@ public function submit()
3740
$this->store();
3841
}
3942

40-
public function draft()
41-
{
42-
$this->submitted = false;
43-
$this->store();
44-
}
45-
4643
public function store()
4744
{
4845
$this->validate();
4946

47+
/** @var User $user */
5048
$user = Auth::user();
5149

50+
/** @var Article $article */
5251
$article = Article::create([
5352
'title' => $this->title,
5453
'slug' => $this->slug,
5554
'body' => $this->body,
56-
'submitted' => $this->submitted,
5755
'submitted_at' => $this->submitted_at,
5856
'approved_at' => $this->approved_at,
5957
'show_toc' => $this->show_toc,
@@ -69,8 +67,11 @@ public function store()
6967
$article->addMedia($this->file->getRealPath())->toMediaCollection('media');
7068
}
7169

72-
if ($this->submitted) {
73-
// Envoi du mail a l'admin pour la validation de l'article
70+
if ($article->submitted_at) {
71+
// Envoi du mail à l'admin pour la validation de l'article.
72+
$admin = User::findByEmailAddress('monneylobe@gmail.com');
73+
Notification::send($admin, new SendSubmittedArticle($article));
74+
7475
session()->flash('status', 'Merci d\'avoir soumis votre article. Vous aurez des nouvelles que lorsque nous accepterons votre article.');
7576
}
7677

app/Http/Livewire/Articles/Edit.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44

55
use App\Models\Article;
66
use App\Models\Tag;
7+
use App\Models\User;
8+
use App\Notifications\SendSubmittedArticle;
79
use App\Traits\WithArticleAttributes;
810
use App\Traits\WithTagsAssociation;
11+
use Illuminate\Support\Facades\Auth;
12+
use Illuminate\Support\Facades\Cache;
13+
use Illuminate\Support\Facades\Notification;
914
use Livewire\Component;
1015
use Livewire\WithFileUploads;
1116

@@ -15,6 +20,7 @@ class Edit extends Component
1520

1621
public Article $article;
1722
public ?string $preview = null;
23+
public bool $alreadySubmitted = false;
1824

1925
protected $listeners = ['markdown-x:update' => 'onMarkdownUpdate'];
2026

@@ -25,6 +31,7 @@ public function mount(Article $article)
2531
$this->body = $article->body;
2632
$this->slug = $article->slug;
2733
$this->show_toc = $article->show_toc;
34+
$this->submitted_at = $article->submitted_at;
2835
$this->canonical_url = $article->originalUrl();
2936
$this->preview = $article->getFirstMediaUrl('media');
3037
$this->associateTags = $this->tags_selected = old('tags', $article->tags()->pluck('id')->toArray());
@@ -35,6 +42,13 @@ public function onMarkdownUpdate(string $content)
3542
$this->body = $content;
3643
}
3744

45+
public function submit()
46+
{
47+
$this->alreadySubmitted = $this->article->submitted_at !== null;
48+
$this->submitted_at = $this->article->submitted_at ?? now();
49+
$this->store();
50+
}
51+
3852
public function store()
3953
{
4054
$this->save();
@@ -44,12 +58,16 @@ public function save()
4458
{
4559
$this->validate();
4660

61+
/** @var User $user */
62+
$user = Auth::user();
63+
4764
$this->article->update([
4865
'title' => $this->title,
4966
'slug' => $this->slug,
5067
'body' => $this->body,
5168
'show_toc' => $this->show_toc,
5269
'canonical_url' => $this->canonical_url,
70+
'submitted_at' => $this->submitted_at,
5371
]);
5472

5573
$this->article->syncTags($this->associateTags);
@@ -58,7 +76,19 @@ public function save()
5876
$this->article->addMedia($this->file->getRealPath())->toMediaCollection('media');
5977
}
6078

61-
$this->redirectRoute('articles.show', $this->article);
79+
if (! $this->alreadySubmitted) {
80+
// Envoi du mail a l'admin pour la validation de l'article
81+
$admin = User::findByEmailAddress('monneylobe@gmail.com');
82+
Notification::send($admin, new SendSubmittedArticle($this->article));
83+
84+
session()->flash('status', 'Merci d\'avoir soumis votre article. Vous aurez des nouvelles uniquement quand nous accepterons votre article.');
85+
}
86+
87+
Cache::forget('post-' . $this->article->id);
88+
89+
$user->hasRole('user') ?
90+
$this->redirectRoute('dashboard') :
91+
$this->redirectRoute('articles.show', $this->article);
6292
}
6393

6494
public function render()
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace App\Http\Livewire\Modals;
4+
5+
use App\Gamify\Points\PostCreated;
6+
use App\Models\Article;
7+
use App\Notifications\SendApprovedArticle;
8+
use App\Policies\ArticlePolicy;
9+
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
10+
use Illuminate\Support\Facades\Cache;
11+
use LivewireUI\Modal\ModalComponent;
12+
13+
class ApprovedArticle extends ModalComponent
14+
{
15+
use AuthorizesRequests;
16+
17+
public ?Article $article = null;
18+
19+
public function mount(int $id)
20+
{
21+
$this->article = Article::find($id);
22+
}
23+
24+
public static function modalMaxWidth(): string
25+
{
26+
return 'xl';
27+
}
28+
29+
public function approved()
30+
{
31+
$this->authorize(ArticlePolicy::UPDATE, $this->article);
32+
33+
$this->article->update(['approved_at' => now()]);
34+
35+
givePoint(new PostCreated($this->article));
36+
37+
Cache::forget('post-' . $this->article->id);
38+
39+
$this->article->author->notify(new SendApprovedArticle($this->article));
40+
41+
session()->flash('status', 'L\'article a été approuvé et le mail a été envoyé à l\'auteur pour le notifier.');
42+
43+
$this->redirectRoute('articles');
44+
}
45+
46+
public function render()
47+
{
48+
return view('livewire.modals.approved-article');
49+
}
50+
}

0 commit comments

Comments
 (0)