Jeetesh surana
08/07/2024, 5:43 PMJeetesh surana
08/07/2024, 5:43 PM@OptIn(ExperimentalFoundationApi::class, FlowPreview::class)
@Composable
fun horizontalPager(
pagerState: PagerState,
pagerFlingBehavior: SnapFlingBehavior,
bookId: Long,
chapterId: Long,
writerId: Long,
verseNumber: Int,
fontSize: TextUnit,
selectedChapterPosition: Int,
masterList: List<VersesItems>,
listState: LazyListState,
selectedItems: Set<VersesItems>,
isHideFavoriteTop: () -> Unit,
onSelectionChanged: (Set<VersesItems>) -> Unit,
isMultiSelectMode: Boolean,
onMultiSelectModeChanged: (Boolean) -> Unit,
clearSelection: () -> Unit,
onChapterIdChange: (Long) -> Unit,
onSetCharacterSelectedPosition: (Int) -> Unit,
onVerseNumberChange: (Int) -> Unit,
) {
val singleSelectedItem by remember { mutableStateOf<VersesItems?>(null) }
// Use LaunchedEffect to scroll to the index after composition
val filterList = mutableStateListOf<VersesItems>()
LaunchedEffect(
bookId, chapterId, writerId
) {
if (masterList.isNotEmpty()) {
filterList.swapList(
getFilterList(
bookId, chapterId, writerId, masterList
)
)
}
}
if (masterList.isNotEmpty()) {
filterList.swapList(
getFilterList(
bookId, chapterId, writerId, masterList
)
)
}
LaunchedEffect(listState) {
snapshotFlow {
listState.firstVisibleItemIndex
}.debounce(500L).collectLatest { index ->
onVerseNumberChange(index)
}
}
LaunchedEffect(filterList.isNotEmpty()) {
if (filterList.isNotEmpty() && verseNumber > 0) {
listState.scrollToItem(verseNumber)
}
}
LaunchedEffect(selectedChapterPosition) {
pagerState.animateScrollToPage(selectedChapterPosition)
}
LaunchedEffect(pagerState.currentPage) {
onSetCharacterSelectedPosition(pagerState.currentPage)
if (filterList.isNotEmpty()) {
listState.animateScrollToItem(verseNumber)
}
}
LaunchedEffect(Unit) {
delay(100)
if (selectedChapterPosition != -1) {
pagerState.animateScrollToPage(selectedChapterPosition)
}
}
LaunchedEffect(pagerState.currentPage) {
if (pagerState.currentPage != -1) {
clearSelection()
}
}
HorizontalPager(state = pagerState,
modifier = Modifier.fillMaxWidth().wrapContentHeight(),
flingBehavior = pagerFlingBehavior,
contentPadding = PaddingValues(0.dp),
userScrollEnabled = true,
pageNestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
return if (available.x < 0 && source == NestedScrollSource.Drag) {
available.copy(y = 0f)
} else {
Offset.Zero
}
}
}
}) { page ->
if (page != pagerState.currentPage) {
return@HorizontalPager
}
if (page == pagerState.currentPage) {
onChapterIdChange(page.toLong() + 1)
LazyColumn(
verticalArrangement = <http://Arrangement.Top|Arrangement.Top>,
modifier = Modifier.fillMaxWidth(),
state = listState,
) {
items(filterList, key = { data -> data.id ?: 0L }) { verseData ->
Box(
modifier = Modifier.fillMaxWidth().clickable {
if (isMultiSelectMode) {
onSelectionChanged(
if (verseData in selectedItems) {
selectedItems - verseData
} else {
selectedItems + verseData
}
)
} else {
if (!isMultiSelectMode) {
onMultiSelectModeChanged(true)
onSelectionChanged(setOf(verseData))
} else {
onSelectionChanged(selectedItems + verseData)
}
isHideFavoriteTop()
}
}.background(
when {
isMultiSelectMode && selectedItems.contains(verseData) -> getGray300Color()
!isMultiSelectMode && singleSelectedItem == verseData -> getGray300Color()
verseData.isFavourite == 1L -> ThemeColors.Primary200
else -> ThemeColors.Transparent
}
).padding(10.dp)
) {
Text(
text = "${verseData.order}. ${decodeHtmlText(verseData.content ?: "")}",
fontWeight = FontWeight.Bold,
fontSize = fontSize,
color = getGray900Color()
)
}
}
}
}
}
Spacer(modifier = Modifier.height(20.dp))
}
Jeetesh surana
08/07/2024, 5:50 PMJeetesh surana
08/07/2024, 5:52 PMJeetesh surana
08/07/2024, 5:54 PMCaleb Kiage
08/08/2024, 5:50 AMJeetesh surana
08/08/2024, 6:34 AMJeetesh surana
08/08/2024, 6:35 AMJeetesh surana
08/08/2024, 6:37 AMJeetesh surana
08/08/2024, 6:38 AMJeetesh surana
08/08/2024, 6:46 AM