Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
55057dc
add: 아이콘 에셋 추가
wjdrjs00 Nov 15, 2025
6508a7a
Feat: ReportField 컴포넌트 구현
wjdrjs00 Nov 16, 2025
904114b
Feat: BitnagilTextField 디자인 컴포넌트 구현
wjdrjs00 Nov 16, 2025
d7b354d
Chore: TextButton 디자인 컴포넌트 개선
wjdrjs00 Nov 16, 2025
7f4fb3a
Feat: ReportCategory 이넘 클래스 정의
wjdrjs00 Nov 16, 2025
f314346
Feat: ReportCategorySelector 컴포넌트 구현
wjdrjs00 Nov 16, 2025
8740439
Feat: CurrentLocationInput 컴포넌트 구현
wjdrjs00 Nov 16, 2025
8211163
Feat: ReportCategoryBottomSheet 컴포넌트 구현
wjdrjs00 Nov 16, 2025
b5cbf11
Feat: ImageSourceBottomSheet 컴포넌트 구현
wjdrjs00 Nov 17, 2025
79033e3
Feat: AddPhotoButton 컴포넌트 구현
wjdrjs00 Nov 17, 2025
fe41ed2
Feat: PhotoItem 컴포넌트 구현
wjdrjs00 Nov 17, 2025
be45cbc
Refactor: LogoutConfirmDialog -> BitnagilAlertDialog 디자인 컴포넌트로 변경
wjdrjs00 Nov 17, 2025
3852d66
Feat: 권한 요청 로직 추가
wjdrjs00 Nov 17, 2025
355908b
Feat: 제보하기 화면 구현
wjdrjs00 Nov 17, 2025
6c98851
Feat: 제보하기 화면 라우팅 연결
wjdrjs00 Nov 17, 2025
e192f81
Feat: 현재 주소 및 위치 도메인 모델 추가
wjdrjs00 Nov 17, 2025
3c10321
Feat: 현재 주소 조회 기능 추가
wjdrjs00 Nov 18, 2025
345cb1e
feat: 카카오 주소 응답 DTO 추가
wjdrjs00 Nov 18, 2025
0ae1011
Feat: 현재 위치를 가져오는 기능 추가
wjdrjs00 Nov 18, 2025
cccd2ec
Feat: 카카오 로컬 API 연동 및 현재 주소 조회 기능 추가
wjdrjs00 Nov 18, 2025
b2bcb7c
Chore: 위도 경도 순서 변경
wjdrjs00 Nov 18, 2025
381eff0
Chore: 미사용 라이브러리 제거
wjdrjs00 Nov 18, 2025
eae927c
Feat: ImageFile 도메인 모델 정의
wjdrjs00 Nov 19, 2025
be4d1af
Feat: 파일 업로드 Repository 인터페이스 추가
wjdrjs00 Nov 19, 2025
17cd7fb
Feat: FileInfoRequestDto 정의
wjdrjs00 Nov 19, 2025
8465c9a
Feat: FileService 구현
wjdrjs00 Nov 19, 2025
2d2371f
Feat: FileDataSource 구현
wjdrjs00 Nov 19, 2025
abe9329
Feat: ImageUploader 구현
wjdrjs00 Nov 19, 2025
9460eda
Merge pull request #142 from YAPP-Github/feature/#141-report-ui
wjdrjs00 Nov 19, 2025
a80621f
Merge pull request #144 from YAPP-Github/feature/#143-report-location
wjdrjs00 Nov 19, 2025
ee3bffa
Feat: S3 이미지 업로드 로직 구현
wjdrjs00 Nov 19, 2025
2394367
Feat: 제보 이미지 업로드 UseCase 추가
wjdrjs00 Nov 19, 2025
29592f5
Feat: Report 도메인 모델 정의
wjdrjs00 Nov 19, 2025
9bcf5e2
Feat: 제보하기 API 및 data 레이어 추가
wjdrjs00 Nov 19, 2025
c8beeb1
Chore: ui에서 사용중인 ReportCategory 네이밍 변경
wjdrjs00 Nov 19, 2025
e9cbb52
Refactor: 이미지 파일 관련 유틸리티 함수 분리
wjdrjs00 Nov 20, 2025
9fa568b
Feat: 제보 제출하기 기능 구현
wjdrjs00 Nov 20, 2025
77d93c5
Chore: import 수정
wjdrjs00 Nov 20, 2025
ba0e1a4
Merge pull request #147 from YAPP-Github/feature/#145-report-submit-api
wjdrjs00 Nov 21, 2025
7590df5
Add: 이미지, 아이콘 에셋 추가
wjdrjs00 Nov 21, 2025
03c0bef
Feat: SubmittingReportContent 컴포넌트 구현
wjdrjs00 Nov 21, 2025
cee3677
Feat: CompleteReportContent 컴포넌트 구현
wjdrjs00 Nov 21, 2025
10ee8fe
Refactor: ReportCategory 확장함수 정의 및 기존 ui 모델 제거
wjdrjs00 Nov 21, 2025
4859c24
Feat: 제보 화면 상태에 따른 UI 분리 및 제출 로직 개선
wjdrjs00 Nov 21, 2025
d7b0c90
Feat: 제보 화면 키보드 ux 개선
wjdrjs00 Nov 21, 2025
cf810ca
Fix: 토끼 리뷰사항 반영
wjdrjs00 Nov 21, 2025
b602bee
Merge pull request #149 from YAPP-Github/ui/#148-report-complete-ui
wjdrjs00 Nov 21, 2025
da1655a
Add: KAKAO_REST_API_KEY to develop workflow
wjdrjs00 Nov 21, 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
2 changes: 2 additions & 0 deletions .github/workflows/develop_branch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ jobs:
- name: Generate local.properties
env:
KAKAO_NATIVE_APP_KEY: ${{ secrets.KAKAO_NATIVE_APP_KEY }}
KAKAO_REST_API_KEY: ${{ secrets.KAKAO_REST_API_KEY }}
BITNAGIL_DEV_URL: ${{ secrets.BITNAGIL_DEV_URL }}
BITNAGIL_PROD_URL: ${{ secrets.BITNAGIL_PROD_URL }}
RELEASE_KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }}
RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}
RELEASE_STORE_PASSWORD: ${{ secrets.RELEASE_STORE_PASSWORD }}
run: |
echo "kakao.native.app.key=$KAKAO_NATIVE_APP_KEY" >> local.properties
echo "kakao.rest.api.key=$KAKAO_REST_API_KEY" >> local.properties
echo "bitnagil.dev.url=$BITNAGIL_DEV_URL" >> local.properties
echo "bitnagil.prod.url=$BITNAGIL_PROD_URL" >> local.properties
echo "release.key.alias=$RELEASE_KEY_ALIAS" >> local.properties
Expand Down
11 changes: 11 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,17 @@ android {
name = "KAKAO_NATIVE_APP_KEY",
value = "\"$kakaoNativeAppKey\"",
)

