package com.suno.android.ui.screens.hooks.overlay import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.geometry.Offset import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList import java.util.UUID import kotlin.random.Random private const val MAX_HEART_ANIMATIONS = 5 private const val HEART_SPACING_RANGE = 40f data class HeartAnimation( val id: UUID, val position: Offset, ) class HeartAnimationState { private var _activeHearts by mutableStateOf>(persistentListOf()) val activeHearts: ImmutableList get() = _activeHearts fun addHeart( tapPosition: Offset, ) { if (_activeHearts.size >= MAX_HEART_ANIMATIONS) { return } val newHeart = HeartAnimation( id = UUID.randomUUID(), position = calculateHeartPosition(tapPosition), ) _activeHearts = (_activeHearts + newHeart).toPersistentList() } fun removeHeart( heartId: UUID, ) { _activeHearts = _activeHearts.filter { it.id != heartId }.toPersistentList() } private fun calculateHeartPosition( tapPosition: Offset, ): Offset { // Add slight randomization to prevent hearts from overlapping perfectly // when multiple taps occur in the same location val randomOffsetX = Random.nextFloat() * HEART_SPACING_RANGE - (HEART_SPACING_RANGE / 2f) val randomOffsetY = Random.nextFloat() * HEART_SPACING_RANGE - (HEART_SPACING_RANGE / 2f) return Offset( x = tapPosition.x + randomOffsetX, y = tapPosition.y + randomOffsetY, ) } } @Composable fun rememberHeartAnimationState(): HeartAnimationState = remember { HeartAnimationState() }