Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
4bc9bd7
- maps the JSON field shared_code to the Kotlin property sharedCode
Jiyu13 Jul 23, 2025
6988d20
- add colours
Jiyu13 Jul 23, 2025
3c32beb
- Create app top bar composable
Jiyu13 Jul 23, 2025
d227eab
- Create search bar composable
Jiyu13 Jul 23, 2025
1449a21
- add isLoading state
Jiyu13 Jul 23, 2025
fe499a3
- add top bar + search bar
Jiyu13 Jul 23, 2025
d2f7e6f
- ignore file
Jiyu13 Jul 23, 2025
c606fb7
- create User model
Jiyu13 Jul 24, 2025
df6e157
- add sharedWidth field
Jiyu13 Jul 24, 2025
c77faa7
- create composable to show info of each list
Jiyu13 Jul 24, 2025
b1347d4
- rename composable
Jiyu13 Jul 24, 2025
f9def51
- render ListRow
Jiyu13 Jul 24, 2025
8ff17e2
- add padding to list info column
Jiyu13 Jul 24, 2025
d183880
- check if input is empty
Jiyu13 Jul 24, 2025
51f611b
- filter lists by input
Jiyu13 Jul 24, 2025
6c5ee1e
- comment out reseting search text
Jiyu13 Jul 24, 2025
f631965
- create dialog
Jiyu13 Jul 24, 2025
f5a09b3
- pass in onAddButtonClick to handle showing dialog
Jiyu13 Jul 24, 2025
78d51d5
- show FormDialog when isDialogShown is true
Jiyu13 Jul 24, 2025
b11e00e
- create add list screen composable
Jiyu13 Jul 25, 2025
cf6430a
- add let text param
Jiyu13 Jul 25, 2025
ebaf7cd
- add route for ListifyNewListScreen
Jiyu13 Jul 25, 2025
cad53ac
- create input field for adding new list
Jiyu13 Jul 25, 2025
8710f2e
- rename function
Jiyu13 Jul 25, 2025
0527bd1
- add NewListScreen
Jiyu13 Jul 25, 2025
d0c9b94
- remove isDialogShown state + if statement
Jiyu13 Jul 25, 2025
192e5f4
- add BaseList + listName models
Jiyu13 Jul 30, 2025
6658056
- add onRightButtonClick()
Jiyu13 Jul 30, 2025
aa168e2
- add post request insertList() api
Jiyu13 Jul 30, 2025
35a307c
- commit out broken import
Jiyu13 Jul 30, 2025
dadbbe8
- create insertListByUser api call
Jiyu13 Jul 30, 2025
7c2420f
- implement list creation with state management
Jiyu13 Jul 31, 2025
1b94579
- add LaunchedEffect to observe navigation events
Jiyu13 Jul 31, 2025
632b002
Fix merge conflicts
Jiyu13 Jul 31, 2025
8e8d703
Fix merge conflicts
Jiyu13 Jul 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@
.externalNativeBuild
.cxx
local.properties
/app/src/main/java/com/example/listifyjetapp/utils/constants/Constants.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.example.listifyjetapp.components

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties

@Composable
fun FormDialog(
onDismiss: () -> Unit = {},
onConfirm: () -> Unit = {}
) {
Dialog (
onDismissRequest = onDismiss,
properties = DialogProperties(usePlatformDefaultWidth = false)
) {
Card(
elevation = CardDefaults.cardElevation(defaultElevation = 6.dp),
shape = RoundedCornerShape(15.dp),
modifier = Modifier.fillMaxWidth(0.95f)
) {
Column(
modifier = Modifier.fillMaxWidth().padding(15.dp)
//verticalArrangement = Arrangement.SpaceBy(25.dp)
) {
Text(
text = "Add new list",
textAlign = TextAlign.Center
)

Column {
Row { }
}
}
}
}
}
22 changes: 19 additions & 3 deletions app/src/main/java/com/example/listifyjetapp/model/ListModel.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
package com.example.listifyjetapp.model

import java.time.LocalDateTime
import com.google.gson.annotations.SerializedName

data class BaseList(
val id: Int,
val name: String,
val share: Boolean,
//val sharedCode: String, // can be UUID or String
//val createdAt: LocalDateTime
@SerializedName("shared_code") val sharedCode: String,
@SerializedName("created_at") val createdAt: String,
)

data class ListName (
val name: String
)

data class ListModel(
val id: Int,
val name: String,
val share: Boolean,
val shareCode: String, // can be UUID or String
val createdAt: LocalDateTime
@SerializedName("shared_code") val sharedCode: String,
@SerializedName("created_at") val createdAt: String,
@SerializedName("item_count") val itemCount: Int,
@SerializedName("shared_with") val sharedWith: List<SharedUsers>
)
17 changes: 17 additions & 0 deletions app/src/main/java/com/example/listifyjetapp/model/User.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.listifyjetapp.model

import com.google.gson.annotations.SerializedName

data class User(
val id: Int,
val username: String,
val email: String,
val password: String,
@SerializedName("created_at") val createdAt: String
)

data class SharedUsers(
@SerializedName("user_id") val userId: Int,
val username: String,
)

47 changes: 27 additions & 20 deletions app/src/main/java/com/example/listifyjetapp/network/ListsAPI.kt
Original file line number Diff line number Diff line change
@@ -1,36 +1,40 @@
package com.example.listifyjetapp.network

