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
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public extension TargetDependency {
public struct Search {}
public struct Setting {}
public struct PopularTravel {}
public struct TravelTool {}
}

struct Modules {}
Expand Down Expand Up @@ -88,6 +89,12 @@ public extension TargetDependency.Features.Main {

public extension TargetDependency.Features.PopularTravel {
static let group = "PopularTravel"


static let feature = TargetDependency.Features.project(name: "Feature", group: group)
}

public extension TargetDependency.Features.TravelTool {
static let group = "TravelTool"

static let feature = TargetDependency.Features.project(name: "Feature", group: group)
}
3 changes: 2 additions & 1 deletion Plugins/EnvPlugin/ProjectDescriptionHelpers/InfoPlist.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ public extension Project {
]),
"ITSAppUsesNonExemptEncryption": .boolean(false),
"BASE_URL": .string("$(BASE_URL)"),
"X_API_KEY": .string("$(X_API_KEY)")
"X_API_KEY": .string("$(X_API_KEY)"),
"GOOGLE_WEATHER_API_KEY": .string("$(GOOGLE_WEATHER_API_KEY)")
]

static let demoInfoPlist: [String: Plist.Value] = [
Expand Down
31 changes: 31 additions & 0 deletions Projects/App/Resources/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- μ‚¬μš©μž 행동 좔적 μ—¬λΆ€ -->
<key>NSPrivacyTracking</key>
<false/>

<!-- 좔적에 μ‚¬μš©λ˜λŠ” 도메인 (좔적 μ—†μœΌλ―€λ‘œ 빈 λ°°μ—΄) -->
<key>NSPrivacyTrackingDomains</key>
<array/>

<!-- μˆ˜μ§‘ν•˜λŠ” 데이터 μœ ν˜• (직접 μˆ˜μ§‘ μ—†μœΌλ―€λ‘œ 빈 λ°°μ—΄) -->
<key>NSPrivacyCollectedDataTypes</key>
<array/>

<!-- Required Reason API μ‚¬μš© λͺ©μ  μ„ μ–Έ -->
<key>NSPrivacyAccessedAPITypes</key>
<array>
<!-- UserDefaults: uuid, nickname λ“± μ•± μƒνƒœ κ΄€λ¦¬μš©μœΌλ‘œλ§Œ μ‚¬μš© -->
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
7 changes: 7 additions & 0 deletions Projects/App/Sources/Application/AppComponent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ final class AppComponent: Component<EmptyDependency>, RootDependency {
}
}

var weatherRepository: WeatherRepositoryInterface {
shared {
let service = makeWeatherService()
return WeatherRepository(service: service)
}
}

