Módulo: Product HUB — Detalle de Comunidad¶
Autor: Adalberto González¶
Fecha creación: 2026-08-19
Estado: producción
Tipo: vista
¿Qué hace? (para el usuario)¶
Es la pantalla de un miembro dentro de una comunidad ya aprobada. Solo es accesible para quien ya pertenece (dueño, admin o miembro) — si no, se muestra una alerta y se redirige de vuelta al explorador. Tiene dos pestañas:
- Publicaciones: el muro social de la comunidad (si sus admins también moderan una comunidad social del muro compartido). Permite reaccionar (like) y comentar, sujeto a permisos del post y a que el usuario no esté restringido en el muro.
- Productos: el catálogo completo de la tienda dueña, agrupado por producto con sus variaciones, con buscador y chips de categoría. Cada producto muestra si el usuario ya tiene autorización para venderlo, tiene una solicitud pendiente, o puede solicitar permiso.
- Un menú de "3 puntos" en el banner ofrece "Gestionar comunidad" (solo admins) y "Salir de la comunidad" (solo miembros no-admin).
Ruta¶
Decoradores y configuración técnica¶
@Component({
selector: 'app-comunidad-detalle',
imports: [
CommonModule, RouterLink, CardComponent, CardBodyComponent, RowComponent, ColComponent,
SolicitudModalComponent, SeleccionTiendaModalComponent, MenuAccionesComponent,
],
templateUrl: './comunidad-detalle.component.html',
styleUrl: './comunidad-detalle.component.scss',
})
export class ComunidadDetalleComponent implements OnInit
Ubicación: src/app/views/dropshipping/product-hub/comunidad-detalle/comunidad-detalle.component.ts
Propiedades clave¶
| Propiedad | Tipo | Descripción |
|---|---|---|
esMiembro / esAdmin |
Signal<boolean> |
Gate de acceso y de opciones del menú |
opcionesMenu |
Signal<OpcionMenu[]> |
Opciones del menú de 3 puntos, según esAdmin/puedeSalirDeComunidad |
productosVisibles / productosFiltrados |
Signal<ProductoAgrupado[]> |
Catálogo paginado en cliente (12 por página) con búsqueda y filtro de categoría |
autorizacionesVigentes / solicitudesProductoPendientes |
Signal<Set<number>> |
idproducto con permiso activo o solicitud en curso, para pintar el estado en cada card |
puedeInteractuarEnMuro |
Signal<boolean> |
true si Users.EstadoComentario === 'ACTIVO' y no hay restricción vigente |
publicaciones |
Signal<PublicacionSocial[]> |
Feed paginado (5 por página) de la comunidad social vinculada por admins compartidos |
Servicios y endpoints¶
Método (ProductHubRepository) |
Colección | Uso |
|---|---|---|
getComunidadSocialVinculada(adminsComunidad) |
Comunidades |
Resuelve el muro vinculado por coincidencia de admin/moderador |
getPublicacionesDeComunidadSocial(admins) |
Publicaciones |
Feed del tab Publicaciones |
puedeInteractuarEnMuro() |
Users, UsuariosRestringidosMuro |
Gate de reacción/comentario |
getUsuariosMiembros(idComunidad, emails) |
ProductHubSolicitudesMembresia |
Usuario + tienda de cada miembro, para el widget de miembros |
getTiendaFijadaEnComunidad(idComunidad, email) |
ProductHubSolicitudesMembresia |
Tienda con la que ya soy miembro — evita repreguntar al solicitar producto |
getAutorizacionesVigentes / getSolicitudesProductoPendientes |
ProductHubAutorizaciones, ProductHubSolicitudesProducto |
Estado de permiso por producto |
crearSolicitudProducto(params) |
ProductHubSolicitudesProducto |
Envía la solicitud de venta de un producto privado |
expulsarMiembro(comunidad, email) |
ProductHubComunidades |
Reutilizado aquí para la salida voluntaria |
La vista también consulta Productos (catálogo de la tienda dueña) y Publicaciones/reacciones/comentarios directamente vía ConsumoGenericoService.
Flujo principal¶
ngOnInit()
└─► getComunidad(id)
├─► no existe → mensaje de error
└─► existe, pero no soy miembro → alerta + redirect a explorar-comunidades
└─► si soy miembro, Promise.all
├─► getProductosDeTienda(IdTiendaDuena)
├─► repo.getComunidadSocialVinculada(admins)
├─► repo.puedeInteractuarEnMuro()
├─► getMiTiendaSilenciosa()
├─► repo.getUsuariosMiembros(...)
└─► repo.getTiendaFijadaEnComunidad(...)
└─► si hay muro vinculado → cargarPublicaciones()
└─► si se resolvió mi tienda → cargarEstadoAutorizaciones()
Usuario hace clic en "Solicitar permiso" sobre un producto
└─► abrirSolicitudProducto(p)
├─► ya tengo tienda fijada en esta comunidad → abre modal directo
├─► sin tienda fijada, 1 elegible → abre modal directo
└─► sin tienda fijada, 2+ elegibles → selector de tienda primero
└─► enviarSolicitudProducto() → repo.crearSolicitudProducto()
Menú "3 puntos" → onAccionMenu(id)
├─► 'gestionar' → navega a gestion-comunidad
└─► 'salir' → confirmación + repo.expulsarMiembro(comunidad, miEmail)
Historial de cambios¶
| Fecha | Autor | Cambio |
|---|---|---|
| 2026-08-19 | Adalberto González | Documentación inicial del módulo, ya en producción |
Observaciones¶
- Los comentarios del muro son planos (
ComentarioSocial[]), sin hilos anidados —comentarioPadreIdexiste en el modelo pero no se usa todavía en esta vista. - La reacción es un "like" simple (toggle), no el selector completo de 6 emociones que existe en el módulo de red social.
esProductoDeMiTienda()oculta el botón de solicitud cuando la tienda del usuario es la misma tienda dueña de la comunidad — no tendría sentido pedirse permiso a sí misma.