Untitled

 avatar
unknown
php
2 years ago
3.4 kB
6
Indexable
<?php

namespace App\Http\Livewire\Production\Tasks\Comments;

use App\Models\ProductionAssignmentLinkComment;
use App\Models\ProductionTask;
use App\Models\ProductionTaskComment;
use Livewire\Component;

class Write extends Component
{
    public ProductionTask $task;

    public ?string $comment = '';

    public ProductionTaskComment|ProductionAssignmentLinkComment|null $replyComment = null;

    public ?string $optionType = '';

    public bool $isLinkComment = false;

    public $activeLink;

    public array $form = [
        'timestamp' => 0,
    ];

    protected $listeners = [
        'replyComment', 'activeLink'
    ];


    public function render()
    {
        return view('production.tasks.comments.write');
    }

    public function mount()
    {
        $this->activeLink = $this->task->researchAssignment->links[0]->id;
    }

    public function activeLink($activeLink)
    {
        $this->form['timestamp'] = 0;
        $this->activeLink = $activeLink['id'];
    }

    public function replyComment(int $id, string $type)
    {
        $this->replyComment = $type === 'task_comment'
            ? $this->task->comments()->findOrFail($id)
            : $this->task->researchAssignment->linkComments()->findOrFail($id);

        abort_if(!is_null($this->replyComment->parent_id), 403);
    }

    public function submit()
    {
        $this->validate([
            'comment' => 'required|string|min:3|max:1500'
        ]);

        if ($this->replyComment instanceof ProductionTaskComment) {
            return $this->createTaskComment();
        } elseif ($this->replyComment instanceof ProductionAssignmentLinkComment) {
            return $this->createLinkComment();
        }

        if ($this->isLinkComment) {
            return $this->createLinkComment();
        } else {
            return $this->createTaskComment();
        }

    }

    protected function createTaskComment()
    {
        $this->task->comments()->create([
            'production_task_id' => $this->task->id,
            'user_id' => auth()->id(),
            'text' => $this->comment,
            'parent_id' => $this->replyComment->id ?? null
        ]);

        $this->resetComment();

        $this->emit('refreshComments');
    }

    protected function createLinkComment()
    {
        $this->task->researchAssignment->linkComments()->create([
            'user_id' => auth()->id(),
            'production_assignment_link_id' => $this->replyComment !== null
                ? $this->replyComment->production_assignment_link_id
                : $this->activeLink,
            'text' => $this->comment,
            'timestamp' => $this->form['timestamp'] ?? null,
            'parent_id' => $this->replyComment->id ?? null
        ]);


        $this->resetComment();

        $this->emit('refreshComments');

    }

    public function resetComment()
    {
        $this->reset('replyComment');
        $this->reset('comment');

    }

    protected function mayCreateNotificationForReply(ProductionTaskComment $taskComment)
    {
        $parent = $taskComment->parent;

        if (!$parent) {
            return;
        }
        $parentUser = $taskComment->parent->user;

        if ($parentUser->id == auth()->id()) {
            return;
        }

        auth()->user()->createNotificationFor($taskComment->parent->user)->typeRepliedInTaskComment($taskComment);
    }
}
Editor is loading...