Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ render.experimental.xml
# Keystore files
*.jks
*.keystore
app/release.keystore
app/debug.keystore

# Google Services (e.g. APIs or Firebase)
google-services.json
Expand Down
20 changes: 20 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,25 @@ plugins {

android {
namespace = "com.teamsolply.solply"

signingConfigs {
getByName("debug") {
keyAlias = "androiddebugkey"
keyPassword = "android"
storeFile = File("${project.rootDir.absolutePath}/keystore/debug.keystore")
}
}

buildTypes {
debug {
signingConfig = signingConfigs.getByName("debug")
}
release {
signingConfig = signingConfigs.getByName("debug")
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
Comment on lines +22 to +26
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue

๋ฆด๋ฆฌ์ฆˆ ๋นŒ๋“œ์—์„œ ๋””๋ฒ„๊ทธ ํ‚ค์Šคํ† ์–ด ์‚ฌ์šฉ ๋ฐ ๋‚œ๋…ํ™” ๋น„ํ™œ์„ฑํ™” ๋ฌธ์ œ

๋ฆด๋ฆฌ์ฆˆ ๋นŒ๋“œ์—์„œ ๋””๋ฒ„๊ทธ ํ‚ค์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ ๋‚œ๋…ํ™”๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ˆ˜์ •์‚ฌํ•ญ์„ ์ ์šฉํ•˜์„ธ์š”:

+        create("release") {
+            keyAlias = "release"
+            keyPassword = "your_release_password"
+            storeFile = File("${project.rootDir.absolutePath}/keystore/release.keystore")
+        }
    }

    buildTypes {
        debug {
            signingConfig = signingConfigs.getByName("debug")
        }
        release {
-            signingConfig = signingConfigs.getByName("debug")
+            signingConfig = signingConfigs.getByName("release")
-            isMinifyEnabled = false
+            isMinifyEnabled = true
+            isShrinkResources = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
๐Ÿค– Prompt for AI Agents
In app/build.gradle.kts around lines 22 to 26, the release build is incorrectly
using the debug signingConfig and has minify (code obfuscation) disabled, which
poses security risks. Change the signingConfig to use the proper release
keystore configuration instead of "debug" and enable minify by setting
isMinifyEnabled to true. Also, ensure the proguardFiles are correctly configured
for release builds to enable code obfuscation and optimization.

}
}

dependencies {
Expand All @@ -32,6 +51,7 @@ dependencies {
implementation(projects.local.main)
implementation(projects.local.oauth)
implementation(projects.local.place)
implementation(projects.remote.oauth)
implementation(projects.remote.onboarding)
implementation(projects.remote.place)
implementation(projects.remote.course)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,12 @@ private fun BaseTextField(
@Composable
fun SolplyNicknameTextField(
value: String,
isNicknameDuplicate: Boolean,
onValueChange: (String) -> Unit,
modifier: Modifier = Modifier,
placeholder: String = "์—ฌ๊ธฐ์— ์ž…๋ ฅํ•˜์„ธ์š”.",
maxLength: Int = 8,
minLength: Int = 2,
onDuplicateCheck: (String) -> Boolean,
checkNicknameValidate: (String) -> Boolean
) {
var validationState by remember { mutableStateOf<NickNameValidateState>(NickNameValidateState.Empty) }
Expand All @@ -130,16 +130,16 @@ fun SolplyNicknameTextField(
NickNameValidateState.MaxLength,
NickNameValidateState.Typing
) ||
(validationState == NickNameValidateState.Empty && value.isNotEmpty())
(validationState == NickNameValidateState.Empty && value.isNotEmpty())

LaunchedEffect(value) {
if (value.isNotEmpty()) {
isTyping = true
delay(300)

if(value.length<minLength){
validationState =NickNameValidateState.TooShort
isTyping=false
if (value.length < minLength) {
validationState = NickNameValidateState.TooShort
isTyping = false
return@LaunchedEffect
}
if (value.length == maxLength) {
Expand All @@ -153,9 +153,8 @@ fun SolplyNicknameTextField(
validationState = NickNameValidateState.Invalid
isTyping = false
} else {
val duplicate = onDuplicateCheck(value)
validationState =
if (duplicate) NickNameValidateState.Duplicate else NickNameValidateState.Valid
if (isNicknameDuplicate) NickNameValidateState.Duplicate else NickNameValidateState.Valid
isTyping = false
}
} else {
Expand All @@ -170,7 +169,8 @@ fun SolplyNicknameTextField(
validationState in listOf(
NickNameValidateState.Duplicate,
NickNameValidateState.Invalid,
NickNameValidateState.TooShort) ->
NickNameValidateState.TooShort
) ->
Pair(SolplyTheme.colors.white, SolplyTheme.colors.red600)

validationState == NickNameValidateState.Typing ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,12 @@ class AccessTokenInterceptor @Inject constructor(
originalRequest
}

if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Request URL: ${newRequest.url}")
Log.d(
TAG,
"Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
)
}
Log.d(TAG, "Request URL: ${newRequest.url}")
Log.d(
TAG,
"Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
)
Comment on lines +35 to +39
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด ๋กœ๊น…์˜ ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ถ€ ๋””๋ฒ„๊ทธ ๋กœ๊น…์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด URL๊ณผ ์ธ์ฆ ํ—ค๋” ์ •๋ณด๋ฅผ ๋ฌด์กฐ๊ฑด ๋กœ๊น…ํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋กœ๊ทธ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์—ฌ ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ๋งŒ ๋กœ๊น…ํ•˜๋„๋ก ๊ฐœ์„ ํ•˜์„ธ์š”:

-        Log.d(TAG, "Request URL: ${newRequest.url}")
-        Log.d(
-            TAG,
-            "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
-        )
+        if (BuildConfig.DEBUG) {
+            Log.d(TAG, "Request URL: ${newRequest.url}")
+            Log.d(
+                TAG,
+                "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
+            )
+        }
๐Ÿ“ Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Log.d(TAG, "Request URL: ${newRequest.url}")
Log.d(
TAG,
"Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
)
if (BuildConfig.DEBUG) {
Log.d(TAG, "Request URL: ${newRequest.url}")
Log.d(
TAG,
"Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
)
}
๐Ÿค– Prompt for AI Agents
In
core/network/src/main/java/com/teamsolply/solply/network/AccessTokenInterceptor.kt
around lines 35 to 39, the current code logs request URLs and authorization
headers unconditionally, which risks exposing sensitive information in
production logs. Modify the code to wrap these log statements inside a check
that ensures they only execute in debug builds, such as using a build
configuration flag or a debug mode check, to prevent sensitive data from being
logged in production environments.


return chain.proceed(newRequest)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import retrofit2.http.Header
import retrofit2.http.POST

interface TokenRefreshService {
@POST("")
@POST("api/auth/refresh")
suspend fun postRefreshJwtToken(
@Header("Authorization") refreshToken: String
@Header("Refresh-Token") refreshToken: String
): ResponsePostAuthRefreshDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.teamsolply.solply.oauth.dto.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SocialLoginRequestDto(
@SerialName("oauthAccessToken")
val oauthAccessToken: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.teamsolply.solply.oauth.dto.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SocialLoginResponseDto(
@SerialName("accessToken")
val accessToken: String,
@SerialName("refreshToken")
val refreshToken: String,
@SerialName("isNewUser")
val isNewUser: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,35 @@ package com.teamsolply.solply.oauth.repository

import com.teamsolply.solply.oauth.model.TokenEntity
import com.teamsolply.solply.oauth.source.OauthLocalDataSource
import com.teamsolply.solply.oauth.source.OauthRemoteDataSource
import javax.inject.Inject

class OauthRepositoryImpl @Inject constructor(
private val oauthLocalDataSource: OauthLocalDataSource
private val oauthLocalDataSource: OauthLocalDataSource,
private val oauthRemoteDataSource: OauthRemoteDataSource
) : OauthRepository {
override suspend fun saveJwtToken(jwtToken: TokenEntity): Result<Unit> = runCatching {
oauthLocalDataSource.setAuthLocalData(
accessToken = jwtToken.accessToken,
refreshToken = jwtToken.refreshToken

override suspend fun postSocialLogin(
provider: String,
oauthAccessToken: String
): Result<TokenEntity> = runCatching {
oauthRemoteDataSource.socialLogin(
provider = provider,
oauthAccessToken = oauthAccessToken
)
}.mapCatching {
TokenEntity(
accessToken = it.accessToken,
refreshToken = it.refreshToken,
isNewUser = it.isNewUser
)
}

override suspend fun saveJwtToken(accessToken: String, refreshToken: String): Result<Unit> =
runCatching {
oauthLocalDataSource.setAuthLocalData(
accessToken = accessToken,
refreshToken = refreshToken
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.teamsolply.solply.oauth.source

import com.teamsolply.solply.oauth.dto.response.SocialLoginResponseDto

interface OauthRemoteDataSource {
suspend fun socialLogin(provider: String, oauthAccessToken: String): SocialLoginResponseDto
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SignUpRequestDto(
data class PatchUserInfoRequestDto(
@SerialName("favoriteTown")
val favoriteTown: Long,
@SerialName("persona")
val persona: String,
@SerialName("nickname")
val nickname: String,
@SerialName("id")
val id: Int
val nickname: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.teamsolply.solply.onboarding.dto.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class NicknameDuplicateResponseDto(
@SerialName("isDuplicated")
val isDuplicated: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.teamsolply.solply.onboarding.dto.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class PatchUserInfoResponseDto(
@SerialName("favoriteTownId")
val favoriteTownId: Long,
@SerialName("favoriteTownName")
val favoriteTownName: String,
@SerialName("persona")
val persona: String,
@SerialName("nickname")
val nickname: String
)
Original file line number Diff line number Diff line change
@@ -1,16 +1,35 @@
package com.teamsolply.solply.onboarding.repository

import com.teamsolply.solply.onboarding.model.SignUpEntity
import com.teamsolply.solply.onboarding.dto.request.PatchUserInfoRequestDto
import com.teamsolply.solply.onboarding.model.UserInfoEntity
import com.teamsolply.solply.onboarding.source.OnBoardingRemoteDataSource
import javax.inject.Inject

class OnBoardingRepositoryImpl @Inject constructor(
private val onBoardingRemoteDataSource: OnBoardingRemoteDataSource
) : OnBoardingRepository {
override suspend fun signUp(signUpInfo: SignUpEntity) = runCatching {
onBoardingRemoteDataSource.signUp(
nickname = signUpInfo.nickname,
id = signUpInfo.userId
override suspend fun checkNicknameDuplicate(nickname: String): Result<Boolean> = runCatching {
onBoardingRemoteDataSource.checkNicknameDuplicate(nickname = nickname).isDuplicated
}

override suspend fun patchUserInfo(
favoriteTown: Long,
persona: String,
nickname: String
): Result<UserInfoEntity> = runCatching {
onBoardingRemoteDataSource.patchUserInfo(
PatchUserInfoRequestDto(
favoriteTown = favoriteTown,
persona = persona,
nickname = nickname
)
)
}.mapCatching {
UserInfoEntity(
favoriteTownId = it.favoriteTownId,
favoriteTownName = it.favoriteTownName,
persona = it.persona,
nickname = it.nickname
)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.teamsolply.solply.onboarding.source

import com.teamsolply.solply.onboarding.dto.request.PatchUserInfoRequestDto
import com.teamsolply.solply.onboarding.dto.response.NicknameDuplicateResponseDto
import com.teamsolply.solply.onboarding.dto.response.PatchUserInfoResponseDto

interface OnBoardingRemoteDataSource {
suspend fun signUp(nickname: String, id: Int)
suspend fun checkNicknameDuplicate(nickname: String): NicknameDuplicateResponseDto
suspend fun patchUserInfo(patchUserInfoRequestDto: PatchUserInfoRequestDto): PatchUserInfoResponseDto
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ package com.teamsolply.solply.oauth.model

data class TokenEntity(
val accessToken: String,
val refreshToken: String
val refreshToken: String,
val isNewUser: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ package com.teamsolply.solply.oauth.repository
import com.teamsolply.solply.oauth.model.TokenEntity

interface OauthRepository {
suspend fun saveJwtToken(jwtToken: TokenEntity): Result<Unit>
suspend fun postSocialLogin(provider: String, oauthAccessToken: String): Result<TokenEntity>
suspend fun saveJwtToken(accessToken: String, refreshToken: String): Result<Unit>
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.teamsolply.solply.onboarding.model

data class UserInfoEntity(
val favoriteTownId: Long?,
val favoriteTownName: String,
val persona: String,
val nickname: String
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package com.teamsolply.solply.onboarding.repository

import com.teamsolply.solply.onboarding.model.SignUpEntity
import com.teamsolply.solply.onboarding.model.UserInfoEntity

interface OnBoardingRepository {
suspend fun signUp(signUpInfo: SignUpEntity): Result<Unit>
suspend fun checkNicknameDuplicate(nickname: String): Result<Boolean>
suspend fun patchUserInfo(
favoriteTown: Long,
persona: String,
nickname: String
): Result<UserInfoEntity>
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import com.teamsolply.solply.mypage.collection.course.navigateCourseCollection
import com.teamsolply.solply.mypage.collection.place.navigatePlaceCollection
import com.teamsolply.solply.mypage.navigation.navigateMypage
import com.teamsolply.solply.oauth.navigation.navigateOauth
import com.teamsolply.solply.onboarding.navigation.OnBoarding
import com.teamsolply.solply.onboarding.navigation.navigateOnBoarding
import com.teamsolply.solply.place.navigation.navigatePlace

Expand All @@ -27,7 +26,7 @@ internal class MainNavigator(
@Composable get() = navController
.currentBackStackEntryAsState().value?.destination

val startDestination = OnBoarding
val startDestination = Splash
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿ’ก Verification agent

๐Ÿงฉ Analysis chain

์‹œ์ž‘ ํ™”๋ฉด ๋ณ€๊ฒฝ์ด ์•ฑ ํ”Œ๋กœ์šฐ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ฒ€์ฆํ•˜์„ธ์š”.

์‹œ์ž‘ ํ™”๋ฉด์„ OnBoarding์—์„œ Splash๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์•ฑ์˜ ์ดˆ๊ธฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์—์„œ ์ ์ ˆํ•œ ์‹œ์ ์— ์˜จ๋ณด๋”ฉ์ด๋‚˜ OAuth ๋กœ๊ทธ์ธ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์—์„œ ์˜จ๋ณด๋”ฉ/OAuth๋กœ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ ํ™•์ธํ•˜์„ธ์š”:


๐Ÿ Script executed:

#!/bin/bash
# ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์—์„œ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง ๊ฒ€์ƒ‰
fd -t f -e kt | xargs grep -l "Splash" | xargs grep -A 10 -B 5 "navigate"

Length of output: 17757


Splash ํ™”๋ฉด์—์„œ ์˜จ๋ณด๋”ฉ ๋กœ์ง ๋ˆ„๋ฝ ํ™•์ธ ๋ฐ ๋ณด์™„ ํ•„์š”

Splash๋ฅผ ์‹œ์ž‘ ํ™”๋ฉด์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ์‹ค์ œ๋กœ OnBoarding์œผ๋กœ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜์ด ๋น ์ ธ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. MainNavigator์—๋Š” ์—ฌ์ „ํžˆ navigateToOnboarding ๋ฉ”์„œ๋“œ(import ํฌํ•จ)๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋‚˜, SplashNavigation ๋ฐ SplashScreen ์ชฝ์— ์˜จ๋ณด๋”ฉ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ฝœ๋ฐฑ์ด ์ „๋‹ฌยท์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์กฐ์น˜๊ฐ€ ํ•„์š”ํ•œ ์œ„์น˜:

  • feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt
    โ€ข fun navigateToOnboarding(navOptions: NavOptions) ์กด์žฌ
  • feature/main/src/main/java/com/teamsolply/solply/main/splash/SplashNavigation.kt
    โ€ข splashNavGraph ํ˜ธ์ถœ๋ถ€์— OnBoarding ์ฝœ๋ฐฑ ์ „๋‹ฌ๋ถ€ ์—†์Œ
  • feature/main/src/main/java/com/teamsolply/solply/main/splash/SplashScreen.kt
    โ€ข SplashSideEffect์— OnBoarding ๊ด€๋ จ ์ผ€์ด์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ

์ œ์•ˆ

  • ์‹ ๊ทœ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ OnBoarding์œผ๋กœ ๋ถ„๊ธฐํ•˜๋„๋ก SplashViewModel์—์„œ SideEffect๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , SplashNavigation์— navigateToOnboarding ์ฝœ๋ฐฑ์„ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜
  • ์˜จ๋ณด๋”ฉ ํ”Œ๋กœ์šฐ ์ž์ฒด๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋ ค๋ฉด MainNavigator ๋ฐ ๊ด€๋ จ import๋ฅผ ์ •๋ฆฌ

์œ„ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ด ์•ฑ ํ”Œ๋กœ์šฐ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆ ํ›„ ์ˆ˜์ • ๋ฐ”๋ž๋‹ˆ๋‹ค.

๐Ÿค– Prompt for AI Agents
In feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt at
line 29 and related files, the navigation from Splash screen to OnBoarding is
missing despite the presence of navigateToOnboarding method. Fix this by adding
a SideEffect in SplashViewModel to trigger OnBoarding navigation for new users,
passing the navigateToOnboarding callback through SplashNavigation's
splashNavGraph, and handling the OnBoarding case in SplashScreen's
SplashSideEffect. Alternatively, if OnBoarding is to be removed, clean up
MainNavigator and imports accordingly. Verify the app flow works as intended
after these changes.


val currentTab: MainNavTab?
@Composable get() = MainNavTab.find { tab ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,15 @@ internal fun MainScreen(
launchSingleTop = true
}
navigator.navigateToOnboarding(navOptions)
},
navigateToPlace = {
val navOptions = navOptions {
popUpTo(0) {
inclusive = true
}
launchSingleTop = true
}
navigator.navigateToPlace(navOptions = navOptions)
}
)
onBoardingNavGraph(
Expand Down
Loading