mirror of https://github.com/nextcloud/android
107 lines
3.7 KiB
Kotlin
107 lines
3.7 KiB
Kotlin
/*
|
|
* Nextcloud - Android Client
|
|
*
|
|
* SPDX-FileCopyrightText: 2024 Alper Ozturk <alper_ozturk@proton.me>
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
package com.nextcloud.ui.composeComponents.bottomSheet
|
|
|
|
import android.annotation.SuppressLint
|
|
import androidx.compose.foundation.clickable
|
|
import androidx.compose.foundation.layout.Arrangement
|
|
import androidx.compose.foundation.layout.Box
|
|
import androidx.compose.foundation.layout.Column
|
|
import androidx.compose.foundation.layout.Row
|
|
import androidx.compose.foundation.layout.Spacer
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
import androidx.compose.foundation.layout.height
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.layout.size
|
|
import androidx.compose.foundation.layout.width
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
import androidx.compose.material3.Icon
|
|
import androidx.compose.material3.MaterialTheme.colorScheme
|
|
import androidx.compose.material3.ModalBottomSheet
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.material3.rememberModalBottomSheetState
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.rememberCoroutineScope
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.res.painterResource
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.compose.ui.unit.sp
|
|
import kotlinx.coroutines.launch
|
|
|
|
@SuppressLint("ResourceAsColor")
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
fun MoreActionsBottomSheet(
|
|
title: String? = null,
|
|
actions: List<Triple<Int, Int, () -> Unit>>,
|
|
dismiss: () -> Unit
|
|
) {
|
|
val sheetState = rememberModalBottomSheetState()
|
|
val scope = rememberCoroutineScope()
|
|
|
|
ModalBottomSheet(
|
|
modifier = Modifier.padding(top = 32.dp),
|
|
onDismissRequest = {
|
|
dismiss()
|
|
},
|
|
sheetState = sheetState
|
|
) {
|
|
Column(
|
|
horizontalAlignment = Alignment.Start,
|
|
verticalArrangement = Arrangement.Top,
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(all = 8.dp)
|
|
) {
|
|
title?.let {
|
|
Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxWidth()) {
|
|
Text(text = title, fontSize = 18.sp)
|
|
}
|
|
}
|
|
|
|
Spacer(modifier = Modifier.height(16.dp))
|
|
|
|
actions.forEach { action ->
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.clickable {
|
|
scope
|
|
.launch { sheetState.hide() }
|
|
.invokeOnCompletion {
|
|
if (!sheetState.isVisible) {
|
|
action.third()
|
|
dismiss()
|
|
}
|
|
}
|
|
}
|
|
.padding(all = 16.dp),
|
|
verticalAlignment = Alignment.CenterVertically
|
|
) {
|
|
Icon(
|
|
painter = painterResource(id = action.first),
|
|
contentDescription = "action icon",
|
|
tint = colorScheme.primary,
|
|
modifier = Modifier.size(20.dp)
|
|
)
|
|
|
|
Spacer(modifier = Modifier.width(16.dp))
|
|
|
|
Text(
|
|
text = stringResource(action.second),
|
|
fontSize = 16.sp
|
|
)
|
|
}
|
|
}
|
|
|
|
Spacer(modifier = Modifier.height(32.dp))
|
|
}
|
|
}
|
|
}
|