Basic requesting structure (doesn't work)

This commit is contained in:
Damontecres 2025-12-20 17:13:09 -05:00
parent 76c1fd4b15
commit ac5f0aa367
No known key found for this signature in database
5 changed files with 96 additions and 14 deletions

View file

@ -41,6 +41,7 @@ import com.github.damontecres.wholphin.data.model.DiscoverRating
import com.github.damontecres.wholphin.data.model.LocalTrailer import com.github.damontecres.wholphin.data.model.LocalTrailer
import com.github.damontecres.wholphin.data.model.Person import com.github.damontecres.wholphin.data.model.Person
import com.github.damontecres.wholphin.data.model.RemoteTrailer import com.github.damontecres.wholphin.data.model.RemoteTrailer
import com.github.damontecres.wholphin.data.model.SeerrAvailability
import com.github.damontecres.wholphin.data.model.Trailer import com.github.damontecres.wholphin.data.model.Trailer
import com.github.damontecres.wholphin.preferences.UserPreferences import com.github.damontecres.wholphin.preferences.UserPreferences
import com.github.damontecres.wholphin.services.TrailerService import com.github.damontecres.wholphin.services.TrailerService
@ -122,7 +123,10 @@ fun DiscoverMovieDetails(
similar = similar, similar = similar,
recommended = recommended, recommended = recommended,
requestOnClick = { requestOnClick = {
// TODO seerr movie.id?.let { viewModel.request(it) }
},
cancelOnClick = {
movie.id?.let { viewModel.cancelRequest(it) }
}, },
onClickItem = { index, item -> onClickItem = { index, item ->
viewModel.navigateTo(Destination.DiscoveredItem(item)) viewModel.navigateTo(Destination.DiscoveredItem(item))
@ -207,6 +211,7 @@ fun DiscoverMovieDetailsContent(
similar: List<DiscoverItem>, similar: List<DiscoverItem>,
recommended: List<DiscoverItem>, recommended: List<DiscoverItem>,
requestOnClick: () -> Unit, requestOnClick: () -> Unit,
cancelOnClick: () -> Unit,
trailerOnClick: (Trailer) -> Unit, trailerOnClick: (Trailer) -> Unit,
overviewOnClick: () -> Unit, overviewOnClick: () -> Unit,
moreOnClick: () -> Unit, moreOnClick: () -> Unit,
@ -251,7 +256,11 @@ fun DiscoverMovieDetailsContent(
.padding(top = 32.dp, bottom = 16.dp), .padding(top = 32.dp, bottom = 16.dp),
) )
ExpandableDiscoverButtons( ExpandableDiscoverButtons(
availability =
SeerrAvailability.from(movie.mediaInfo?.status)
?: SeerrAvailability.UNKNOWN,
requestOnClick = requestOnClick, requestOnClick = requestOnClick,
cancelOnClick = cancelOnClick,
moreOnClick = moreOnClick, moreOnClick = moreOnClick,
buttonOnFocusChanged = { buttonOnFocusChanged = {
if (it.isFocused) { if (it.isFocused) {

View file

@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.github.damontecres.wholphin.api.seerr.model.MovieDetails import com.github.damontecres.wholphin.api.seerr.model.MovieDetails
import com.github.damontecres.wholphin.api.seerr.model.RelatedVideo import com.github.damontecres.wholphin.api.seerr.model.RelatedVideo
import com.github.damontecres.wholphin.api.seerr.model.RequestPostRequest
import com.github.damontecres.wholphin.data.ServerRepository import com.github.damontecres.wholphin.data.ServerRepository
import com.github.damontecres.wholphin.data.model.DiscoverItem import com.github.damontecres.wholphin.data.model.DiscoverItem
import com.github.damontecres.wholphin.data.model.DiscoverRating import com.github.damontecres.wholphin.data.model.DiscoverRating
@ -157,4 +158,28 @@ class DiscoverMovieViewModel
fun navigateTo(destination: Destination) { fun navigateTo(destination: Destination) {
navigationManager.navigateTo(destination) navigationManager.navigateTo(destination)
} }
fun request(id: Int) {
viewModelScope.launchIO {
val request =
seerrService.api.requestApi.requestPost(
RequestPostRequest(
is4k = false,
mediaid = id,
mediaType = RequestPostRequest.MediaType.MOVIE,
),
)
fetchAndSetItem().await()
}
}
fun cancelRequest(id: Int) {
viewModelScope.launchIO {
movie.value?.mediaInfo?.requests?.firstOrNull()?.let {
// TODO handle multiple requests? Or just delete self's request?
seerrService.api.requestApi.requestRequestIdDelete(it.id.toString())
fetchAndSetItem().await()
}
}
}
} }

View file

@ -5,7 +5,9 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -16,13 +18,16 @@ import androidx.compose.ui.focus.focusRestorer
import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.R
import com.github.damontecres.wholphin.data.model.SeerrAvailability
import com.github.damontecres.wholphin.ui.components.ExpandableFaButton import com.github.damontecres.wholphin.ui.components.ExpandableFaButton
import com.github.damontecres.wholphin.ui.components.ExpandablePlayButton import com.github.damontecres.wholphin.ui.components.ExpandablePlayButton
import kotlin.time.Duration import kotlin.time.Duration
@Composable @Composable
fun ExpandableDiscoverButtons( fun ExpandableDiscoverButtons(
availability: SeerrAvailability,
requestOnClick: () -> Unit, requestOnClick: () -> Unit,
cancelOnClick: () -> Unit,
moreOnClick: () -> Unit, moreOnClick: () -> Unit,
buttonOnFocusChanged: (FocusState) -> Unit, buttonOnFocusChanged: (FocusState) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@ -36,17 +41,59 @@ fun ExpandableDiscoverButtons(
.focusGroup() .focusGroup()
.focusRestorer(firstFocus), .focusRestorer(firstFocus),
) { ) {
item("request") { if (availability == SeerrAvailability.UNKNOWN) {
ExpandableFaButton( item("request") {
title = R.string.request, ExpandableFaButton(
iconStringRes = R.string.fa_download, title = R.string.request,
onClick = requestOnClick, iconStringRes = R.string.fa_download,
modifier = onClick = requestOnClick,
Modifier modifier =
.focusRequester(firstFocus) Modifier
.onFocusChanged(buttonOnFocusChanged) .focusRequester(firstFocus)
.animateItem(), .onFocusChanged(buttonOnFocusChanged),
) )
}
} else if (availability == SeerrAvailability.PENDING || availability == SeerrAvailability.PROCESSING) {
item("pending") {
ExpandableFaButton(
title = R.string.pending,
iconStringRes = R.string.fa_clock,
onClick = {
// TODO show request dialog?
},
modifier =
Modifier
.focusRequester(firstFocus)
.onFocusChanged(buttonOnFocusChanged),
)
}
item("cancel") {
ExpandablePlayButton(
title = R.string.cancel,
icon = Icons.Default.Delete,
onClick = { cancelOnClick.invoke() },
resume = Duration.ZERO,
modifier =
Modifier
.focusRequester(firstFocus)
.onFocusChanged(buttonOnFocusChanged),
)
}
} else if (availability == SeerrAvailability.PARTIALLY_AVAILABLE || availability == SeerrAvailability.AVAILABLE) {
item("goto") {
ExpandablePlayButton(
title = R.string.go_to,
icon = Icons.Default.PlayArrow,
onClick = {
// TODO go to the item
},
resume = Duration.ZERO,
modifier =
Modifier
.focusRequester(firstFocus)
.onFocusChanged(buttonOnFocusChanged),
)
}
} }
// More button // More button
@ -57,8 +104,7 @@ fun ExpandableDiscoverButtons(
Icons.Default.MoreVert, Icons.Default.MoreVert,
{ moreOnClick.invoke() }, { moreOnClick.invoke() },
Modifier Modifier
.onFocusChanged(buttonOnFocusChanged) .onFocusChanged(buttonOnFocusChanged),
.animateItem(),
) )
} }
} }

View file

@ -46,4 +46,5 @@
<string name="fa_filter" translatable="false">&#xf0b0;</string> <string name="fa_filter" translatable="false">&#xf0b0;</string>
<string name="fa_sliders" translatable="false">&#xf1de;</string> <string name="fa_sliders" translatable="false">&#xf1de;</string>
<string name="fa_download" translatable="false">&#xf019;</string> <string name="fa_download" translatable="false">&#xf019;</string>
<string name="fa_clock" translatable="false">&#xf017;</string>
</resources> </resources>

View file

@ -401,6 +401,7 @@
<string name="discover">Discover</string> <string name="discover">Discover</string>
<string name="request">Request</string> <string name="request">Request</string>
<string name="pending">Pending</string>
<string-array name="theme_song_volume"> <string-array name="theme_song_volume">
<item>Disabled</item> <item>Disabled</item>