val kakaoRestApiKey =
(properties["kakao.rest.api.key"] as? String)
?: System.getenv("KAKAO_REST_API_KEY")
?: throw GradleException("KAKAO_REST_API_KEY 값이 없습니다.")

buildConfigField(
type = "String",
name = "KAKAO_REST_API_KEY",
value = "\"$kakaoRestApiKey\"",
)
}

buildTypes {
Expand Down
15 changes: 15 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature android:name="android.hardware.camera" android:required="true" />

<application
android:name=".BitnagilApplication"
Expand Down Expand Up @@ -41,5 +46,15 @@
android:scheme="kakao${KAKAO_NATIVE_APP_KEY}" />
</intent-filter>
</activity>

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
16 changes: 16 additions & 0 deletions app/src/main/java/com/threegap/bitnagil/MainNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.threegap.bitnagil.presentation.login.LoginScreenContainer
import com.threegap.bitnagil.presentation.onboarding.OnBoardingScreenContainer
import com.threegap.bitnagil.presentation.onboarding.OnBoardingViewModel
import com.threegap.bitnagil.presentation.onboarding.model.navarg.OnBoardingScreenArg
import com.threegap.bitnagil.presentation.report.ReportScreenContainer
import com.threegap.bitnagil.presentation.routinelist.RoutineListScreenContainer
import com.threegap.bitnagil.presentation.setting.SettingScreenContainer
import com.threegap.bitnagil.presentation.splash.SplashScreenContainer
Expand Down Expand Up @@ -134,6 +135,11 @@ fun MainNavHost(
launchSingleTop = true
}
},
navigateToReport = {
navigator.navController.navigate(Route.Report) {
launchSingleTop = true
}
},
)
}

