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";
}
}
}