Skip to content

Commit 33e0c3a

Browse files
authored
Merge pull request #60 from YAPP-Github/feat/#52-map-api
[feat] #52 네컷지도 API 연동 및 UX 개선
2 parents ee15c53 + 7460bd7 commit 33e0c3a

29 files changed

Lines changed: 1017 additions & 436 deletions

File tree

app/src/main/java/com/neki/android/app/ui/BottomNavigationBar.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ fun BottomNavigationBar(
5353
Row(
5454
modifier = Modifier
5555
.fillMaxWidth()
56-
.padding(horizontal = 20.dp),
56+
.padding(horizontal = 19.5.dp, vertical = 2.dp),
5757
horizontalArrangement = Arrangement.spacedBy(16.dp),
5858
) {
5959
tabs.forEach { tab ->
@@ -86,12 +86,12 @@ fun BottomNavigationBarItem(
8686
color = NekiTheme.colorScheme.white,
8787
) {
8888
Column(
89-
modifier = Modifier.padding(vertical = 4.dp),
89+
modifier = Modifier.padding(vertical = 1.dp),
9090
horizontalAlignment = Alignment.CenterHorizontally,
9191
verticalArrangement = Arrangement.spacedBy(4.dp),
9292
) {
9393
Icon(
94-
modifier = Modifier.size(24.dp),
94+
modifier = Modifier.size(26.dp),
9595
imageVector = ImageVector.vectorResource(icon),
9696
contentDescription = stringResource(tab.iconStringRes),
9797
tint = iconColor,

core/common/src/main/java/com/neki/android/core/common/permission/LocationPermissionManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ object LocationPermissionManager {
1212
Manifest.permission.ACCESS_COARSE_LOCATION,
1313
)
1414

15-
fun hasLocationPermission(context: Context): Boolean {
15+
fun isGrantedLocationPermission(context: Context): Boolean {
1616
return ContextCompat.checkSelfPermission(
1717
context,
1818
Manifest.permission.ACCESS_FINE_LOCATION,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.neki.android.core.dataapi.repository
2+
3+
import com.neki.android.core.model.Brand
4+
import com.neki.android.core.model.PhotoBooth
5+
6+
interface MapRepository {
7+
suspend fun getBrands(): Result<List<Brand>>
8+
9+
suspend fun getPhotoBoothsByPoint(
10+
longitude: Double?,
11+
latitude: Double?,
12+
radiusInMeters: Int,
13+
brandIds: List<Long>,
14+
): Result<List<PhotoBooth>>
15+
16+
suspend fun getPhotoBoothsByPolygon(
17+
coordinates: List<Pair<Double, Double>>,
18+
brandIds: List<Long>,
19+
): Result<List<PhotoBooth>>
20+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.neki.android.core.data.remote.api
2+
3+
import com.neki.android.core.data.remote.model.request.PhotoBoothPointRequest
4+
import com.neki.android.core.data.remote.model.request.PhotoBoothPolygonRequest
5+
import com.neki.android.core.data.remote.model.response.BasicResponse
6+
import com.neki.android.core.data.remote.model.response.BrandResponse
7+
import com.neki.android.core.data.remote.model.response.PhotoBoothPointResponse
8+
import com.neki.android.core.data.remote.model.response.PhotoBoothPolygonResponse
9+
import io.ktor.client.HttpClient
10+
import io.ktor.client.call.body
11+
import io.ktor.client.request.get
12+
import io.ktor.client.request.post
13+
import io.ktor.client.request.setBody
14+
import javax.inject.Inject
15+
16+
class MapService @Inject constructor(
17+
private val client: HttpClient,
18+
) {
19+
suspend fun getBrands(): BasicResponse<List<BrandResponse>> {
20+
return client.get("/api/photo-booths/brand").body()
21+
}
22+
23+
suspend fun getPhotoBoothsByPoint(
24+
request: PhotoBoothPointRequest,
25+
): BasicResponse<PhotoBoothPointResponse> {
26+
return client.post("/api/photo-booths/point") {
27+
setBody(request)
28+
}.body()
29+
}
30+
31+
suspend fun getPhotoBoothsByPolygon(
32+
request: PhotoBoothPolygonRequest,
33+
): BasicResponse<PhotoBoothPolygonResponse> {
34+
return client.post("/api/photo-booths/polygon") {
35+
setBody(request)
36+
}.body()
37+
}
38+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.neki.android.core.data.remote.model.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class PhotoBoothPointRequest(
8+
@SerialName("longitude") val longitude: Double?,
9+
@SerialName("latitude") val latitude: Double?,
10+
@SerialName("radiusInMeters") val radiusInMeters: Int,
11+
@SerialName("brandIds") val brandIds: List<Long>,
12+
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.neki.android.core.data.remote.model.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class PhotoBoothPolygonRequest(
8+
@SerialName("coordinates") val coordinates: List<Coordinate>,
9+
@SerialName("brandIds") val brandIds: List<Long>,
10+
)
11+
12+
@Serializable
13+
data class Coordinate(
14+
@SerialName("longitude") val longitude: Double,
15+
@SerialName("latitude") val latitude: Double,
16+
)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.neki.android.core.data.remote.model.response
2+
3+
import com.neki.android.core.model.Brand
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
data class BrandResponse(
9+
@SerialName("id") val id: Long,
10+
@SerialName("name") val name: String,
11+
@SerialName("code") val code: String,
12+
@SerialName("imageUrl") val imageUrl: String,
13+
) {
14+
internal fun toModel(): Brand = Brand(
15+
id = id,
16+
name = name,
17+
code = code,
18+
imageUrl = imageUrl,
19+
)
20+
}
21+
22+
internal fun List<BrandResponse>.toModels(): List<Brand> = map { it.toModel() }
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.neki.android.core.data.remote.model.response
2+
3+
import com.neki.android.core.model.PhotoBooth
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
data class PhotoBoothPointResponse(
9+
@SerialName("items") val items: List<Item>,
10+
) {
11+
@Serializable
12+
data class Item(
13+
@SerialName("id") val id: Long,
14+
@SerialName("brandName") val brandName: String,
15+
@SerialName("branchName") val branchName: String,
16+
@SerialName("address") val address: String,
17+
@SerialName("longitude") val longitude: Double,
18+
@SerialName("latitude") val latitude: Double,
19+
@SerialName("distance") val distance: Int,
20+
) {
21+
internal fun toModel(): PhotoBooth = PhotoBooth(
22+
id = id,
23+
brandName = brandName,
24+
branchName = branchName,
25+
address = address,
26+
longitude = longitude,
27+
latitude = latitude,
28+
distance = distance,
29+
)
30+
}
31+
32+
internal fun toModels(): List<PhotoBooth> = items.map { it.toModel() }
33+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.neki.android.core.data.remote.model.response
2+
3+
import com.neki.android.core.model.PhotoBooth
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
data class PhotoBoothPolygonResponse(
9+
@SerialName("items") val items: List<Item>,
10+
) {
11+
@Serializable
12+
data class Item(
13+
@SerialName("id") val id: Long,
14+
@SerialName("brandName") val brandName: String,
15+
@SerialName("branchName") val branchName: String,
16+
@SerialName("address") val address: String,
17+
@SerialName("longitude") val longitude: Double,
18+
@SerialName("latitude") val latitude: Double,
19+
) {
20+
internal fun toModel(): PhotoBooth = PhotoBooth(
21+
id = id,
22+
brandName = brandName,
23+
branchName = branchName,
24+
address = address,
25+
longitude = longitude,
26+
latitude = latitude,
27+
)
28+
}
29+
30+
internal fun toModels(): List<PhotoBooth> = items.map { it.toModel() }
31+
}

core/data/src/main/java/com/neki/android/core/data/repository/di/RepositoryModule.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import com.neki.android.core.data.auth.AuthEventManagerImpl
44
import com.neki.android.core.data.repository.impl.AuthRepositoryImpl
55
import com.neki.android.core.data.repository.impl.DataStoreRepositoryImpl
66
import com.neki.android.core.data.repository.impl.MediaUploadRepositoryImpl
7+
import com.neki.android.core.data.repository.impl.MapRepositoryImpl
78
import com.neki.android.core.data.repository.impl.PhotoRepositoryImpl
89
import com.neki.android.core.data.repository.impl.TokenRepositoryImpl
910
import com.neki.android.core.dataapi.auth.AuthEventManager
1011
import com.neki.android.core.dataapi.repository.AuthRepository
1112
import com.neki.android.core.dataapi.repository.DataStoreRepository
1213
import com.neki.android.core.dataapi.repository.MediaUploadRepository
14+
import com.neki.android.core.dataapi.repository.MapRepository
1315
import com.neki.android.core.dataapi.repository.PhotoRepository
1416
import com.neki.android.core.dataapi.repository.TokenRepository
1517
import dagger.Binds
@@ -57,4 +59,10 @@ internal interface RepositoryModule {
5759
fun bindPhotoRepositoryImpl(
5860
photoRepositoryImpl: PhotoRepositoryImpl,
5961
): PhotoRepository
62+
63+
@Binds
64+
@Singleton
65+
fun bindMapRepositoryImpl(
66+
mapRepositoryImpl: MapRepositoryImpl,
67+
): MapRepository
6068
}

0 commit comments

Comments
 (0)