var homeUsecase: HomeUsecaseProtocol {
shared {
HomeUsecase(
Expand Down
16 changes: 16 additions & 0 deletions Projects/Data/Sources/DI/WeatherServiceFactory.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// WeatherServiceFactory.swift
// Data
//
// Created by kimnahun on 2026-02-21.
// Copyright Β© 2026 NDGL-iOS. All rights reserved.
//

import Foundation
import Networks
import Moya

public func makeWeatherService() -> WeatherServiceProtocol {
let provider = MoyaProvider<WeatherAPI>()
return WeatherService(provider: provider)
}
36 changes: 36 additions & 0 deletions Projects/Data/Sources/Repository/Weather/WeatherRepository.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// WeatherRepository.swift
// Data
//
// Created by kimnahun on 2026-02-21.
// Copyright Β© 2026 NDGL-iOS. All rights reserved.
//

import Foundation
import Domain
import Networks

public final class WeatherRepository: WeatherRepositoryInterface {
private let service: WeatherServiceProtocol

public init(service: WeatherServiceProtocol) {
self.service = service
}

public func fetchForecast(
latitude: Double,
longitude: Double,
days: Int
) async throws -> [DailyWeatherInfo] {
do {
let response = try await service.getForecast(
latitude: latitude,
longitude: longitude,
days: days
)
return response.forecastDays.compactMap { $0.toDomain() }
} catch {
throw error.toNDGLError()
}
}
}
6 changes: 5 additions & 1 deletion Projects/Data/Sources/Transform/UserTravelTransform.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ extension UpcomingResponse {
return .init(
id: self.userTravelId,
title: self.title,
city: self.city,
country: self.country,
startDay: self.startDate.toDate() ?? .now,
endDay: self.endDate.toDate() ?? .now,
tripSchedule: .init(
Expand All @@ -25,7 +27,9 @@ extension UpcomingResponse {
placeName: self.upcomingUserTravelPlace.place.name,
thumbnailUrl: self.upcomingUserTravelPlace.place.thumbnail ?? "",
transport: self.upcomingUserTravelPlace.place.category,
estimatedDuration: self.upcomingUserTravelPlace.estimatedDuration
estimatedDuration: self.upcomingUserTravelPlace.estimatedDuration,
latitude: self.upcomingUserTravelPlace.place.latitude,
longitude: self.upcomingUserTravelPlace.place.longitude
)
)
}
Expand Down
29 changes: 29 additions & 0 deletions Projects/Data/Sources/Transform/WeatherTransform.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// WeatherTransform.swift
// Data
//
// Created by kimnahun on 2026-02-21.
// Copyright Β© 2026 NDGL-iOS. All rights reserved.
//

import Foundation
import Domain
import Networks

extension ForecastDayResponse {
func toDomain() -> DailyWeatherInfo? {
var components = DateComponents()
components.year = displayDate.year
components.month = displayDate.month
components.day = displayDate.day

guard let date = Calendar.current.date(from: components) else { return nil }
Comment on lines +15 to +20
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 | 🟑 Minor

🧩 Analysis chain

🏁 Script executed:

find . -type f -name "*.swift" | grep -E "(Weather|Travel)" | head -20

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 1449


🏁 Script executed:

fd -e swift | grep -i "weather"

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 649


🏁 Script executed:

fd -e swift | grep -i "travel"

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 3939


🏁 Script executed:

cat -n Projects/Data/Sources/Transform/WeatherTransform.swift

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 1063


🏁 Script executed:

cat -n Projects/Data/Sources/Transform/UserTravelTransform.swift

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 1935


🏁 Script executed:

rg -n "displayDate" Projects/Data/Sources/Transform/WeatherTransform.swift

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 212


🏁 Script executed:

rg -n "ForecastDayResponse" Projects/Modules/Networks/Sources/DTO/Weather/ -A 15

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 1956


🏁 Script executed:

rg -n "timezone\|TimeZone\|GMT" Projects/Data/Sources/Transform/ Projects/Modules/Networks/Sources/DTO/

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 57


암묡적 νƒ€μž„μ‘΄ 처리둜 μΈν•œ μœ μ§€λ³΄μˆ˜ μœ„ν—˜

WeatherTransform의 Calendar.current.date(from: components)와 UserTravelTransform의 DateFormatter(timezone λ―Έμ§€μ •)λŠ” λͺ¨λ‘ 기기의 둜컬 νƒ€μž„μ‘΄μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ›λž˜ μ§€μ ν•œ UTC vs 둜컬 νƒ€μž„μ‘΄ λΆˆμΌμΉ˜λŠ” λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€λ§Œ 더 μ‹¬κ°ν•œ λ¬Έμ œλŠ” νƒ€μž„μ‘΄μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•Šμ€ 암묡적 μ²˜λ¦¬μž…λ‹ˆλ‹€:

  • DateFormatter의 timezone 속성 λ―Έμ„€μ • β†’ κΈ°κΈ° 섀정에 의쑴
  • Calendar.current β†’ κΈ°κΈ° 둜컬 νƒ€μž„μ‘΄μ— 의쑴
  • μ½”λ“œλ§ŒμœΌλ‘œλŠ” μ–΄λ–€ νƒ€μž„μ‘΄μ΄ μ‚¬μš©λ˜λŠ”μ§€ 뢈λͺ…ν™•

μœ μ§€λ³΄μˆ˜ μ‹œ κ°œλ°œμžκ°€ UTC, μ„œλ²„ νƒ€μž„μ‘΄ 등을 κ°€μ •ν•  수 있으며, κΈ°κΈ° μ„€μ • λ³€κ²½ μ‹œ μ˜ˆμƒ μ™Έ λ™μž‘ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

formatter.timeZone = TimeZone(abbreviation: "UTC") λ˜λŠ” components.timeZone = TimeZone(secondsFromGMT: 0)으둜 νƒ€μž„μ‘΄μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ—¬ μ˜λ„λ₯Ό λͺ…ν™•νžˆ ν•˜μ„Έμš”.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Projects/Data/Sources/Transform/WeatherTransform.swift` around lines 15 - 20,
The code in WeatherTransform uses Calendar.current.date(from: components)
without an explicit time zone, and elsewhere DateFormatter is used without
setting timezone, which makes the code implicitly depend on the device locale
and risks incorrect date calculations; update WeatherTransform to set
components.timeZone (e.g., TimeZone(secondsFromGMT: 0) or the intended TZ)
before calling Calendar.current.date(from:), and ensure any DateFormatter
instances (e.g., in UserTravelTransform) explicitly set formatter.timeZone to
the same intended zone so the intent is clear and consistent across
WeatherTransform and related formatting code.


return DailyWeatherInfo(
date: date,
maxTemperature: maxTemperature?.degrees ?? 0,
minTemperature: minTemperature?.degrees ?? 0,
Comment on lines +24 to +25
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 | 🟑 Minor

μ˜¨λ„ nil μ‹œ 0 κΈ°λ³Έκ°’ μ‚¬μš© β€” μ˜€ν•΄ μ†Œμ§€ 있음

maxTemperature?.degrees ?? 0 / minTemperature?.degrees ?? 0μ—μ„œ 0은 μ‹€μ œ μœ νš¨ν•œ μ˜¨λ„κ°’(0Β°C)μ΄λ―€λ‘œ, APIκ°€ μ˜¨λ„ 데이터λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šμ€ κ²½μš°μ™€ μ‹€μ œ 0Β°Cλ₯Ό ꡬ뢄할 수 μ—†μŠ΅λ‹ˆλ‹€. μ‚¬μš©μžμ—κ²Œ "0Β°C"둜 ν‘œμ‹œλ˜μ–΄ ν˜Όλ™μ„ 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ›‘οΈ Double.nan λ˜λŠ” 별도 sentinel μ‚¬μš© μ œμ•ˆ

도메인 λͺ¨λΈ(DailyWeatherInfo)의 μ˜¨λ„ ν•„λ“œλ₯Ό Double?둜 λ°”κΎΈκ±°λ‚˜, ν‘œμ‹œ λ ˆμ΄μ–΄μ—μ„œ nil을 "–"둜 λ Œλ”λ§ν•˜λŠ” 방법을 κ³ λ €ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Projects/Data/Sources/Transform/WeatherTransform.swift` around lines 24 - 25,
The mapping in WeatherTransform currently uses maxTemperature?.degrees ?? 0 and
minTemperature?.degrees ?? 0 which collapses missing data into a valid 0Β°C
value; change the transform so it preserves nil when the source is missing
(e.g., map to Optional Double by using maxTemperature?.degrees and
minTemperature?.degrees without the ?? 0) and then update the domain model
DailyWeatherInfo temperature fields to be Double? (or use Double.nan
consistently as a sentinel) and ensure the presentation layer renders nil (or
Double.nan) as a placeholder (e.g., "–") rather than "0Β°C".

weatherType: daytimeForecast?.weatherCondition.type ?? "CLOUDY"
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// WeatherRepositoryInterface.swift
// Domain
//
// Created by kimnahun on 2026-02-21.
// Copyright Β© 2026 NDGL-iOS. All rights reserved.
//

import Foundation

public protocol WeatherRepositoryInterface {
func fetchForecast(
latitude: Double,
longitude: Double,
days: Int
) async throws -> [DailyWeatherInfo]
}
18 changes: 14 additions & 4 deletions Projects/Domain/Sources/Model/Home/MyTripSummary.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,17 @@ import Foundation
public struct MyTripSummary {
public let id: Int
public let title: String
public let city: String
public let country: String
public let startDay: Date
public let endDay: Date
public let tripSchedule: Schedule
public init(id: Int, title: String, startDay: Date, endDay: Date, tripSchedule: Schedule) {

public init(id: Int, title: String, city: String, country: String, startDay: Date, endDay: Date, tripSchedule: Schedule) {
self.id = id
self.title = title
self.city = city
self.country = country
self.startDay = startDay
self.endDay = endDay
self.tripSchedule = tripSchedule
Expand All @@ -33,20 +37,26 @@ public struct Schedule {
public let thumbnailUrl: String
public let transport: String
public let estimatedDuration: Int

public let latitude: Double
public let longitude: Double

public init(
id: Int,
day: Int,
placeName: String,
thumbnailUrl: String,
transport: String,
estimatedDuration: Int
estimatedDuration: Int,
latitude: Double,
longitude: Double
) {
self.id = id
self.day = day
self.placeName = placeName
self.thumbnailUrl = thumbnailUrl
self.transport = transport
self.estimatedDuration = estimatedDuration
self.latitude = latitude
self.longitude = longitude
}
}
28 changes: 28 additions & 0 deletions Projects/Domain/Sources/Model/Weather/WeatherInfo.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// WeatherInfo.swift
// Domain
//
// Created by kimnahun on 2026-02-21.
// Copyright Β© 2026 NDGL-iOS. All rights reserved.
//

import Foundation

public struct DailyWeatherInfo {
public let date: Date
public let maxTemperature: Double
public let minTemperature: Double
public let weatherType: String

public init(
date: Date,
maxTemperature: Double,
minTemperature: Double,
weatherType: String
) {
self.date = date
self.maxTemperature = maxTemperature
self.minTemperature = minTemperature
self.weatherType = weatherType
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import RxSwift

public protocol FollowDetailListener: AnyObject {
func detachFollowDetail()
func followDetailDidAddTrip(title: String, startDate: Date, endDate: Date)
func followDetailDidViewTrip()
}

// MARK: - FollowDetailPresentable
Expand All @@ -28,6 +28,7 @@ protocol FollowDetailPresentable: Presentable {
func updateTravelDetail(_ detail: TravelDetail)
func updatePlaces(_ places: [TravelPlace])
func showPlaceDetail(_ place: TravelPlace)
func showTripCreatedModal(onLater: @escaping () -> Void, onViewTrip: @escaping () -> Void)
}

// MARK: - FollowDetailPresentableListener
Expand Down Expand Up @@ -192,16 +193,24 @@ extension FollowDetailInteractor: TripCalendarListener {
await MainActor.run {
presenter.showLoading()
}

do {
let response = try await followDetailUsecase.createUserTravel(request: request)

await MainActor.run {

await MainActor.run { [weak self] in
guard let self else { return }
presenter.hideLoading()
router?.detachTripCalendar()

let tripTitle = "\(travelDetail?.city ?? "μƒˆλ‘œμš΄") μ—¬ν–‰"
listener?.followDetailDidAddTrip(title: tripTitle, startDate: startDate, endDate: endDate)

presenter.showTripCreatedModal(
onLater: { [weak self] in
self?.router?.detachTripCalendar()
self?.listener?.detachFollowDetail()
},
onViewTrip: { [weak self] in
self?.router?.detachTripCalendar()
self?.listener?.followDetailDidViewTrip()
}
)
Comment on lines +200 to +213
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 | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

find . -type f -name "*NDGLModal*" -o -name "*FollowDetailInteractor*" | head -20

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 218


🏁 Script executed:

cat -n Projects/Features/FollowFeature/Sources/FollowDetailInteractor.swift | sed -n '195,230p'

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 1676


🏁 Script executed:

cat -n Projects/Modules/DSKit/Sources/Component/NDGLModalViewController.swift

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 8140


🏁 Script executed:

cat -n Projects/Features/FollowFeature/Sources/FollowDetailInteractor.swift | sed -n '226,240p'

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 658


NDGLModalViewController의 μ‹œμŠ€ν…œ μŠ€μ™€μ΄ν”„ ν•΄μ œ μ‹œ RIB 뢄리 미처리 문제

NDGLModalViewControllerλŠ” modalPresentationStyle = .overFullScreen으둜 μ„€μ •λ˜μ–΄ 있으며 isModalInPresentation을 λ³„λ„λ‘œ μ„€μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(line 83-84). 이둜 인해 μ‚¬μš©μžκ°€ λͺ¨λ‹¬μ„ μ•„λž˜λ‘œ μŠ€μ™€μ΄ν”„ν•˜μ—¬ 닫을 수 있으며, 이 경우 onCancelTapped, onActionTapped μ–΄λŠ ν΄λ‘œμ €λ„ ν˜ΈμΆœλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. dimViewTapped λ©”μ„œλ“œ(line 213-217)λŠ” νƒ­ 제슀처만 μ²˜λ¦¬ν•˜κ³  μ‹œμŠ€ν…œ μŠ€μ™€μ΄ν”„ μ œμŠ€μ²˜λŠ” μ²˜λ¦¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

결과적으둜:

  • router?.detachTripCalendar()κ°€ μ‹€ν–‰λ˜μ§€ μ•ŠμŒ
  • tripCalendarRouterκ°€ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆλŠ” RIB λˆ„μˆ˜ λ°œμƒ
  • 후속 μ—¬ν–‰ 생성 μ‹œ μ˜ˆμƒμΉ˜ λͺ»ν•œ μƒνƒœ 문제 κ°€λŠ₯

ν•΄κ²°λ°©μ•ˆ:

  1. NDGLModalViewControllerμ—μ„œ isModalInPresentation = true μ„€μ •ν•˜κ±°λ‚˜
  2. UIAdaptivePresentationControllerDelegate의 presentationControllerDidDismiss λ©”μ„œλ“œλ‘œ λͺ¨λ“  ν•΄μ œ κ²½λ‘œμ—μ„œ ν΄λ‘œμ € μ‹€ν–‰

λ˜ν•œ 라인 214의 print("μ—¬ν–‰ 생성 성곡 - userTravelId: \(response.userTravelId)") 디버그 λ‘œκ·ΈλŠ” μ œκ±°ν•˜μ„Έμš”.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Projects/Features/FollowFeature/Sources/FollowDetailInteractor.swift` around
lines 200 - 213, NDGLModalViewController currently allows system
swipe-to-dismiss so onLater/onViewTrip closures (triggered in
FollowDetailInteractor via presenter.showTripCreatedModal) are not always
called; fix by either setting isModalInPresentation = true in
NDGLModalViewController (around init/config where modalPresentationStyle =
.overFullScreen is set) or implement UIAdaptivePresentationControllerDelegate
(add presentationControllerDidDismiss(_:)) to invoke the same dismissal handling
that dimViewTapped/onCancelTapped/onActionTapped would (call the
onLater/onViewTrip handlers or directly call router?.detachTripCalendar() and
listener?.detachFollowDetail()/listener?.followDetailDidViewTrip() as
appropriate). Also remove the debug print("μ—¬ν–‰ 생성 성곡 - userTravelId:
\(response.userTravelId)") from the trip-creation success path so no stray logs
remain.

print("μ—¬ν–‰ 생성 성곡 - userTravelId: \(response.userTravelId)")
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 | 🟑 Minor

디버그 print ꡬ문 제거 ν•„μš”

print("μ—¬ν–‰ 생성 성곡 - userTravelId: \(response.userTravelId)")λŠ” ν”„λ‘œλ•μ…˜ 둜그둜 μ ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ œκ±°ν•˜κ±°λ‚˜ κ΅¬μ‘°ν™”λœ 둜거둜 κ΅μ²΄ν•˜μ„Έμš”.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Projects/Features/FollowFeature/Sources/FollowDetailInteractor.swift` at line
214, Remove the debug print statement that logs "μ—¬ν–‰ 생성 성곡 - userTravelId:
\(response.userTravelId)" in FollowDetailInteractor (the response handling code
where response.userTravelId is used) and either delete it or replace it with a
structured logging call (e.g., use the app's logger/info method) so production
logging is consistent and not using print; ensure the replacement uses the same
context (userTravelId) and log level appropriate for success messages.

}
} catch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ final class FollowDetailViewController: UIViewController, FollowDetailPresentabl
// MARK: - UI Components (Scroll)
private let navigationBar = NDGLNavigationBar(
style: .gray,
leadingIcon: DSKitAsset.Assets.icChevronLeft3.image,
trailingIcon: DSKitAsset.Assets.icShare1.image
leadingIcon: DSKitAsset.Assets.icChevronLeft3.image
)

private let scrollView = UIScrollView().then {
Expand Down Expand Up @@ -255,6 +254,18 @@ extension FollowDetailViewController {
}
}

func showTripCreatedModal(onLater: @escaping () -> Void, onViewTrip: @escaping () -> Void) {
let modal = NDGLModalViewController(
title: "여행이 μ€€λΉ„λμ–΄μš”",
subtitle: "이제 μ„ νƒν•œ 여행을\nκ·ΈλŒ€λ‘œ λ”°λΌκ°ˆ 수 μžˆμ–΄μš”.",
cancelButtonTitle: "λ‚˜μ€‘μ— λ³΄λŸ¬κ°€κΈ°",
actionButtonTitle: "μ—¬ν–‰ λ³΄λŸ¬κ°€κΈ°"
)
modal.onCancelTapped = onLater
modal.onActionTapped = onViewTrip
present(modal, animated: true)
}

func showPlaceDetail(_ place: TravelPlace) {
let contentView = PlaceDetailBottomSheetView()
contentView.configure(with: place)
Expand Down
Loading