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,
)
}
}
}
}