Expand Down Expand Up @@ -289,5 +295,15 @@ fun MainNavHost(
},
)
}

composable<Route.Report> {
ReportScreenContainer(
navigateToBack = {
if (navigator.navController.previousBackStackEntry != null) {
navigator.navController.popBackStack()
}
},
)
}
}
}
3 changes: 3 additions & 0 deletions app/src/main/java/com/threegap/bitnagil/Route.kt
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,7 @@ sealed interface Route {

@Serializable
data object Guide : Route

@Serializable
data object Report : Route
}
42 changes: 42 additions & 0 deletions app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import android.content.Intent
import com.threegap.bitnagil.BuildConfig
import com.threegap.bitnagil.MainActivity
import com.threegap.bitnagil.datastore.auth.storage.AuthTokenDataStore
import com.threegap.bitnagil.network.Auth
import com.threegap.bitnagil.network.Kakao
import com.threegap.bitnagil.network.NoneAuth
import com.threegap.bitnagil.network.auth.AuthInterceptor
import com.threegap.bitnagil.network.auth.TokenAuthenticator
import com.threegap.bitnagil.network.token.ReissueService
Expand All @@ -30,6 +33,8 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
object NetworkModule {
private const val APPLICATION_JSON = "application/json"
private const val REST_API_KEY = BuildConfig.KAKAO_REST_API_KEY
private const val KAKAO_URL = "https://dapi.kakao.com"

Comment thread
wjdrjs00 marked this conversation as resolved.
@Provides
@Singleton
Expand Down Expand Up @@ -74,6 +79,43 @@ object NetworkModule {
override suspend fun clearTokens() = dataStore.clearAuthToken()
}

@Provides
@Singleton
@Kakao
fun provideKakaoAuthInterceptor(): Interceptor =
Interceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Authorization", "KakaoAK $REST_API_KEY")
.build()
chain.proceed(request)
}

@Provides
@Singleton
@Kakao
fun provideKakaoOkHttpClient(
httpLoggingInterceptor: HttpLoggingInterceptor,
@Kakao kakaoAuthInterceptor: Interceptor,
): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(kakaoAuthInterceptor)
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10L, TimeUnit.SECONDS)
.writeTimeout(30L, TimeUnit.SECONDS)
.readTimeout(30L, TimeUnit.SECONDS)
.build()

@Provides
@Singleton
@Kakao
fun provideKakaoRetrofit(
converterFactory: Converter.Factory,
@Kakao okHttpClient: OkHttpClient,
): Retrofit = Retrofit.Builder()
.baseUrl(KAKAO_URL)
.addConverterFactory(converterFactory)
.client(okHttpClient)
.build()

