HEX
Server: LiteSpeed
System: Linux us-phx-web1284.main-hosting.eu 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: u300739242 (300739242)
PHP: 8.2.30
Disabled: system, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
Upload Files
File: /home/u300739242/domains/wayoutmaps.nubify.agency/public_html/eventmaps/PWA_ICON_UPLOAD.md
# PWA Icon Upload Implementation

## Cambios Realizados

### 1. Migración de Base de Datos ✅
**Archivo**: `database/migrations/2025_11_20_151341_add_pwa_icon_to_events_table.php`

- Agrega columna `pwa_icon` a la tabla `events`
- Campo nullable después de `header_logo`
- **Estado**: Migración ejecutada exitosamente ✅

```bash
php artisan migrate
```

### 2. Modelo Event ✅
**Archivo**: `app/Models/Event.php`

- Agregado `pwa_icon` al array `$fillable`
- Permite asignación masiva del campo

### 3. Controlador EventController ✅
**Archivo**: `app/Http/Controllers/Admin/EventController.php`

**Validación**:
```php
'pwa_icon' => 'nullable|image|mimes:png|max:2048|dimensions:min_width=512,min_height=512'
```

**Características**:
- Solo acepta PNG
- Mínimo 512x512px
- Máximo 2MB
- Guarda en `storage/app/public/events/pwa-icons/`
- Elimina icono anterior al subir uno nuevo
- Limpia caché de iconos generados

### 4. Vista Admin ✅
**Archivo**: `resources/views/admin/events/edit.blade.php`

**Nuevo campo agregado después del header_logo**:
- Input file con preview
- Muestra icono actual si existe
- Help text explicativo: "PNG de 512x512px con fondo incluido"
- Preview con bordes redondeados y sombra
- Función JavaScript `previewPWAIcon()` para vista previa

### 5. Controlador PublicManifestController ✅
**Archivo**: `app/Http/Controllers/PublicManifestController.php`

**Lógica actualizada**:

1. **Método `icon()`**: 
   - **Prioridad 1**: Usa `pwa_icon` subido si existe
   - Si tamaño = 512px → devuelve original directo
   - Otros tamaños → redimensiona con `resizePWAIcon()`
   - **Prioridad 2**: Fallback a `header_logo` con generación automática
   - **Prioridad 3**: Fallback a icono por defecto

2. **Nuevo método `resizePWAIcon()`**:
   - Redimensiona el icono PWA subido a diferentes tamaños
   - Mantiene transparencia si existe
   - Cachea iconos redimensionados en `storage/app/public/pwa-icons/{event_id}/`
   - Solo genera una vez, reutiliza si existe

3. **Método `generateIcons()`**:
   - **Prioridad 1**: Usa `pwa_icon` si existe
   - **Prioridad 2**: Usa `header_logo` si existe
   - **Prioridad 3**: Iconos por defecto

## Flujo de Funcionamiento

### Caso 1: Con PWA Icon Subido (Recomendado)
1. Admin sube PNG de 512x512px con fondo incluido
2. Se guarda en `events/pwa-icons/`
3. Al solicitar icono:
   - Tamaño 512px → archivo original
   - Otros tamaños → redimensionado automáticamente
4. Resultado: **Icono perfecto sin deformaciones ni fondos blancos**

### Caso 2: Sin PWA Icon (Fallback)
1. Sistema intenta usar `header_logo`
2. Genera iconos con fondo de color del header
3. Puede tener problemas en iOS (fondos blancos, estiramientos)

## Ventajas del Nuevo Sistema

✅ **Control Total**: Diseñador crea el icono exacto que quiere  
✅ **Sin Deformaciones**: No hay cálculos de aspect ratio  
✅ **Sin Problemas de Color**: El fondo viene en el PNG  
✅ **Compatible iOS**: Funciona perfecto en iPhone y iPad  
✅ **Fácil de Usar**: Solo subir un PNG de 512x512px  
✅ **Cacheo Inteligente**: Iconos redimensionados se guardan para reutilizar  
✅ **Fallback Robusto**: Si no hay pwa_icon, usa el sistema anterior  

## Instrucciones de Uso

### Para Administradores

1. **Preparar el icono**:
   - Tamaño: 512x512px (exacto)
   - Formato: PNG
   - Fondo: Incluir el color/degradado deseado (NO transparente)
   - Diseño: Logo centrado con padding adecuado

2. **Subir el icono**:
   - Ir a `/admin/events/{id}/edit`
   - Buscar sección "Icono PWA (Opcional)"
   - Seleccionar archivo PNG
   - Guardar evento

