You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/main/java/org/tasks/compose/drawer/TasksMenu.kt

133 lines
4.8 KiB
Kotlin

package org.tasks.compose.drawer
import android.content.Intent
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material.MaterialTheme
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.todoroo.astrid.api.Filter
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.Tasks
import org.tasks.activities.NavigationDrawerCustomization
import org.tasks.billing.PurchaseActivity
import org.tasks.extensions.Context.findActivity
import org.tasks.extensions.Context.openUri
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.preferences.HelpAndFeedback
import org.tasks.preferences.MainPreferences
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TasksMenu(
bottomPadding: Dp = 0.dp,
items: ImmutableList<DrawerItem>,
isTopAppBar: Boolean,
begForMoney: Boolean,
setFilter: (Filter) -> Unit,
toggleCollapsed: (NavigationDrawerSubheader) -> Unit,
addFilter: (NavigationDrawerSubheader) -> Unit,
dismiss: () -> Unit,
) {
var expanded by remember { mutableStateOf(false) }
val skipPartiallyExpanded = remember(expanded) {
expanded || isTopAppBar
}
val density = LocalDensity.current
val sheetState = rememberSaveable(
skipPartiallyExpanded,
saver = SheetState.Saver(
skipPartiallyExpanded = skipPartiallyExpanded,
confirmValueChange = { true },
density = density,
)
) {
SheetState(
skipPartiallyExpanded = skipPartiallyExpanded,
initialValue = if (skipPartiallyExpanded) SheetValue.Expanded else SheetValue.PartiallyExpanded,
confirmValueChange = { true },
skipHiddenState = false,
density = density,
)
}
LaunchedEffect(sheetState.currentValue) {
if (sheetState.currentValue == SheetValue.Expanded) {
expanded = true
}
}
val context = LocalContext.current
val settingsRequest = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
context.findActivity()?.recreate()
}
ModalBottomSheet(
sheetState = sheetState,
containerColor = MaterialTheme.colors.surface,
onDismissRequest = { dismiss() }
) {
val scope = rememberCoroutineScope()
TaskListDrawer(
bottomPadding = bottomPadding,
begForMoney = begForMoney,
filters = items,
onClick = {
when (it) {
is DrawerItem.Filter -> {
setFilter(it.type())
scope.launch(Dispatchers.Default) {
sheetState.hide()
dismiss()
}
}
is DrawerItem.Header -> {
toggleCollapsed(it.type())
}
}
},
onAddClick = {
scope.launch(Dispatchers.Default) {
sheetState.hide()
dismiss()
addFilter(it.type())
}
},
onDrawerAction = {
dismiss()
when (it) {
DrawerAction.PURCHASE ->
if (Tasks.IS_GENERIC)
context.openUri(R.string.url_donate)
else
context.startActivity(Intent(context, PurchaseActivity::class.java))
DrawerAction.CUSTOMIZE_DRAWER ->
context.startActivity(
Intent(context, NavigationDrawerCustomization::class.java)
)
DrawerAction.SETTINGS ->
settingsRequest.launch(Intent(context, MainPreferences::class.java))
DrawerAction.HELP_AND_FEEDBACK ->
context.startActivity(Intent(context, HelpAndFeedback::class.java))
}
},
onErrorClick = {
context.startActivity(Intent(context, MainPreferences::class.java))
},
)
}
}