mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-05 05:36:41 +00:00
Improve offline task creation/editing. Fixes #1009
This commit is contained in:
parent
43db91293b
commit
affbe2d90e
6 changed files with 26 additions and 28 deletions
|
|
@ -28,8 +28,8 @@ interface TaskRepository : BaseRepository {
|
|||
|
||||
fun getTask(taskId: String): Flowable<Task>
|
||||
fun getTaskCopy(taskId: String): Flowable<Task>
|
||||
fun createTask(task: Task): Flowable<Task>
|
||||
fun updateTask(task: Task): Maybe<Task>?
|
||||
fun createTask(task: Task, force: Boolean = false): Flowable<Task>
|
||||
fun updateTask(task: Task, force: Boolean = false): Maybe<Task>?
|
||||
fun deleteTask(taskId: String): Flowable<Void>
|
||||
fun saveTask(task: Task)
|
||||
|
||||
|
|
|
|||
|
|
@ -134,9 +134,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
|||
|
||||
override fun getTaskCopy(taskId: String): Flowable<Task> = localRepository.getTaskCopy(taskId)
|
||||
|
||||
override fun createTask(task: Task): Flowable<Task> {
|
||||
override fun createTask(task: Task, force: Boolean): Flowable<Task> {
|
||||
val now = Date().time
|
||||
if (lastTaskAction > now - 500) {
|
||||
if (lastTaskAction > now - 500 && !force) {
|
||||
return Flowable.empty()
|
||||
}
|
||||
lastTaskAction = now
|
||||
|
|
@ -171,44 +171,43 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
|||
if (task.id == null) {
|
||||
task.id = UUID.randomUUID().toString()
|
||||
}
|
||||
localRepository.saveTask(task)
|
||||
localRepository.saveSyncronous(task)
|
||||
|
||||
return apiClient.createTask(task)
|
||||
.map { task1 ->
|
||||
task1.dateCreated = Date()
|
||||
task1
|
||||
}
|
||||
.doOnNext { localRepository.saveTask(it) }
|
||||
.doOnNext { localRepository.save(it) }
|
||||
.doOnError {
|
||||
task.hasErrored = true
|
||||
task.isSaving = false
|
||||
localRepository.save(task)
|
||||
localRepository.saveSyncronous(task)
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("ReturnCount")
|
||||
override fun updateTask(task: Task): Maybe<Task> {
|
||||
override fun updateTask(task: Task, force: Boolean): Maybe<Task> {
|
||||
val now = Date().time
|
||||
if (lastTaskAction > now - 500 || !task.isValid) {
|
||||
if ((lastTaskAction > now - 500 && !force)|| !task.isValid ) {
|
||||
return Maybe.just(task)
|
||||
}
|
||||
lastTaskAction = now
|
||||
val id = task.id ?: return Maybe.just(task)
|
||||
|
||||
task.isSaving = true
|
||||
task.hasErrored = false
|
||||
localRepository.saveTask(task)
|
||||
return localRepository.getTaskCopy(id).firstElement()
|
||||
.flatMap { task1 -> apiClient.updateTask(id, task1).singleElement() }
|
||||
val unmanagedTask = localRepository.getUnmanagedCopy(task)
|
||||
unmanagedTask.isSaving = true
|
||||
unmanagedTask.hasErrored = false
|
||||
localRepository.saveSyncronous(unmanagedTask)
|
||||
return apiClient.updateTask(id, unmanagedTask).singleElement()
|
||||
.map { task1 ->
|
||||
task1.position = task.position
|
||||
task1
|
||||
}
|
||||
.doOnSuccess { localRepository.saveTask(it) }
|
||||
.doOnSuccess { localRepository.save(it) }
|
||||
.doOnError {
|
||||
task.hasErrored = true
|
||||
task.isSaving = false
|
||||
localRepository.save(task)
|
||||
unmanagedTask.hasErrored = true
|
||||
unmanagedTask.isSaving = false
|
||||
localRepository.saveSyncronous(unmanagedTask)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -218,7 +217,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
|||
}
|
||||
|
||||
override fun saveTask(task: Task) {
|
||||
localRepository.saveTask(task)
|
||||
localRepository.save(task)
|
||||
}
|
||||
|
||||
override fun createTasks(newTasks: List<Task>): Flowable<List<Task>> = apiClient.createTasks(newTasks)
|
||||
|
|
@ -273,9 +272,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
|||
.map { localRepository.getUnmanagedCopy(it) }
|
||||
.flatMap {
|
||||
return@flatMap if (it.isCreating) {
|
||||
createTask(it)
|
||||
createTask(it, true)
|
||||
} else {
|
||||
updateTask(it).toFlowable()
|
||||
updateTask(it, true).toFlowable()
|
||||
}
|
||||
}.toList()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,4 +17,5 @@ interface BaseLocalRepository {
|
|||
|
||||
fun <T : RealmObject> save(objects: List<T>)
|
||||
fun <T : RealmObject> save(`object`: T)
|
||||
fun <T : RealmObject> saveSyncronous(`object`: T)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,8 +15,6 @@ interface TaskLocalRepository : BaseLocalRepository {
|
|||
|
||||
fun saveTasks(userId: String, tasksOrder: TasksOrder, tasks: TaskList)
|
||||
|
||||
fun saveTask(task: Task)
|
||||
|
||||
fun deleteTask(taskID: String)
|
||||
|
||||
fun getTask(taskId: String): Flowable<Task>
|
||||
|
|
|
|||
|
|
@ -43,4 +43,8 @@ abstract class RealmBaseLocalRepository internal constructor(protected var realm
|
|||
override fun <T : RealmObject> save(objects: List<T>) {
|
||||
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(objects) }
|
||||
}
|
||||
|
||||
override fun <T : RealmObject> saveSyncronous(`object`: T) {
|
||||
realm.executeTransaction { realm1 -> realm1.insertOrUpdate(`object`) }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,10 +68,6 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm),
|
|||
return taskList
|
||||
}
|
||||
|
||||
override fun saveTask(task: Task) {
|
||||
realm.executeTransaction { realm1 -> realm1.insertOrUpdate(task) }
|
||||
}
|
||||
|
||||
private fun removeOldTasks(userID: String, onlineTaskList: List<Task>) {
|
||||
val localTasks = realm.where(Task::class.java)
|
||||
.equalTo("userId", userID)
|
||||
|
|
|
|||
Loading…
Reference in a new issue