3. **Verificar**:
   - El icono aparece en preview
   - Abrir `/events/{id}/map` en navegador
   - Verificar manifest.json: `/events/{id}/manifest.json`
   - Probar instalación PWA

### Para Desarrolladores

**Archivos modificados**:
- `database/migrations/2025_11_20_151341_add_pwa_icon_to_events_table.php`
- `app/Models/Event.php`
- `app/Http/Controllers/Admin/EventController.php`
- `app/Http/Controllers/PublicManifestController.php`
- `resources/views/admin/events/edit.blade.php`

**Deployment**:
```bash
# 1. Pull cambios en producción
git pull origin main

# 2. Correr migración
php artisan migrate

# 3. Limpiar caché de iconos antiguos (opcional)
rm -rf storage/app/public/pwa-icons/*

# 4. Limpiar caché de aplicación
php artisan cache:clear
php artisan config:clear
php artisan route:clear
```

## Testing

### Test 1: Upload y Preview
1. Ir a `/admin/events/5/edit`
2. Subir PNG de 512x512px
3. Verificar preview muestra el icono
4. Guardar y verificar se guarda correctamente

### Test 2: Manifest.json
1. Abrir: `/events/5/manifest.json`
2. Verificar sección `icons` contiene múltiples tamaños
3. Verificar URLs apuntan a `/events/5/apple-touch-icon-{size}.png`

### Test 3: Iconos Generados
1. Abrir en navegador: `/events/5/apple-touch-icon-512.png`
2. Debe devolver el icono original
3. Abrir: `/events/5/apple-touch-icon-192.png`
4. Debe devolver versión redimensionada

### Test 4: PWA Installation (iOS)
1. Abrir `/events/5/map` en Safari (iPhone)
2. Tap "Compartir" → "Agregar a pantalla de inicio"
3. Verificar icono se ve correcto (sin fondo blanco)
4. Abrir app instalada
5. Verificar funciona offline

### Test 5: PWA Installation (Android)
1. Abrir `/events/5/map` en Chrome (Android)
2. Tap menú → "Instalar aplicación"
3. Verificar icono se ve correcto
4. Abrir app instalada
5. Verificar funciona offline

## Troubleshooting

### Problema: "The image must be at least 512 pixels in width"
**Solución**: El PNG debe ser exactamente 512x512px o mayor. Usar herramienta de diseño para ajustar.

### Problema: Icono no se actualiza en PWA instalada
**Solución**: 
1. Desinstalar PWA del dispositivo
2. Limpiar caché: `rm -rf storage/app/public/pwa-icons/{event_id}/`
3. Reinstalar PWA

### Problema: "File::deleteDirectory() not found"
**Solución**: Usar `\File::deleteDirectory()` con backslash o `use Illuminate\Support\Facades\File;`

### Problema: Iconos antiguos siguen apareciendo
**Solución**: Limpiar directorio completo:
```bash
rm -rf storage/app/public/pwa-icons/*
```

## Notas Técnicas

- **Formato requerido**: PNG (no JPEG, no SVG)
- **Tamaño mínimo**: 512x512px
- **Tamaño recomendado**: Exactamente 512x512px
- **Almacenamiento**: `storage/app/public/events/pwa-icons/`
- **Caché**: `storage/app/public/pwa-icons/{event_id}/`
- **Tamaños generados**: 72, 96, 128, 144, 152, 192, 384, 512
- **Función PHP**: `imagecopyresampled()` para redimensionar
- **Transparencia**: Se mantiene si existe en el PNG original

## Estado Actual

✅ Migración ejecutada  
✅ Modelo actualizado  
✅ Controlador EventController actualizado  
✅ Controlador PublicManifestController actualizado  
✅ Vista admin actualizada  
✅ JavaScript preview agregado  
⏳ **Pendiente**: Commit y push a producción  
⏳ **Pendiente**: Testing en dispositivos reales  

## Próximos Pasos

1. **Commit cambios**:
   ```bash
   git add -A
   git commit -m "feat: Agregar campo pwa_icon para iconos PWA personalizados"
   git push origin main
   ```

2. **Deploy en producción**:
   ```bash
   ssh servidor
   cd /path/to/app
   git pull origin main
   php artisan migrate
   php artisan cache:clear
   ```

3. **Upload icono de prueba**:
   - Crear PNG 512x512px para Japan Meet
   - Subir en `/admin/events/5/edit`
   - Testear en iPhone y Android

4. **Documentar para cliente**:
   - Especificaciones del icono PWA
   - Pasos para subir
   - Ejemplos visuales