Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
bc73978
chore: 이슈 템플릿 에픽 제거
ThirFir Jul 18, 2025
a5ac3e9
fix: 이슈 템플릿 description 공란 이슈
ThirFir Jul 18, 2025
7908691
chore: 버전 업데이트 2.1.0
ThirFir Aug 6, 2025
d98abda
feat: 커스텀 SlideUp 애니메이션 구현
1971123-seongmin Aug 6, 2025
2a3f93e
feat: SlideUp 애니메이션 적용 (장소 검색)
1971123-seongmin Aug 6, 2025
e72fd0b
feat: 업로드 프로세스 글자 애니메이션 적용
1971123-seongmin Aug 7, 2025
318e395
mod: 리뷰 등록 api 속도 개선
1971123-seongmin Aug 7, 2025
18976ae
fix: 장소 추천 API Auth/No Auth API 분리
ThirFir Aug 7, 2025
0918e94
mod: qa, 장소 등록 나가기 다이얼로그 문구 수정, 완료 화면에서는 뒤로가기 시, 홈으로 나가기
1971123-seongmin Aug 7, 2025
630755a
mod: qa, 카페 옵션 선택 그저 그래요 옵션 선택 안되는 것 수정, enum name 변경
1971123-seongmin Aug 7, 2025
b1215b1
mod: qa, 메뉴명 등록 최대 30자로 수정
1971123-seongmin Aug 7, 2025
a349e2d
mod: 화면 이동 애니메이션 줄 바꿈, 시간 설정
1971123-seongmin Aug 7, 2025
c37d663
mod: 음식/카페 옵션 하나로 통일(하나만 선택됨), 카페 옵션의 경우 WORK_FRIENDLY 일 때만 서버에 보냄
1971123-seongmin Aug 8, 2025
b1d8f9a
merge: feat#241/text-animation-with-qa -> release
1971123-seongmin Aug 8, 2025
1b0093a
chore: 버전 코드 1 증가
ThirFir Aug 11, 2025
c0eb7e5
add: Readme.md 링크 추가
1971123-seongmin Aug 15, 2025
18d2d46
add: Readme.md Contributors 기간 추가
1971123-seongmin Aug 15, 2025
68f39ef
add: Readme.md 장소 업로드 실행 영상 추가
1971123-seongmin Aug 15, 2025
88db769
merge: docs#243-readme-link -> main
1971123-seongmin Aug 15, 2025
0044b86
merge: release -> main
ThirFir Aug 19, 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
11 changes: 1 addition & 10 deletions .github/ISSUE_TEMPLATE/issue-form.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
name: '이슈 생성'
description: '이슈 생성과 동시에 Jira와 연동됩니다.'
description: '새 이슈를 생성합니다'
title: '이슈 제목'
body:
- type: input
id: epicId
attributes:
label: '💎 에픽 ID'
description: '에픽 ID를 입력해주세요'
placeholder: 'KAN-1'
validations:
required: true

- type: input
id: dueDate
attributes:
Expand Down
51 changes: 31 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,42 +3,53 @@
</p>



<p align="center" style="font-size:150%">
<a href="https://play.google.com/store/apps/details?id=com.acon.acon" target="_blank">PlayStore</a> ·
<a href="https://aconinc.netlify.app/" target="_blank">About us</a> ·
<a href="https://github.com/SOPT-all/SOPT-all-35-APPJAM-ANDROID-ACON" target="_blank">Previous Repository</a>
</p>
<p align="center" style="font-size:200%"><strong>No More Research</strong></p>
<h1 align="center">Acon</h1>

<p align="center"><img width="662" alt="image" src="https://github.com/user-attachments/assets/fb268135-b2ea-4258-916e-6a6abcdfbd47" /></p>


<p align="center">
<img src="https://github.com/user-attachments/assets/540aea87-6a2e-432e-9ce1-e2b4d9e4a472" width="250"/>
&nbsp;&nbsp;&nbsp;
<img src="https://github.com/user-attachments/assets/f4d8cc0a-1783-4504-a0ec-c7b40d479d17" width="250"/>
&nbsp;&nbsp;&nbsp;
<img src="https://github.com/user-attachments/assets/ba3e50e8-f5f8-4eb4-85e9-3647ea5b420a" width="250"/>
</p>
<table align="center">
<tr>
<th>홈</th>
<th>리뷰 등록</th>
<th>북마크 및 장소상세</th>
<th>장소 업로드</th>
</tr>
<tr>
<td><img src="https://github.com/user-attachments/assets/540aea87-6a2e-432e-9ce1-e2b4d9e4a472" width="200"/></td>
<td><img src="https://github.com/user-attachments/assets/f4d8cc0a-1783-4504-a0ec-c7b40d479d17" width="200"/></td>
<td><img src="https://github.com/user-attachments/assets/ba3e50e8-f5f8-4eb4-85e9-3647ea5b420a" width="200"/></td>
<td><img src="https://github.com/user-attachments/assets/e4860ff1-a693-4239-8115-4345d06c428a" width="280"/></td>
</tr>
</table>

