feat: 新增导航功能与设置页面支持

- 在MainFeature中新增导航路径和设置页面状态管理,支持页面导航。
- 更新MainView以集成导航功能,添加测试按钮以触发导航。
- 在MeFeature中新增设置按钮点击事件,交由MainFeature处理。
- 增强MeView以支持设置按钮,提升用户体验。
This commit is contained in:
edwinQQQ
2025-07-23 20:10:37 +08:00
parent 772543243f
commit bb49b00a59
4 changed files with 124 additions and 18 deletions

View File

@@ -12,6 +12,15 @@ struct MainFeature: Reducer {
var feedList: FeedListFeature.State = .init()
var me: MeFeature.State = .init()
var accountModel: AccountModel? = nil
// State
var navigationPath: [Destination] = []
var settingState: SettingFeature.State? = nil
}
//
enum Destination: Hashable, Equatable {
case setting
case test
}
@CasePathable
@@ -21,6 +30,11 @@ struct MainFeature: Reducer {
case feedList(FeedListFeature.Action)
case me(MeFeature.Action)
case accountModelLoaded(AccountModel?)
//
case navigationPathChanged([Destination])
case settingButtonTapped
case settingAction(SettingFeature.Action)
case testButtonTapped
}
var body: some ReducerOf<Self> {
@@ -39,6 +53,7 @@ struct MainFeature: Reducer {
}
case .selectTab(let tab):
state.selectedTab = tab
state.navigationPath = []
if tab == .other, let uidStr = state.accountModel?.uid, let uid = Int(uidStr), uid > 0 {
state.me = MeFeature.State(uid: uid)
return .send(.me(.onAppear))
@@ -49,9 +64,34 @@ struct MainFeature: Reducer {
case let .accountModelLoaded(accountModel):
state.accountModel = accountModel
return .none
case .me(.settingButtonTapped):
// push
state.settingState = SettingFeature.State()
state.navigationPath.append(.setting)
return .none
case .me:
return .none
case .navigationPathChanged(let newPath):
// pop settingState
if !newPath.contains(.setting) {
state.settingState = nil
}
state.navigationPath = newPath
return .none
case .settingButtonTapped:
state.settingState = SettingFeature.State()
state.navigationPath.append(.setting)
return .none
case .settingAction:
return .none
case .testButtonTapped:
state.navigationPath.append(.test)
return .none
}
}
//
.ifLet(\ .settingState, action: /Action.settingAction) {
SettingFeature()
}
}
}