@Provides
@Singleton
fun provideTokenAuthenticator(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
package com.threegap.bitnagil.di.data

import com.threegap.bitnagil.data.address.datasource.AddressDataSource
import com.threegap.bitnagil.data.address.datasource.LocationDataSource
import com.threegap.bitnagil.data.address.datasourceImpl.AddressDataSourceImpl
import com.threegap.bitnagil.data.address.datasourceImpl.LocationDataSourceImpl
import com.threegap.bitnagil.data.auth.datasource.AuthLocalDataSource
import com.threegap.bitnagil.data.auth.datasource.AuthRemoteDataSource
import com.threegap.bitnagil.data.auth.datasourceimpl.AuthLocalDataSourceImpl
import com.threegap.bitnagil.data.auth.datasourceimpl.AuthRemoteDataSourceImpl
import com.threegap.bitnagil.data.emotion.datasource.EmotionDataSource
import com.threegap.bitnagil.data.emotion.datasourceImpl.EmotionDataSourceImpl
import com.threegap.bitnagil.data.file.datasource.FileDataSource
import com.threegap.bitnagil.data.file.datasourceImpl.FileDataSourceImpl
import com.threegap.bitnagil.data.onboarding.datasource.OnBoardingDataSource
import com.threegap.bitnagil.data.onboarding.datasourceImpl.OnBoardingDataSourceImpl
import com.threegap.bitnagil.data.recommendroutine.datasource.RecommendRoutineDataSource
import com.threegap.bitnagil.data.recommendroutine.datasourceImpl.RecommendRoutineDataSourceImpl
import com.threegap.bitnagil.data.report.datasource.ReportDataSource
import com.threegap.bitnagil.data.report.datasourceImpl.ReportDataSourceImpl
import com.threegap.bitnagil.data.routine.datasource.RoutineRemoteDataSource
import com.threegap.bitnagil.data.routine.datasourceImpl.RoutineRemoteDataSourceImpl
import com.threegap.bitnagil.data.user.datasource.UserDataSource
Expand Down Expand Up @@ -63,4 +71,20 @@ abstract class DataSourceModule {
@Binds
@Singleton
abstract fun bindVersionDataSource(versionDataSourceImpl: VersionDataSourceImpl): VersionDataSource

@Binds
@Singleton
abstract fun bindLocationDataSource(locationDataSourceImpl: LocationDataSourceImpl): LocationDataSource

@Binds
@Singleton
abstract fun bindAddressDataSource(addressDataSourceImpl: AddressDataSourceImpl): AddressDataSource

@Binds
@Singleton
abstract fun bindFileDataSource(impl: FileDataSourceImpl): FileDataSource

@Binds
@Singleton
abstract fun bindReportDataSource(impl: ReportDataSourceImpl): ReportDataSource
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
package com.threegap.bitnagil.di.data

import com.threegap.bitnagil.data.address.repositoryImpl.AddressRepositoryImpl
import com.threegap.bitnagil.data.auth.repositoryimpl.AuthRepositoryImpl
import com.threegap.bitnagil.data.emotion.repositoryImpl.EmotionRepositoryImpl
import com.threegap.bitnagil.data.file.repositoryImpl.FileRepositoryImpl
import com.threegap.bitnagil.data.onboarding.repositoryImpl.OnBoardingRepositoryImpl
import com.threegap.bitnagil.data.recommendroutine.repositoryImpl.RecommendRoutineRepositoryImpl
import com.threegap.bitnagil.data.report.repositoryImpl.ReportRepositoryImpl
import com.threegap.bitnagil.data.routine.repositoryImpl.RoutineRepositoryImpl
import com.threegap.bitnagil.data.user.repositoryImpl.UserRepositoryImpl
import com.threegap.bitnagil.data.version.repositoryImpl.VersionRepositoryImpl
import com.threegap.bitnagil.data.writeroutine.repositoryImpl.WriteRoutineRepositoryImpl
import com.threegap.bitnagil.domain.address.repository.AddressRepository
import com.threegap.bitnagil.domain.auth.repository.AuthRepository
import com.threegap.bitnagil.domain.emotion.repository.EmotionRepository
import com.threegap.bitnagil.domain.file.repository.FileRepository
import com.threegap.bitnagil.domain.onboarding.repository.OnBoardingRepository
import com.threegap.bitnagil.domain.recommendroutine.repository.RecommendRoutineRepository
import com.threegap.bitnagil.domain.report.repository.ReportRepository
import com.threegap.bitnagil.domain.routine.repository.RoutineRepository
import com.threegap.bitnagil.domain.user.repository.UserRepository
import com.threegap.bitnagil.domain.version.repository.VersionRepository
Expand Down Expand Up @@ -57,4 +63,16 @@ abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindVersionRepository(versionRepositoryImpl: VersionRepositoryImpl): VersionRepository

@Binds
@Singleton
abstract fun bindAddressRepository(addressRepositoryImpl: AddressRepositoryImpl): AddressRepository

@Binds
@Singleton
abstract fun bindFileRepository(impl: FileRepositoryImpl): FileRepository

@Binds
@Singleton
abstract fun bindReportRepository(impl: ReportRepositoryImpl): ReportRepository
}
23 changes: 21 additions & 2 deletions app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.threegap.bitnagil.di.data

import com.threegap.bitnagil.data.address.service.AddressService
import com.threegap.bitnagil.data.auth.service.AuthService
import com.threegap.bitnagil.data.emotion.service.EmotionService
import com.threegap.bitnagil.data.file.service.FileService
import com.threegap.bitnagil.data.onboarding.service.OnBoardingService
import com.threegap.bitnagil.data.recommendroutine.service.RecommendRoutineService
import com.threegap.bitnagil.data.report.service.ReportService
import com.threegap.bitnagil.data.routine.service.RoutineService
import com.threegap.bitnagil.data.user.service.UserService
import com.threegap.bitnagil.data.version.service.VersionService
import com.threegap.bitnagil.data.writeroutine.service.WriteRoutineService
import com.threegap.bitnagil.di.core.Auth
import com.threegap.bitnagil.di.core.NoneAuth
import com.threegap.bitnagil.network.Auth
import com.threegap.bitnagil.network.Kakao
import com.threegap.bitnagil.network.NoneAuth
import com.threegap.bitnagil.network.token.ReissueService
import dagger.Module
import dagger.Provides
Expand Down Expand Up @@ -66,4 +70,19 @@ object ServiceModule {
@Singleton
fun provideVersionService(@NoneAuth retrofit: Retrofit): VersionService =
retrofit.create(VersionService::class.java)

@Provides
@Singleton
fun provideAddressService(@Kakao retrofit: Retrofit): AddressService =
retrofit.create(AddressService::class.java)

@Provides
@Singleton
fun provideFileService(@Auth retrofit: Retrofit): FileService =
retrofit.create(FileService::class.java)

@Provides
@Singleton
fun provideReportService(@Auth retrofit: Retrofit): ReportService =
retrofit.create(ReportService::class.java)
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ fun HomeNavHost(
navigateToRegisterRoutine: (String?) -> Unit,
navigateToEmotion: () -> Unit,
navigateToRoutineList: (String) -> Unit,
navigateToReport: () -> Unit,
) {
val navigator = rememberHomeNavigator()
var showFloatingOverlay by remember { mutableStateOf(false) }
Expand Down Expand Up @@ -106,6 +107,11 @@ fun HomeNavHost(

BitnagilFloatingActionMenu(
actions = listOf(
FloatingActionItem(
icon = R.drawable.ic_complaint,
text = "제보하기",
onClick = { navigateToReport() },
),
FloatingActionItem(
icon = R.drawable.ic_routine_add,
text = "루틴 등록",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
Expand Down Expand Up @@ -101,7 +102,7 @@ fun BitnagilFloatingActionMenu(
),
) {
Column(
modifier = Modifier.padding(16.dp),
modifier = Modifier.padding(vertical = 16.dp),
verticalArrangement = Arrangement.spacedBy(24.dp),
) {
actions.forEach { action ->
Expand Down Expand Up @@ -173,6 +174,8 @@ private fun FloatingActionMenuItem(
horizontalArrangement = Arrangement.spacedBy(14.dp),
modifier = modifier
.scale(scale)
.padding(horizontal = 16.dp)
.width(112.dp)
.clickableWithoutRipple { onClick() },
) {
BitnagilIcon(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,20 @@ data class BitnagilTextButtonColor(
) {
companion object {
@Composable
fun default(): BitnagilTextButtonColor = BitnagilTextButtonColor(
defaultBackgroundColor = BitnagilTheme.colors.coolGray10,
pressedBackgroundColor = BitnagilTheme.colors.coolGray5,
disabledBackgroundColor = BitnagilTheme.colors.coolGray96,
defaultTextColor = BitnagilTheme.colors.white,
pressedTextColor = BitnagilTheme.colors.coolGray20,
disabledTextColor = BitnagilTheme.colors.white,
fun default(
defaultBackgroundColor: Color = BitnagilTheme.colors.coolGray10,
pressedBackgroundColor: Color = BitnagilTheme.colors.coolGray5,
disabledBackgroundColor: Color = BitnagilTheme.colors.coolGray96,
defaultTextColor: Color = BitnagilTheme.colors.white,
pressedTextColor: Color = BitnagilTheme.colors.coolGray20,
disabledTextColor: Color = BitnagilTheme.colors.white,
): BitnagilTextButtonColor = BitnagilTextButtonColor(
defaultBackgroundColor = defaultBackgroundColor,
pressedBackgroundColor = pressedBackgroundColor,
disabledBackgroundColor = disabledBackgroundColor,
defaultTextColor = defaultTextColor,
pressedTextColor = pressedTextColor,
disabledTextColor = disabledTextColor,
)

@Composable
Expand Down
Loading