Files
eatvio-infra/app/Livewire/BlogPost/Create.php
2023-12-18 14:51:58 +03:00

90 lines
2.0 KiB
PHP

<?php
namespace App\Livewire\BlogPost;
use App\Models\BlogPost;
use App\Models\Tag;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use Livewire\WithFileUploads;
class Create extends Component
{
use WithFileUploads;
public $image = null;
public $state = 'archived';
public $title = '';
public $description = '';
public $tags = [];
public $videoUrl = '';
protected $listeners = ['parentComponentTagAdded', 'parentComponentTagRemoved'];
public function render()
{
return view('livewire.blog-post.create');
}
public function parentComponentTagAdded(Tag $tag)
{
$tagIndex = $tag->id;
$this->tags[$tagIndex] = $tag;
}
public function parentComponentTagRemoved($tag)
{
$this->tags = collect($this->tags)
->filter(fn ($curTag) => $curTag['name'] !== $tag)
->all();
}
public function draft()
{
$this->state = 'archived';
$this->publish();
}
public function preview()
{
$this->state = 'archived';
$this->publish();
}
public function publish()
{
$this->validate();
$post = new BlogPost();
$post->image = $this->image->store('blog_posts', 'public');
$post->state = $this->state;
$post->title = $this->title;
$post->description = $this->description;
$post->youtube_url = $this->videoUrl;
$post->save();
$tagsIds = collect($this->tags)->map(fn ($curTag) => $curTag['id']);
$post->tags()->attach($tagsIds);
$user = Auth::user();
$user->author_of_blog_post()->attach($post->id);
return redirect()->route('blog_post.show', $post->id);
}
protected function rules()
{
return [
'image' => 'required|image|max:2048',
'state' => 'required|in:active,archived',
'description' => 'required|min:3',
'videoUrl' => 'nullable|url|max:2048',
];
}
}