fun PackageSearchInfoPanel()

in plugin/src/main/kotlin/com/jetbrains/packagesearch/plugin/ui/panels/side/PackageSearchInfoPanel.kt [33:97]


fun PackageSearchInfoPanel(
    modifier: Modifier = Modifier,
    onLinkClick: (String) -> Unit,
    onPackageEvent: (PackageListItemEvent) -> Unit,
) = Box(modifier) {
    val viewModel = viewModel<InfoPanelViewModel>()
    val tabs by viewModel.tabs.collectAsState()
    val activeTabTitle by viewModel.activeTabTitleFlow.collectAsState()
    // if you use `by derivedStateOf`, the then will fail
    val activeTab = derivedStateOf { tabs.firstOrNull { it.tabTitleData.tabTitle == activeTabTitle } }.value
    when {
        tabs.isEmpty() || activeTab == null -> NoTabsAvailable()
        else -> Column(modifier = Modifier.fillMaxSize()) {
            TabStrip(
                modifier = Modifier.fillMaxWidth(),
                style = LocalDefaultTabStyle.current,
                tabs = tabs.map { infoPanelContent ->
                    TabData.Default(
                        selected = activeTabTitle == infoPanelContent.tabTitleData.tabTitle,
                        closable = false,
                        content = { tabState ->
                            SimpleTabContent(infoPanelContent.tabTitleData.tabTitle, tabState)
                        },
                        onClick = { viewModel.setActiveTabTitle(infoPanelContent.tabTitleData.tabTitle) },
                    )
                }
            )
            Box(modifier = Modifier.fillMaxWidth()) {
                Column(
                    modifier = Modifier
                        .padding(end = PackageSearchMetrics.scrollbarWidth)
                        .verticalScroll(viewModel.scrollState)
                ) {
                    when (activeTab) {
                        is InfoPanelContent.PackageInfo -> {
                            PackageOverviewTab(
                                onLinkClick = onLinkClick,
                                onPackageEvent = onPackageEvent,
                                content = activeTab
                            )
                        }

                        is InfoPanelContent.Attributes.FromVariantHeader -> {
                            HeaderAttributesTab(content = activeTab, scrollState = viewModel.scrollState)

                        }

                        is InfoPanelContent.Attributes.FromSearchHeader -> {
                            HeaderAttributesTab(content = activeTab, scrollState = viewModel.scrollState)
                        }

                        is InfoPanelContent.Attributes.FromPackage -> HeaderAttributesTab(
                            content = activeTab,
                            scrollState = viewModel.scrollState
                        )
                    }
                }
                VerticalScrollbar(
                    modifier = Modifier.fillMaxHeight().align(Alignment.CenterEnd),
                    scrollState = viewModel.scrollState,
                )
            }
        }
    }
}