diff --git a/yana/Features/CreateFeedFeature.swift b/yana/Features/CreateFeedFeature.swift index e25806f..afd4456 100644 --- a/yana/Features/CreateFeedFeature.swift +++ b/yana/Features/CreateFeedFeature.swift @@ -83,9 +83,7 @@ struct CreateFeedFeature { newImages.append(image) } } - await MainActor.run { - send(.updateProcessedImages(newImages)) - } + await send(.updateProcessedImages(newImages)) } case .updateProcessedImages(let images): @@ -239,17 +237,26 @@ struct CreateFeedFeature { return .none case .dismissView: - guard isPresented else { - return .none - } + // 始终发送通知,让外层处理关闭逻辑 return .run { _ in - await dismiss() + await MainActor.run { + NotificationCenter.default.post(name: .init("CreateFeedDismiss"), object: nil) + } } case .publishSuccess: - // 发送通知给外层刷新列表 - return .run { _ in - NotificationCenter.default.post(name: .init("CreateFeedPublishSuccess"), object: nil) - } + // 发送通知给外层刷新列表和关闭页面 + return .merge( + .run { _ in + await MainActor.run { + NotificationCenter.default.post(name: .init("CreateFeedPublishSuccess"), object: nil) + } + }, + .run { _ in + await MainActor.run { + NotificationCenter.default.post(name: .init("CreateFeedDismiss"), object: nil) + } + } + ) } } } diff --git a/yana/Features/FeedListFeature.swift b/yana/Features/FeedListFeature.swift index 43f48da..3fa6feb 100644 --- a/yana/Features/FeedListFeature.swift +++ b/yana/Features/FeedListFeature.swift @@ -145,8 +145,11 @@ struct FeedListFeature { state.isEditFeedPresented = false return .none case .createFeedPublishSuccess: - // CreateFeed发布成功,触发刷新 - return .send(.reload) + // CreateFeed发布成功,触发刷新并关闭编辑页面 + return .merge( + .send(.reload), + .send(.editFeedDismissed) + ) case .testButtonTapped: debugInfoSync("[LOG] FeedListFeature testButtonTapped") return .none diff --git a/yana/Views/CreateFeedView.swift b/yana/Views/CreateFeedView.swift index d93dc3b..e0faf39 100644 --- a/yana/Views/CreateFeedView.swift +++ b/yana/Views/CreateFeedView.swift @@ -8,106 +8,111 @@ struct CreateFeedView: View { @FocusState private var isTextEditorFocused: Bool var body: some View { - WithPerceptionTracking { - NavigationStack { - GeometryReader { geometry in - VStack(spacing: 0) { - ZStack { - // 背景色 - Color(hex: 0x0C0527) - .ignoresSafeArea() - - // 主要内容区域 - VStack(spacing: 20) { - ContentInputSection(store: store, isFocused: $isTextEditorFocused) - ImageSelectionSection(store: store) - LoadingAndErrorSection(store: store) - Spacer() - } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - .ignoresSafeArea(.keyboard, edges: .bottom) - .background(Color(hex: 0x0C0527)) - } + NavigationStack { + GeometryReader { geometry in + VStack(spacing: 0) { + ZStack { + // 背景色 + Color(hex: 0x0C0527) + .ignoresSafeArea() - // 底部发布按钮 - 只在键盘隐藏时显示 - if !isKeyboardVisible { - PublishButtonSection(store: store, geometry: geometry, isFocused: $isTextEditorFocused) - } - } - .onTapGesture { - isTextEditorFocused = false // 点击空白处收起键盘 - } - } - .navigationTitle(NSLocalizedString("createFeed.title", comment: "Image & Text Publish")) - .navigationBarTitleDisplayMode(.inline) - .toolbarBackground(.hidden, for: .navigationBar) - .navigationBarBackButtonHidden(true) - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - Button(action: { - store.send(.dismissView) - }) { - Image(systemName: "xmark") - .font(.system(size: 18, weight: .medium)) - .foregroundColor(.white) + // 主要内容区域 + VStack(spacing: 20) { + ContentInputSection(store: store, isFocused: $isTextEditorFocused) + ImageSelectionSection(store: store) + LoadingAndErrorSection(store: store) + Spacer() } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .ignoresSafeArea(.keyboard, edges: .bottom) + .background(Color(hex: 0x0C0527)) } - ToolbarItem(placement: .principal) { - Text(NSLocalizedString("createFeed.title", comment: "Image & Text Publish")) + // 底部发布按钮 - 只在键盘隐藏时显示 + if !isKeyboardVisible { + PublishButtonSection(store: store, geometry: geometry, isFocused: $isTextEditorFocused) + } + } + .onTapGesture { + isTextEditorFocused = false // 点击空白处收起键盘 + } + } + .navigationTitle(NSLocalizedString("createFeed.title", comment: "Image & Text Publish")) + .navigationBarTitleDisplayMode(.inline) + .toolbarBackground(.hidden, for: .navigationBar) + .navigationBarBackButtonHidden(true) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + Button(action: { + store.send(.dismissView) + }) { + Image(systemName: "xmark") .font(.system(size: 18, weight: .medium)) .foregroundColor(.white) } - - // 右上角发布按钮 - 只在键盘显示时出现 - ToolbarItem(placement: .navigationBarTrailing) { - if isKeyboardVisible { - Button(action: { - isTextEditorFocused = false // 收起键盘 - store.send(.publishButtonTapped) - }) { - HStack(spacing: 4) { - if store.isLoading || store.isUploadingImages { - ProgressView() - .progressViewStyle(CircularProgressViewStyle(tint: .white)) - .scaleEffect(0.7) - } - Text(toolbarButtonText) - .font(.system(size: 14, weight: .medium)) - .foregroundColor(.white) + } + + ToolbarItem(placement: .principal) { + Text(NSLocalizedString("createFeed.title", comment: "Image & Text Publish")) + .font(.system(size: 18, weight: .medium)) + .foregroundColor(.white) + } + + // 右上角发布按钮 - 只在键盘显示时出现 + ToolbarItem(placement: .navigationBarTrailing) { + if isKeyboardVisible { + Button(action: { + isTextEditorFocused = false // 收起键盘 + store.send(.publishButtonTapped) + }) { + HStack(spacing: 4) { + if store.isLoading || store.isUploadingImages { + ProgressView() + .progressViewStyle(CircularProgressViewStyle(tint: .white)) + .scaleEffect(0.7) } - .padding(.horizontal, 12) - .padding(.vertical, 8) - .background( - LinearGradient( - gradient: Gradient(colors: [ - Color(hex: 0xF854FC), - Color(hex: 0x500FFF) - ]), - startPoint: .leading, - endPoint: .trailing - ) - ) - .cornerRadius(16) + Text(toolbarButtonText) + .font(.system(size: 14, weight: .medium)) + .foregroundColor(.white) } - .disabled(store.isLoading || store.isUploadingImages || !store.canPublish) - .opacity(toolbarButtonOpacity) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + LinearGradient( + gradient: Gradient(colors: [ + Color(hex: 0xF854FC), + Color(hex: 0x500FFF) + ]), + startPoint: .leading, + endPoint: .trailing + ) + ) + .cornerRadius(16) } + .disabled(store.isLoading || store.isUploadingImages || !store.canPublish) + .opacity(toolbarButtonOpacity) } } } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)) { notification in - if let _ = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect { + } + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)) { notification in + if let _ = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect { + DispatchQueue.main.async { isKeyboardVisible = true } } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)) { _ in - isKeyboardVisible = false - } - .onDisappear { + } + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)) { _ in + DispatchQueue.main.async { isKeyboardVisible = false } } + .onReceive(NotificationCenter.default.publisher(for: .init("CreateFeedDismiss"))) { _ in + store.send(.dismissView) + } + .onDisappear { + isKeyboardVisible = false + } } // MARK: - 工具栏按钮计算属性 diff --git a/yana/Views/FeedListView.swift b/yana/Views/FeedListView.swift index 65b9fc9..b132dbf 100644 --- a/yana/Views/FeedListView.swift +++ b/yana/Views/FeedListView.swift @@ -255,16 +255,19 @@ struct FeedListView: View { } // 新增:编辑动态页面 .sheet(isPresented: viewStore.binding(get: \.isEditFeedPresented, send: { _ in .editFeedDismissed })) { - CreateFeedView( - store: Store( - initialState: CreateFeedFeature.State() - ) { - CreateFeedFeature() - } - ) - .onReceive(NotificationCenter.default.publisher(for: .init("CreateFeedPublishSuccess"))) { _ in - store.send(.createFeedPublishSuccess) + let createFeedStore = Store( + initialState: CreateFeedFeature.State() + ) { + CreateFeedFeature() } + + CreateFeedView(store: createFeedStore) + .onReceive(NotificationCenter.default.publisher(for: .init("CreateFeedPublishSuccess"))) { _ in + store.send(.createFeedPublishSuccess) + } + .onReceive(NotificationCenter.default.publisher(for: .init("CreateFeedDismiss"))) { _ in + store.send(.editFeedDismissed) + } } // 新增:详情页导航 .navigationDestination(isPresented: viewStore.binding(get: \.showDetail, send: { _ in .detailDismissed })) {