import com.example.listifyjetapp.model.ListModel
import com.example.listifyjetapp.model.ListName
import com.example.listifyjetapp.model.User
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.PATCH
import retrofit2.http.POST
import retrofit2.http.Path
import javax.inject.Singleton

@Singleton
interface ListifyAPI {
// =============================================== Users =======================================
// @PATCH("users/{user_id}")
// suspend fun patchUserById(@Path("user_id") userId: Int): User
//
// @POST("users")
// suspend fun createUser(): User
//
// @GET("users/check_username/{username}")
// suspend fun getUserByUsername(@Path("/username") username: String ): User
//
// @GET("users/email/{email}")
// suspend fun getUserByUserEmail(@Path("/email") email: String ): User
//
// @GET("users/users")
// suspend fun getAllUsers(): List<User>
@PATCH("users/{user_id}")
suspend fun patchUserById(@Path("user_id") userId: Int): User

@POST("users")
suspend fun createUser(): User

@GET("users/check_username/{username}")
suspend fun getUserByUsername(@Path("/username") username: String ): User

@GET("users/email/{email}")
suspend fun getUserByUserEmail(@Path("/email") email: String ): User

@GET("users/users")
suspend fun getAllUsers(): List<User>

// =============================================== User Lists ==================================
// @GET("ul/shared-user/{list_id}/{user_id}")
// suspend fun getSharedUsers(
// @Path("user_id") userId: Int,
// @Path("list_id") listId: Int
// ): List<User>
@GET("ul/shared-user/{list_id}/{user_id}")
suspend fun getSharedUsers(
@Path("user_id") userId: Int,
@Path("list_id") listId: Int
): List<User>

@GET("ul/{user_id}")
suspend fun getListsByUser(@Path("user_id") userId: Int): List<ListModel>
Expand All @@ -56,7 +60,10 @@ interface ListifyAPI {

// Post new list
@POST("lists/{user_id}")
suspend fun createList(@Path("user_id") userId: Int) {}
suspend fun insertList(
@Path("user_id") userId: Int,
@Body request: ListName
): ListModel

// Get items by list id
@GET("lists/{list_id}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.example.listifyjetapp.repository

import com.example.listifyjetapp.data.ListifyResult
import com.example.listifyjetapp.model.ListModel
import com.example.listifyjetapp.model.ListName
import com.example.listifyjetapp.network.ListifyAPI
import javax.inject.Inject

Expand All @@ -15,4 +16,22 @@ class ListsRepository @Inject constructor(private val api: ListifyAPI) {
return ListifyResult.Failure(e.message ?: "Error fetching lists")
}
}

suspend fun insertListByUser(userId: Int, newListData: ListName): ListifyResult<ListModel> {
try {
val response = api.insertList(userId, newListData)
val formatedResponse = ListModel (
id = response.id,
name = response.name,
share = response.share,
sharedCode = response.sharedCode,
createdAt = response.createdAt,
itemCount = 0,
sharedWith= emptyList()
)
return ListifyResult.Success(data = formatedResponse)
} catch (e:Exception) {
return ListifyResult.Failure(e.message ?: "Error creating new list")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.listifyjetapp.ui.screens.lists.ListifyListsScreen
import com.example.listifyjetapp.ui.screens.newList.ListifyNewListScreen
import com.example.listifyjetapp.ui.screens.splash.ListifySplashScreen


Expand All @@ -26,7 +27,12 @@ fun ListifyNavigation() {

// TODO: Define a navigation route for ListsScreen
composable(ListifyScreens.ListsScreen.route) {
ListifyListsScreen()
ListifyListsScreen(navController = navController)
}

// TODO: Define a navigation route for NewListScreen
composable(ListifyScreens.NewListScreen.route) {
ListifyNewListScreen(navController = navController)
}

// TODO: Define a navigation route for DetailScreen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ enum class ListifyScreens(val route: String) {
DetailScreen("detail"),
ProfileScreen("profile"),
LoginScreen("login"),
SignupScreen("signup")
SignupScreen("signup"),
NewListScreen("new-list")
}

// navController.navigate(ListifyScreens.LoginScreen.route)
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package com.example.listifyjetapp.ui.screens.lists

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
import androidx.compose.material.icons.filled.Share
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.listifyjetapp.model.ListModel
import com.example.listifyjetapp.ui.theme.ListifyColor

@Composable
fun ListRow(
list: ListModel,
//viewModel: User
) {
Row(
modifier = Modifier
.clickable { }
.padding(vertical = 16.dp)
.fillMaxWidth()
.background(Color.Transparent)
) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
// List info
Column(
modifier = Modifier.padding(horizontal = 8.dp),

) {
Text(
text = list.name,
color = ListifyColor.TextBlack,
fontSize = 20.sp,
//fontWeight = FontWeight.SemiBold
)

if (list.share) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
modifier = Modifier.size(16.dp),
tint = ListifyColor.IconGreen,
imageVector = Icons.Default.Share,
contentDescription = "Shared with"
)
Text(
text = list.sharedWith.take(3).joinToString(", ") { it.username },
maxLines = 1,
overflow = TextOverflow.Ellipsis,
color = ListifyColor.TextGrey,
fontSize = 16.sp
)
}
}

Text(
text = list.createdAt,
color = ListifyColor.TextGrey,
fontSize = 16.sp
)
}
// List setting menu

Row() {
Text(
text = list.itemCount.toString(),
color = ListifyColor.TextGrey,
fontSize = 16.sp
)

Icon(
imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight,
contentDescription = "Forward icon"
)

}

}

}
HorizontalDivider()
}
Loading