|
@@ -0,0 +1,101 @@
|
|
|
+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.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.graphics.Color
|
|
|
+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 com.owncloud.android.R
|
|
|
+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 = Color(R.color.secondary_button_background_color),
|
|
|
+ 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))
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|