@@ -178,6 +178,9 @@ internal class MainViewModel(application: Application) : AndroidViewModel(applic
178178 private val _userNickname = MutableStateFlow (" Anonymous" )
179179 val userNickname = _userNickname .asStateFlow()
180180
181+ private val _userId = MutableStateFlow <String ?>(null )
182+ val userId = _userId .asStateFlow()
183+
181184 private var lastStatsSyncMs = 0L
182185
183186 private val _isShowingLeaderboard = MutableStateFlow (false )
@@ -310,22 +313,23 @@ internal class MainViewModel(application: Application) : AndroidViewModel(applic
310313 _totalFlashlightTime .value = prefs.getLong(" total_flashlight_time" , 0L )
311314 _userNickname .value = prefs.getString(" user_nickname" , " Anonymous" ) ? : " Anonymous"
312315
313- var userId = prefs.getString(" user_id" , null )
314- if (userId == null ) {
315- userId = java.util.UUID .randomUUID().toString()
316- prefs.edit().putString(" user_id" , userId ).apply ()
316+ var uId = prefs.getString(" user_id" , null )
317+ if (uId == null ) {
318+ uId = java.util.UUID .randomUUID().toString()
319+ prefs.edit().putString(" user_id" , uId ).apply ()
317320 }
321+ _userId .value = uId
318322
319323 viewModelScope.launch {
320324 try {
321- val profile = userRepository.getUserProfile(userId )
325+ val profile = userRepository.getUserProfile(uId )
322326 if (profile != null ) {
323327 _userProfile .value = profile
324328 _userNickname .value = profile.displayName
325329 } else {
326330 // Create initial profile
327331 val newProfile = UserProfile (
328- userId = userId ,
332+ userId = uId ,
329333 displayName = _userNickname .value,
330334 totalVisualizedTime = _totalVisualizedTime .value
331335 )
@@ -1217,6 +1221,7 @@ internal class MainViewModel(application: Application) : AndroidViewModel(applic
12171221 val preset = CommunityPreset (
12181222 name = name,
12191223 author = author,
1224+ authorId = _userId .value ? : " " ,
12201225 phoneModel = phoneModelForDevice(selectedDevice.value),
12211226 zones = zones.map { ZoneData .fromZoneSpec(it) }
12221227 )
@@ -1234,6 +1239,22 @@ internal class MainViewModel(application: Application) : AndroidViewModel(applic
12341239 }
12351240 }
12361241
1242+ fun deleteCommunityPreset (preset : CommunityPreset ) {
1243+ viewModelScope.launch {
1244+ try {
1245+ communityRepository.deletePreset(preset.id)
1246+ withContext(Dispatchers .Main ) {
1247+ Toast .makeText(ctx, " Preset deleted" , Toast .LENGTH_SHORT ).show()
1248+ }
1249+ } catch (e: Exception ) {
1250+ Log .e(" MainViewModel" , " Failed to delete preset" , e)
1251+ withContext(Dispatchers .Main ) {
1252+ Toast .makeText(ctx, " Failed to delete: ${e.message} " , Toast .LENGTH_SHORT ).show()
1253+ }
1254+ }
1255+ }
1256+ }
1257+
12371258 fun downloadPreset (preset : CommunityPreset ) {
12381259 saveCustomPreset(preset.name, preset.zones.map { it.toZoneSpec() }, preset.author)
12391260 analytics.logCommunityPresetDownloaded(preset.name, preset.author)
@@ -2390,6 +2411,7 @@ class MainActivity : ComponentActivity() {
23902411 val leaderboardEntries by viewModel.leaderboardEntries.collectAsStateWithLifecycle()
23912412 val communityPresets by viewModel.communityPresets.collectAsStateWithLifecycle()
23922413 val communityError by viewModel.communityError.collectAsStateWithLifecycle()
2414+ val userId by viewModel.userId.collectAsStateWithLifecycle()
23932415 val thanksMessage by viewModel.thanksMessage.collectAsStateWithLifecycle()
23942416 val latestAnnouncement by viewModel.latestAnnouncement.collectAsStateWithLifecycle()
23952417 val showAnnouncementModal by viewModel.showAnnouncementModal.collectAsStateWithLifecycle()
@@ -2518,8 +2540,10 @@ class MainActivity : ComponentActivity() {
25182540 ) {
25192541 CommunityPresetsScreen (
25202542 presets = communityPresets,
2543+ currentUserId = userId,
25212544 error = communityError,
25222545 onDownload = viewModel::downloadPreset,
2546+ onDelete = viewModel::deleteCommunityPreset,
25232547 onDismiss = viewModel::hideCommunity
25242548 )
25252549 }
0 commit comments