package <%= package_name %>.strada import android.util.Log import android.view.LayoutInflater import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetDialog import dev.hotwire.strada.BridgeComponent import dev.hotwire.strada.BridgeDelegate import dev.hotwire.strada.Message import <%= package_name %>.base.NavDestination import <%= package_name %>.databinding.MenuComponentBottomSheetBinding import kotlinx.serialization.Serializable class MenuComponent( name: String, private val delegate: BridgeDelegate ) : BridgeComponent(name, delegate) { private val fragment: Fragment get() = delegate.destination.fragment override fun onReceive(message: Message) { if (message.event == "display") { handleDisplayEvent(message) } else { Log.w("TurboNative", "Unknown event for message: $message") } } private fun handleDisplayEvent(message: Message) { val data = message.data() ?: return showBottomSheet(data.title, data.items) } private fun showBottomSheet(title: String, items: List) { val view = fragment.view?.rootView ?: return val inflater = LayoutInflater.from(view.context) val bottomSheet = BottomSheetDialog(view.context) val binding = MenuComponentBottomSheetBinding.inflate(inflater) binding.toolbar.title = title binding.recyclerView.layoutManager = LinearLayoutManager(view.context) binding.recyclerView.adapter = MenuComponentAdapter().apply { setData(items) setListener { bottomSheet.dismiss() onItemSelected(it) } } bottomSheet.apply { setContentView(binding.root) show() } } private fun onItemSelected(item: Item) { replyTo("display", SelectionMessageData(item.index)) } @Serializable data class MessageData( val title: String, val items: List ) @Serializable data class Item( val title: String, val index: Int ) @Serializable data class SelectionMessageData( val selectedIndex: Int ) }