feat: 更新AppSettingFeature和MainFeature以支持登出功能
- 在AppSettingFeature中实现登出逻辑,清理认证信息并发送登出事件。 - 在MainFeature中新增登出标志和相应的状态管理,确保用户登出后状态更新。 - 更新MainView以响应登出事件,重命名内部视图为InternalMainView以提高可读性。 - 在SplashView中集成登出处理,确保用户能够顺利返回登录页面。
This commit is contained in:
@@ -50,8 +50,12 @@ struct AppSettingFeature {
|
||||
return .none
|
||||
|
||||
case .logoutTapped:
|
||||
// 预留登出逻辑
|
||||
return .none
|
||||
// 清理所有认证信息,并向上层发送登出事件
|
||||
return .run { send in
|
||||
await UserInfoManager.clearAllAuthenticationData()
|
||||
// 向上层Feature传递登出事件(需在MainFeature处理)
|
||||
// 这里直接返回.none,由MainFeature监听AppSettingFeature.Action.logoutTapped后处理
|
||||
}
|
||||
|
||||
case .loadUserInfo:
|
||||
state.isLoadingUserInfo = true
|
||||
|
@@ -16,6 +16,8 @@ struct MainFeature: Reducer {
|
||||
var navigationPath: [Destination] = []
|
||||
var settingState: SettingFeature.State? = nil
|
||||
var appSettingState: AppSettingFeature.State? = nil
|
||||
// 新增:登出标志
|
||||
var isLoggedOut: Bool = false
|
||||
}
|
||||
|
||||
// 新增:导航目标
|
||||
@@ -39,6 +41,8 @@ struct MainFeature: Reducer {
|
||||
case testButtonTapped
|
||||
case appSettingButtonTapped
|
||||
case appSettingAction(AppSettingFeature.Action)
|
||||
// 新增:登出
|
||||
case logout
|
||||
}
|
||||
|
||||
var body: some ReducerOf<Self> {
|
||||
@@ -101,8 +105,15 @@ struct MainFeature: Reducer {
|
||||
state.appSettingState = AppSettingFeature.State()
|
||||
state.navigationPath.append(.appSetting)
|
||||
return .none
|
||||
case .appSettingAction(.logoutTapped):
|
||||
// 监听到登出,设置登出标志
|
||||
state.isLoggedOut = true
|
||||
return .none
|
||||
case .appSettingAction:
|
||||
return .none
|
||||
case .logout:
|
||||
// 由上层(SplashView/SplashFeature)监听,切换到登录页
|
||||
return .none
|
||||
}
|
||||
}
|
||||
// 设置页作用域
|
||||
|
@@ -3,7 +3,23 @@ import ComposableArchitecture
|
||||
|
||||
struct MainView: View {
|
||||
let store: StoreOf<MainFeature>
|
||||
|
||||
var onLogout: (() -> Void)? = nil
|
||||
|
||||
var body: some View {
|
||||
WithViewStore(self.store, observe: { $0 }) { viewStore in
|
||||
InternalMainView(store: store)
|
||||
.onChange(of: viewStore.isLoggedOut) { isLoggedOut in
|
||||
if isLoggedOut {
|
||||
onLogout?()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 原 MainView 内容,重命名为 InternalMainView
|
||||
struct InternalMainView: View {
|
||||
let store: StoreOf<MainFeature>
|
||||
var body: some View {
|
||||
WithViewStore(self.store, observe: { $0 }) { viewStore in
|
||||
NavigationStack(path: viewStore.binding(get: \.navigationPath, send: MainFeature.Action.navigationPathChanged)) {
|
||||
|
@@ -30,6 +30,9 @@ struct SplashView: View {
|
||||
initialState: MainFeature.State()
|
||||
) {
|
||||
MainFeature()
|
||||
},
|
||||
onLogout: {
|
||||
store.send(.navigateToLogin)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
Reference in New Issue
Block a user