HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/8.0.30
System: Linux multiplicar 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64
User: root (0)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /var/www/html/xfacil.desafio.com.py/app/Http/Livewire/Popup.php
<?php

namespace App\Http\Livewire;

use Livewire\Component;
use Livewire\WithPagination;
use App\Models\Modal;
use Livewire\WithFileUploads;
use App\File;
use Illuminate\Support\Facades\Storage;

class Popup extends Component{

    use WithFileUploads;
    use WithPagination;

    protected $paginationTheme = 'bootstrap';
    protected $queryString = ['search' => ['except' => '']];

    public $search='',$popup_id,$nombre,$enlace,$tipo;
    public $collapsed="collapsed-card",$collapsedicon="fa-plus";

    public function updatedEnlace($value){
        if ($value && $value->getClientOriginalExtension()) {
            $ext = strtolower($value->getClientOriginalExtension());
            if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp'])) {
                $this->tipo = 'imagen';
            } elseif (in_array($ext, ['mp4', 'webm', 'ogg'])) {
                $this->tipo = 'video';
            } else {
                $this->tipo = null;
            }
        }
    }

    public function render(){

        $modales=Modal::where('estado',1)
            ->where('nombre','LIKE','%'.$this->search.'%')
            ->orderBy('id','desc')->paginate(20);

        return view('livewire.popup.index',["modales"=>$modales]);
    }

    public function store() {

        $validatedData = $this->validate(
            [
                'nombre' => 'required|string|max:255',
                'tipo' => 'required|in:imagen,video',
                'enlace' => 'required|file|mimes:jpg,jpeg,png,gif,webp,mp4,webm,ogg|max:51200', // 50MB máx.
            ],
            [
                'nombre.required' => 'El campo Título es requerido.',
                'tipo.required' => 'El campo Tipo de archivo es requerido.',
                'enlace.required' => 'Debe subir un archivo.',
                'enlace.mimes' => 'El archivo debe ser una imagen o un video válido.',
                'enlace.max' => 'El archivo no puede superar los 50MB.',
            ]
        );

        $modal=new Modal;
            $modal->nombre=$this->nombre;
            $modal->tipo=$this->tipo;
            $modal->estado=1;

            $archivo="";
            
            if($file = $this->enlace) {
                $archivo=$modal->enlace;
                $control=0;
                $nombre = rand().".".$file->getClientOriginalExtension();
                while ($control == 0) {
                    if (is_file( public_path() . '/modal/' . $nombre )) {
                        $nombre = rand() . $nombre;
                    }else{
                        $this->enlace->storeAs('/modal',$nombre,'subidaarchivos');
                        $modal->enlace=$nombre;
                        $control=1;
                    }
                }
            }
        if ($modal->save()){
            $this->emit('alert', ['type' => 'success', 'message' => 'Pop-up agregado correctamente.']);
            $this->reset(['nombre', 'tipo', 'enlace']);
        }   
    }

    public function destroy($id){
        try {
            $modal = Modal::findOrFail($id);

            // Eliminar archivo si existe
            unlink(public_path().'/modal/'.$modal->enlace);

            // Eliminar registro de la base de datos
            $modal->delete();

            $this->emit('alert', ['type' => 'success', 'message' => 'Pop-up eliminado correctamente.']);

        } catch (\Exception $e) {
            report($e); // Opcional: para logging
            $this->emit('alert', ['type' => 'error', 'message' => 'No se pudo eliminar el pop-up.']);
        }
    }

    public function botoncollapsed(){
        if($this->collapsed){
            $this->collapsed="";
            $this->collapsedicon="fa-minus";
        }else{
            $this->collapsed="collapsed-card";
            $this->collapsedicon="fa-plus";
        }
    }
}