Capítulo social de la guía Neblla — amigos y comunicaciones dev↔usuario. El contrato base está en core.txt. # Social ## Amigos Las amistades son entre personas (cross-app), pero todo lo que la app ve está filtrado por app: un amigo solo aparece si concedió el scope `discoverable` para *esta* app, y "online" significa "conectado a esta app ahora mismo". Requiere el scope `friends` en el login. ```javascript console.log(neblla.friends); // [{ id, name, picture, online, ... }, ...] ``` Métodos: ```javascript neblla.requestFriend(targetUserId); // mandar petición a otro usuario online en esta app neblla.acceptFriend(requestId); neblla.rejectFriend(requestId); neblla.removeFriend(friendId); // funciona offline neblla.inviteFriend(targetUserId); // "ven a mi sala" (cualquier tipo de sala) neblla.inviteToRoom(targetUserId); // añade a la whitelist de tu sala privada neblla.getFriends(); // refresh manual neblla.getFriendRequests(); // refresh manual ``` Eventos: `'friendRequest'` (`{ requestId, from }`), `'friendAccepted'`, `'friendRemoved'`, `'friendsUpdated'` (`{ friends }`), `'roomInvite'` (`{ from, roomName, appId, type }`). Propiedades: `neblla.friends` (amigos visibles en esta app), `neblla.friendRequests` (peticiones recibidas). ## Invitar a un amigo de Neblla A LA APP Distinto de `inviteFriend` (que es "ven a mi sala" dentro de la app). Aquí el usuario trae a un amigo que aún no conoce la app: ```javascript await neblla.inviteToApp(); // requiere usuario logueado ``` - Abre un popup alojado por Neblla donde el usuario elige a un amigo de su lista — la app **nunca** ve esa lista, ni quién fue elegido. - Fire-and-forget: ni el invitador ni la app saben si el amigo estaba online o si le llegó. - No requiere el scope `friends`. - El amigo ve la invitación en su bandeja en play.neblla.com (caduca a los 5 minutos) con un enlace que lo trae a la app con `?nbla_invite=`. Cuando alguien abre la app desde una invitación (o cuando un amigo lo invita estando ya dentro), el SDK rellena `neblla.invitedBy` (`{ id, name, picture, slug, userId|null }` — `userId` es el id por-app del que invitó si está online ahora) y dispara el evento `'appInvite'` (`{ from }`). Si el invitado luego hace login, su amigo aparece en `neblla.friends` (si concedió `discoverable`), y con `neblla.invitedBy.userId` se le puede meter a una sala al instante. ## Comunicaciones dev↔usuario Canal para que el usuario hable con el desarrollador sin salir de la app. Requiere login. Hay que activar el feature: `inbox: true` en la config del dashboard (o vía `neblla_update_app` desde el MCP). Sin ese flag, las llamadas a `sendCommunication` no se materializan en el backoffice. ```javascript const { communication } = await neblla.sendCommunication({ message: 'Encontré un typo en la pantalla de resultados', data: { type: 'bug' } }); ``` Firma completa: `neblla.sendCommunication({ message, data?, dateFrom?, dateTo?, thread? })` **(CLIENT)**. El desarrollador lo ve en el backoffice de developers.neblla.com — con el id del usuario, la fecha, la categoría asignada en `data.type` — y puede responder desde allí. El evento `communicationUpdated` avisa en cliente de cualquier cambio en tiempo real: ```javascript neblla.on('communicationUpdated', ({ communication, action }) => { if (action === 'created' && communication.from === 'dev') { showToast('Tienes respuesta del desarrollador'); } }); ``` Otros métodos: - `neblla.updateCommunication(commId, {...})` **(CLIENT)** — edita una comunicación propia (mientras no esté marcada como leída). - `neblla.deleteCommunication(id)` **(CLIENT)** — borra la suya. Eventos: `'communications'` **(CLIENT)** — sync inicial; `'communicationUpdated'` **(CLIENT)** — `{ communication, action }`. Propiedad: `neblla.communications` **(CLIENT)** — array de comunicaciones del usuario.