---

## ⚙️ Teck Stacks

| 분류 | 사용 기술 |
|------|------------|
| Language | Kotlin |
| UI | Jetpack Compose, Material 3 |
| 분류 | 사용 기술 |
|------|---------------------------------------------|
| Language | Kotlin |
| UI | Jetpack Compose, Material 3 |
| Architecture | MVI Orbit, Multi-module, Clean Architecture |
| DI | Hilt |
| Network | Retrofit, OkHttp |
| CI/CD | GitHub Actions, Firebase App Distribution |
| Etc | Play-services, Amplitude, Haze |
| DI | Hilt |
| Network | Retrofit, OkHttp |
| CI/CD | GitHub Actions, Firebase App Distribution |
| Etc | Play-services, Amplitude, Haze, Branch.io |

---

## 🙌 Contributors
[@Thirfir](https://github.com/ThirFir)
[@Thirfir](https://github.com/ThirFir) (2025.1 ~ )
<br/>
[@1971123-seongmin](https://github.com/1971123-seongmin)
[@1971123-seongmin](https://github.com/1971123-seongmin) (2025.1 ~ )
<br/>
[@tunaunnie](https://github.com/tunaunnie)
[@tunaunnie](https://github.com/tunaunnie) (2025.1 ~ 2025.2)
<br/>
[@0se0](https://github.com/0se0)
[@0se0](https://github.com/0se0) (2025.1 ~ 2025.2)
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.acon.acon.core.designsystem.animation

import android.annotation.SuppressLint
import androidx.compose.animation.core.Easing
import androidx.compose.animation.core.LinearOutSlowInEasing
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.offset
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.acon.acon.core.designsystem.R
import kotlinx.coroutines.delay

@SuppressLint("UseOfNonLambdaOffsetOverload")
@Composable
fun Modifier.slideUpAnimation(
order: Int = 1,
delay: Int = 0,
duration: Int = 500,
easing: Easing = LinearOutSlowInEasing,
yOffset: Dp = 100.dp,
titleDelay: Int = 300,
contentDelay: Int = 600,
hasCaption: Boolean = false,
onAnimationEnded: () -> Unit = {}
): Modifier = composed {
val animationDelay = remember(order, hasCaption) {
when (order) {
1 -> delay
2 -> delay + titleDelay
3 -> if (hasCaption) delay + titleDelay * 2 else 0
4 -> if (hasCaption) {
delay + titleDelay * 2 + contentDelay
} else {
delay + titleDelay + contentDelay
}
else -> delay
}
}

var visible by remember { mutableStateOf(false) }

LaunchedEffect(Unit) {
delay(animationDelay.toLong())
visible = true
}

val offsetY by animateDpAsState(
targetValue = if (visible) 0.dp else yOffset,
animationSpec = tween(
durationMillis = duration,
easing = easing
),
label = stringResource(R.string.slide_up_offset)
)

val alpha by animateFloatAsState(
targetValue = if (visible) 1f else 0f,
animationSpec = tween(
durationMillis = duration,
easing = easing
),
label = stringResource(R.string.slide_up_alpha)
)

LaunchedEffect(offsetY) {
if (offsetY == 0.dp) {
onAnimationEnded()
}
}

Modifier
.offset(y = offsetY)
.alpha(alpha)
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ fun AconTwoActionDialog(
onAction1: () -> Unit,
onAction2: () -> Unit,
onDismissRequest: () -> Unit,
isTextAlign: Boolean = false,
action1Color: Color = AconTheme.color.White,
action2Color: Color = AconTheme.color.Action,
modifier: Modifier = Modifier,
Expand Down Expand Up @@ -65,6 +66,7 @@ fun AconTwoActionDialog(
style = AconTheme.typography.Title4,
fontWeight = FontWeight.SemiBold,
color = AconTheme.color.White,
textAlign = if (isTextAlign) TextAlign.Center else TextAlign.Unspecified,
modifier = Modifier
.padding(top = 24.dp, bottom = 22.dp)
.padding(horizontal = 16.dp)
Expand Down
7 changes: 6 additions & 1 deletion core/designsystem/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
<string name="select">선택</string>
<string name="submit">제출하기</string>
<string name="end">끝내기</string>
<string name="quit">그만두기</string>
<string name="report">제보하기</string>
<string name="continue_writing">계속 작성</string>
<string name="next">다음</string>
Expand All @@ -31,6 +32,10 @@
<string name="do_next">다음에 하기</string>
<string name="go_home">홈으로 가기</string>

<!-- label -->
<string name="slide_up_offset">slide_up_offset</string>
<string name="slide_up_alpha">slide_up_alpha</string>

<!-- Etc -->
<string name="restart">마무리 하기</string>
<string name="update">업데이트</string>
Expand Down Expand Up @@ -212,7 +217,7 @@

<!-- Upload Place -->
<string name="upload_process_step_transition">upload_process_step_transition</string>
<string name="upload_place_exit">등록을 취소하시겠습니까?</string>
<string name="upload_place_exit">여기서 그만두면\n작성중인 내용이 사라져요</string>
<string name="upload_place_topbar">장소 등록</string>
<string name="required_field">필수 입력</string>
<string name="optional_field">선택 입력</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ sealed interface RestaurantFeatureType : FeatureType {
sealed interface CafeFeatureType : FeatureType {

enum class CafeType: FeatureType {
GOOD_FOR_WORK,
WORK_FRIENDLY,
NOT_GOOD_FOR_WORK;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.acon.acon.data.api.remote.noauth

import com.acon.acon.data.dto.request.RecentNavigationLocationRequest
import com.acon.acon.data.dto.request.SpotListRequest
import com.acon.acon.data.dto.response.MenuBoardListResponse
import com.acon.acon.data.dto.response.SpotDetailResponse
import com.acon.acon.data.dto.response.SpotListResponse
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
Expand All @@ -11,6 +13,11 @@ import retrofit2.http.Query

interface SpotNoAuthApi {

@POST("/api/v1/spots")
suspend fun fetchSpotList(
@Body request: SpotListRequest
): SpotListResponse

@POST("/api/v1/guided-spots")
suspend fun fetchRecentNavigationLocation(
@Body request: RecentNavigationLocationRequest
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.acon.acon.data.datasource.remote

import com.acon.acon.core.model.type.UserType
import com.acon.acon.data.api.remote.auth.SpotAuthApi
import com.acon.acon.data.api.remote.noauth.SpotNoAuthApi
import com.acon.acon.data.dto.request.AddBookmarkRequest
Expand All @@ -16,8 +17,10 @@ class SpotRemoteDataSource @Inject constructor(
private val spotAuthApi: SpotAuthApi
) {

suspend fun fetchSpotList(request: SpotListRequest): SpotListResponse {
return spotAuthApi.fetchSpotList(request)
suspend fun fetchSpotList(request: SpotListRequest, userType: UserType): SpotListResponse {
return if (userType == UserType.GUEST)
spotNoAuthApi.fetchSpotList(request)
else spotAuthApi.fetchSpotList(request)
}

suspend fun fetchRecentNavigationLocation(request: RecentNavigationLocationRequest) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.acon.acon.data.dto.request.FilterListRequest
import com.acon.acon.data.dto.request.RecentNavigationLocationRequest
import com.acon.acon.data.dto.request.SpotListRequest
import com.acon.acon.data.error.runCatchingWith
import com.acon.acon.data.session.SessionHandler
import com.acon.acon.domain.error.spot.AddBookmarkError
import com.acon.acon.domain.error.spot.DeleteBookmarkError
import com.acon.acon.domain.error.spot.FetchMenuBoardsError
Expand All @@ -21,12 +22,14 @@ import com.acon.acon.domain.error.spot.FetchSpotListError
import com.acon.acon.domain.error.spot.GetSpotDetailInfoError
import com.acon.acon.domain.repository.ProfileRepository
import com.acon.acon.domain.repository.SpotRepository
import kotlinx.coroutines.flow.first
import javax.inject.Inject

class SpotRepositoryImpl @Inject constructor(
private val spotRemoteDataSource: SpotRemoteDataSource,
private val profileInfoCache: ProfileInfoCache,
private val profileRepository: ProfileRepository
private val profileRepository: ProfileRepository,
private val sessionHandler: SessionHandler
) : SpotRepository {

override suspend fun fetchSpotList(
Expand All @@ -48,7 +51,7 @@ class SpotRepositoryImpl @Inject constructor(
)
}
),
)
), sessionHandler.getUserType().first()
).toSpotList()
}
}
Expand Down
Loading