Refactor task completion image handling
- Simplify image parameter passing in task completion ViewModels - Pass ImageData objects directly instead of separate bytes and filenames 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -278,8 +278,7 @@ fun AllTasksScreen(
|
|||||||
if (images.isNotEmpty()) {
|
if (images.isNotEmpty()) {
|
||||||
taskCompletionViewModel.createTaskCompletionWithImages(
|
taskCompletionViewModel.createTaskCompletionWithImages(
|
||||||
request = request,
|
request = request,
|
||||||
images = images.map { it.bytes },
|
images = images
|
||||||
imageFileNames = images.map { it.fileName }
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
taskCompletionViewModel.createTaskCompletion(request)
|
taskCompletionViewModel.createTaskCompletion(request)
|
||||||
|
|||||||
@@ -155,8 +155,7 @@ fun ResidenceDetailScreen(
|
|||||||
if (images.isNotEmpty()) {
|
if (images.isNotEmpty()) {
|
||||||
taskCompletionViewModel.createTaskCompletionWithImages(
|
taskCompletionViewModel.createTaskCompletionWithImages(
|
||||||
request = request,
|
request = request,
|
||||||
images = images.map { it.bytes },
|
images = images
|
||||||
imageFileNames = images.map { it.fileName }
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
taskCompletionViewModel.createTaskCompletion(request)
|
taskCompletionViewModel.createTaskCompletion(request)
|
||||||
|
|||||||
@@ -264,8 +264,7 @@ fun TasksScreen(
|
|||||||
if (images.isNotEmpty()) {
|
if (images.isNotEmpty()) {
|
||||||
taskCompletionViewModel.createTaskCompletionWithImages(
|
taskCompletionViewModel.createTaskCompletionWithImages(
|
||||||
request = request,
|
request = request,
|
||||||
images = images.map { it.bytes },
|
images = images
|
||||||
imageFileNames = images.map { it.fileName }
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
taskCompletionViewModel.createTaskCompletion(request)
|
taskCompletionViewModel.createTaskCompletion(request)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.mycrib.shared.models.TaskCompletionCreateRequest
|
|||||||
import com.mycrib.shared.network.ApiResult
|
import com.mycrib.shared.network.ApiResult
|
||||||
import com.mycrib.shared.network.TaskCompletionApi
|
import com.mycrib.shared.network.TaskCompletionApi
|
||||||
import com.mycrib.storage.TokenStorage
|
import com.mycrib.storage.TokenStorage
|
||||||
|
import com.mycrib.util.ImageCompressor
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@@ -33,22 +34,34 @@ class TaskCompletionViewModel : ViewModel() {
|
|||||||
* Create task completion with images.
|
* Create task completion with images.
|
||||||
*
|
*
|
||||||
* @param request The completion request data
|
* @param request The completion request data
|
||||||
* @param images List of image data as ByteArray (from platform-specific image pickers)
|
* @param images List of ImageData (from platform-specific image pickers)
|
||||||
* @param imageFileNames Optional list of file names for the images
|
|
||||||
*/
|
*/
|
||||||
fun createTaskCompletionWithImages(
|
fun createTaskCompletionWithImages(
|
||||||
request: TaskCompletionCreateRequest,
|
request: TaskCompletionCreateRequest,
|
||||||
images: List<ByteArray> = emptyList(),
|
images: List<com.mycrib.platform.ImageData> = emptyList()
|
||||||
imageFileNames: List<String> = emptyList()
|
|
||||||
) {
|
) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
_createCompletionState.value = ApiResult.Loading
|
_createCompletionState.value = ApiResult.Loading
|
||||||
val token = TokenStorage.getToken()
|
val token = TokenStorage.getToken()
|
||||||
if (token != null) {
|
if (token != null) {
|
||||||
|
// Compress images and prepare for upload
|
||||||
|
val compressedImages = images.map { ImageCompressor.compressImage(it) }
|
||||||
|
val imageFileNames = images.mapIndexed { index, image ->
|
||||||
|
// Always use .jpg extension since we compress to JPEG
|
||||||
|
val baseName = image.fileName.ifBlank { "completion_$index" }
|
||||||
|
if (baseName.endsWith(".jpg", ignoreCase = true) ||
|
||||||
|
baseName.endsWith(".jpeg", ignoreCase = true)) {
|
||||||
|
baseName
|
||||||
|
} else {
|
||||||
|
// Remove any existing extension and add .jpg
|
||||||
|
baseName.substringBeforeLast('.', baseName) + ".jpg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_createCompletionState.value = taskCompletionApi.createCompletionWithImages(
|
_createCompletionState.value = taskCompletionApi.createCompletionWithImages(
|
||||||
token = token,
|
token = token,
|
||||||
request = request,
|
request = request,
|
||||||
images = images,
|
images = compressedImages,
|
||||||
imageFileNames = imageFileNames
|
imageFileNames = imageFileNames
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user