mirror of https://github.com/tasks/tasks
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.
133 lines
4.8 KiB
Kotlin
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))
|
|
},
|
|
)
|
|
}
|
|
} |