Files
eatvio-infra/app/Livewire/Diet/Create.php
2024-01-15 15:10:57 +03:00

105 lines
2.5 KiB
PHP

<?php
namespace App\Livewire\Diet;
use App\Models\Diet;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use Livewire\WithFileUploads;
use Illuminate\Contracts\View\Factory as ViewFactory;
use Illuminate\Contracts\View\View;
class Create extends Component
{
use WithFileUploads;
public string $name = '';
public string $image;
public int $duration = 7;
public string $state = 'draft';
public array $type = [];
public string $details = '';
public array $days = [];
public int $copyedDay;
public array $copyedDayData;
/** @phpstan-ignore-next-line */
protected $listeners = ['dayUpdated', 'makeCopy', 'makePaste'];
public function render(): View|ViewFactory
{
return view('livewire.diet.create');
}
public function dayUpdated(int $dayIndex, array $data): void
{
$this->days[$dayIndex] = $data;
}
public function showPreview(): void
{
$this->state = 'draft';
$this->publish();
}
public function addToDrafts(): void
{
$this->state = 'draft';
$this->publish();
}
public function makeCopy(int $day):void
{
$this->copyedDay = $day;
}
public function makePaste(int $copyToDay): void
{
$data = $this->days[$this->copyedDay];
$this->dispatch('takePaste', day: $copyToDay, data: $data)->to('diet.day-edit');
}
public function publish(): void
{
$this->validate();
$diet = new Diet();
$diet->name = $this->name;
/** @phpstan-ignore-next-line */
$diet->image = $this->image->store('diets', 'public');
$diet->duration = $this->duration;
$diet->state = $this->state;
$diet->type = json_encode($this->type);
$diet->details = $this->details;
$diet->daily_schedule = json_encode($this->days);
$diet->save();
$user = Auth::user();
$user->author_of_diets()->attach($diet->id);
// return redirect()->route('diet.show', $diet->id);
$this->redirectRoute('diet.show', $diet->id);
}
protected function rules(): array
{
return [
'name' => 'required|min:3',
'image' => 'required|image|max:2048',
'duration' => 'required|numeric|min:7',
'state' => 'required|in:draft,active,inactive',
'type' => ['required', 'array:meat,veg,corb,alko', 'min:1'],
'details' => 'required|min:3',
];
}
}