2021-06-05 10:36:00 +00:00
|
|
|
package awais.instagrabber.viewmodels
|
|
|
|
|
2021-06-09 00:09:40 +00:00
|
|
|
import android.os.Bundle
|
2021-06-05 10:36:00 +00:00
|
|
|
import androidx.lifecycle.*
|
2021-06-09 00:09:40 +00:00
|
|
|
import androidx.savedstate.SavedStateRegistryOwner
|
2021-06-12 04:04:55 +00:00
|
|
|
import awais.instagrabber.db.repositories.AccountRepository
|
2021-06-12 04:22:49 +00:00
|
|
|
import awais.instagrabber.db.repositories.FavoriteRepository
|
2021-06-15 17:27:58 +00:00
|
|
|
import awais.instagrabber.managers.DirectMessagesManager
|
2021-06-13 11:52:03 +00:00
|
|
|
import awais.instagrabber.models.Resource
|
2021-06-05 10:36:00 +00:00
|
|
|
import awais.instagrabber.repositories.responses.User
|
2021-06-15 17:27:58 +00:00
|
|
|
import awais.instagrabber.repositories.responses.directmessages.RankedRecipient
|
2021-06-24 11:12:37 +00:00
|
|
|
import awais.instagrabber.utils.ControlledRunner
|
2021-06-12 03:43:15 +00:00
|
|
|
import awais.instagrabber.webservices.*
|
2021-06-23 11:52:45 +00:00
|
|
|
import kotlinx.coroutines.CoroutineDispatcher
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
2021-06-05 10:36:00 +00:00
|
|
|
|
|
|
|
class ProfileFragmentViewModel(
|
|
|
|
state: SavedStateHandle,
|
2021-06-09 00:09:40 +00:00
|
|
|
userRepository: UserRepository,
|
2021-06-10 08:03:24 +00:00
|
|
|
friendshipRepository: FriendshipRepository,
|
2021-06-11 23:54:00 +00:00
|
|
|
storiesRepository: StoriesRepository,
|
2021-06-12 01:07:31 +00:00
|
|
|
mediaRepository: MediaRepository,
|
2021-06-12 03:43:15 +00:00
|
|
|
graphQLRepository: GraphQLRepository,
|
2021-06-12 04:04:55 +00:00
|
|
|
accountRepository: AccountRepository,
|
2021-06-12 04:22:49 +00:00
|
|
|
favoriteRepository: FavoriteRepository,
|
2021-06-23 11:52:45 +00:00
|
|
|
ioDispatcher: CoroutineDispatcher,
|
2021-06-05 10:36:00 +00:00
|
|
|
) : ViewModel() {
|
2021-06-23 11:52:45 +00:00
|
|
|
private val _currentUser = MutableLiveData<Resource<User?>>(Resource.loading(null))
|
2021-06-15 17:27:58 +00:00
|
|
|
private var messageManager: DirectMessagesManager? = null
|
2021-06-05 10:36:00 +00:00
|
|
|
|
2021-06-23 11:52:45 +00:00
|
|
|
val currentUser: LiveData<Resource<User?>> = _currentUser
|
|
|
|
val isLoggedIn: LiveData<Boolean> = currentUser.map { it.data != null }
|
|
|
|
|
|
|
|
private val currentUserAndStateUsernameLiveData: LiveData<Pair<Resource<User?>, Resource<String?>>> =
|
|
|
|
object : MediatorLiveData<Pair<Resource<User?>, Resource<String?>>>() {
|
|
|
|
var user: Resource<User?> = Resource.loading(null)
|
|
|
|
var stateUsername: Resource<String?> = Resource.loading(null)
|
|
|
|
|
|
|
|
init {
|
|
|
|
addSource(currentUser) { currentUser ->
|
|
|
|
this.user = currentUser
|
|
|
|
value = currentUser to stateUsername
|
|
|
|
}
|
|
|
|
addSource(state.getLiveData<String?>("username")) { username ->
|
2021-06-23 13:07:38 +00:00
|
|
|
this.stateUsername = Resource.success(username.substringAfter('@'))
|
2021-06-23 11:52:45 +00:00
|
|
|
value = user to this.stateUsername
|
|
|
|
}
|
|
|
|
// trigger currentUserAndStateUsernameLiveData switch map with a state username success resource
|
|
|
|
if (!state.contains("username")) {
|
|
|
|
this.stateUsername = Resource.success(null)
|
|
|
|
value = user to this.stateUsername
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-24 11:12:37 +00:00
|
|
|
private val profileFetchControlledRunner = ControlledRunner<User?>()
|
2021-06-23 11:52:45 +00:00
|
|
|
val profile: LiveData<Resource<User?>> = currentUserAndStateUsernameLiveData.switchMap {
|
|
|
|
val (userResource, stateUsernameResource) = it
|
|
|
|
liveData<Resource<User?>>(context = viewModelScope.coroutineContext + ioDispatcher) {
|
|
|
|
if (userResource.status == Resource.Status.LOADING || stateUsernameResource.status == Resource.Status.LOADING) {
|
|
|
|
emit(Resource.loading(null))
|
|
|
|
return@liveData
|
|
|
|
}
|
|
|
|
val user = userResource.data
|
|
|
|
val stateUsername = stateUsernameResource.data
|
|
|
|
if (stateUsername.isNullOrBlank()) {
|
|
|
|
emit(Resource.success(user))
|
|
|
|
return@liveData
|
|
|
|
}
|
|
|
|
try {
|
2021-06-24 11:12:37 +00:00
|
|
|
val fetchedUser = profileFetchControlledRunner.cancelPreviousThenRun {
|
|
|
|
return@cancelPreviousThenRun if (user != null) {
|
|
|
|
val tempUser = userRepository.getUsernameInfo(stateUsername) // logged in
|
|
|
|
tempUser.friendshipStatus = userRepository.getUserFriendship(tempUser.pk)
|
|
|
|
return@cancelPreviousThenRun tempUser
|
|
|
|
} else {
|
|
|
|
graphQLRepository.fetchUser(stateUsername) // anonymous
|
|
|
|
}
|
2021-06-23 11:52:45 +00:00
|
|
|
}
|
|
|
|
emit(Resource.success(fetchedUser))
|
|
|
|
} catch (e: Exception) {
|
|
|
|
emit(Resource.error(e.message, null))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-06-13 11:52:03 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Username of profile without '`@`'
|
|
|
|
*/
|
|
|
|
val username: LiveData<String> = Transformations.map(profile) {
|
|
|
|
return@map when (it.status) {
|
|
|
|
Resource.Status.LOADING, Resource.Status.ERROR -> ""
|
|
|
|
Resource.Status.SUCCESS -> it.data?.username ?: ""
|
|
|
|
}
|
|
|
|
}
|
2021-06-23 13:07:38 +00:00
|
|
|
|
2021-06-05 10:36:00 +00:00
|
|
|
init {
|
2021-06-13 11:52:03 +00:00
|
|
|
// Log.d(TAG, "${state.keys()} $userRepository $friendshipRepository $storiesRepository $mediaRepository")
|
2021-06-23 11:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fun setCurrentUser(currentUser: Resource<User?>) {
|
|
|
|
_currentUser.postValue(currentUser)
|
2021-06-09 00:09:40 +00:00
|
|
|
}
|
2021-06-15 17:27:58 +00:00
|
|
|
|
|
|
|
fun shareDm(result: RankedRecipient) {
|
|
|
|
if (messageManager == null) {
|
|
|
|
messageManager = DirectMessagesManager
|
|
|
|
}
|
|
|
|
// messageManager?.sendMedia(result, mediaId, BroadcastItemType.PROFILE, viewModelScope)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun shareDm(recipients: Set<RankedRecipient>) {
|
|
|
|
if (messageManager == null) {
|
|
|
|
messageManager = DirectMessagesManager
|
|
|
|
}
|
|
|
|
// messageManager?.sendMedia(recipients, mediaId, BroadcastItemType.PROFILE, viewModelScope)
|
|
|
|
}
|
2021-06-09 00:09:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
|
class ProfileFragmentViewModelFactory(
|
|
|
|
private val userRepository: UserRepository,
|
2021-06-10 08:03:24 +00:00
|
|
|
private val friendshipRepository: FriendshipRepository,
|
2021-06-11 23:54:00 +00:00
|
|
|
private val storiesRepository: StoriesRepository,
|
2021-06-12 01:07:31 +00:00
|
|
|
private val mediaRepository: MediaRepository,
|
2021-06-12 03:43:15 +00:00
|
|
|
private val graphQLRepository: GraphQLRepository,
|
2021-06-12 04:04:55 +00:00
|
|
|
private val accountRepository: AccountRepository,
|
2021-06-12 04:22:49 +00:00
|
|
|
private val favoriteRepository: FavoriteRepository,
|
2021-06-09 00:09:40 +00:00
|
|
|
owner: SavedStateRegistryOwner,
|
|
|
|
defaultArgs: Bundle? = null,
|
|
|
|
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
|
|
|
|
override fun <T : ViewModel> create(
|
|
|
|
key: String,
|
|
|
|
modelClass: Class<T>,
|
|
|
|
handle: SavedStateHandle,
|
|
|
|
): T {
|
2021-06-11 23:54:00 +00:00
|
|
|
return ProfileFragmentViewModel(
|
|
|
|
handle,
|
|
|
|
userRepository,
|
|
|
|
friendshipRepository,
|
2021-06-12 01:07:31 +00:00
|
|
|
storiesRepository,
|
|
|
|
mediaRepository,
|
2021-06-12 03:43:15 +00:00
|
|
|
graphQLRepository,
|
2021-06-12 04:04:55 +00:00
|
|
|
accountRepository,
|
2021-06-12 04:22:49 +00:00
|
|
|
favoriteRepository,
|
2021-06-23 11:52:45 +00:00
|
|
|
Dispatchers.IO,
|
2021-06-11 23:54:00 +00:00
|
|
|
) as T
|
2021-06-05 10:36:00 +00:00
|
|
|
}
|
|
|
|
}
|