Fix: Profile Picture Mechanics

Branch: fix/pfp-mechanics Data: 2026-03-19

Cosa cambia

1. Profilo proprio — avatar tappabile con azioni

File modificato: lib/features/profile/screens/profile_screen.dart

  • L’avatar nella schermata profilo è ora separato dal GestureDetector della card
  • Tap sull’avatar → _AvatarOptionsSheet (bottom sheet) con:
    • Anteprima della foto (se presente)
    • “Cambia foto” → image picker (galleria) + upload su Supabase Storage (avatars/<userId>)
    • “Rimuovi foto”updateProfilePicture(null) (mostrato solo se la pfp è impostata)
  • Badge camera sull’avatar per suggerire l’interazione
  • Overlay di loading durante l’upload

2. Profilo altrui — long-press fullscreen

File modificato: lib/features/profile/screens/public_profile_screen.dart

  • Long-press sull’avatar → showDialog fullscreen con sfondo nero
  • Tap ovunque chiude il dialog
  • Attivo solo se l’utente ha una pfp (altrimenti nessuna reazione al long-press)

3. Stats row — amici-only

File modificato: lib/features/profile/screens/profile_screen.dart

  • _buildSocialStats ora mostra solo “Amici” (rimossi Follower/Seguiti)
  • Coerente con la rimozione già fatta su public_profile_screen

Architettura

profile_screen.dart
  → GestureDetector(onTap) su avatar
      → showModalBottomSheet(_AvatarOptionsSheet)
          → ImagePicker → Supabase.storage.uploadBinary()
          → authNotifierProvider.updateProfilePicture(url | null)

public_profile_screen.dart
  → GestureDetector(onLongPress) su avatar
      → showDialog(fullscreen Image.network)

Note

  • L’upload usa upsert: true quindi sovrascrive silenziosamente la versione precedente
  • Il file in Storage ha nome avatars/<userId>.<ext> — path stabile, URL non cambia
  • La rimozione chiama solo il DB (profile_picture = null), non elimina il file da Storage