diff --git a/V2er/State/DataFlow/Actions/FeedDetailActions.swift b/V2er/State/DataFlow/Actions/FeedDetailActions.swift index d7ca745..c339515 100644 --- a/V2er/State/DataFlow/Actions/FeedDetailActions.swift +++ b/V2er/State/DataFlow/Actions/FeedDetailActions.swift @@ -383,4 +383,10 @@ struct FeedDetailActions { let success: Bool } + struct ReplyToUser: Action { + var target: Reducer = R + var id: String + var userName: String + } + } diff --git a/V2er/State/DataFlow/State/FeedDetailState.swift b/V2er/State/DataFlow/State/FeedDetailState.swift index b8000a6..f4e747a 100644 --- a/V2er/State/DataFlow/State/FeedDetailState.swift +++ b/V2er/State/DataFlow/State/FeedDetailState.swift @@ -40,6 +40,7 @@ struct FeedDetailState: FluxState { var ignored: Bool = false var replyContent: String = .empty var replySortType: ReplySortType = .byTime + var shouldFocusReply: Bool = false } typealias FeedDetailStates=[String : FeedDetailState] diff --git a/V2er/View/FeedDetail/FeedDetailPage.swift b/V2er/View/FeedDetail/FeedDetailPage.swift index 009d3af..db77c97 100644 --- a/V2er/View/FeedDetail/FeedDetailPage.swift +++ b/V2er/View/FeedDetail/FeedDetailPage.swift @@ -134,6 +134,12 @@ struct FeedDetailPage: StateView, KeyboardReadable, InstanceIdentifiable { dismiss() } } + .onChange(of: state.shouldFocusReply) { shouldFocus in + if shouldFocus { + replyIsFocused = true + store.appState.feedDetailStates[instanceId]?.shouldFocusReply = false + } + } .onAppear { dispatch(FeedDetailActions.FetchData.Start(id: instanceId, feedId: initData?.id, autoLoad: !state.hasLoadedOnce)) } diff --git a/V2er/View/FeedDetail/FeedDetailReducer.swift b/V2er/View/FeedDetail/FeedDetailReducer.swift index cbee755..f5d5084 100644 --- a/V2er/View/FeedDetail/FeedDetailReducer.swift +++ b/V2er/View/FeedDetail/FeedDetailReducer.swift @@ -117,6 +117,9 @@ func feedDetailStateReducer(_ states: FeedDetailStates, _ action: Action) -> (Fe } else { Toast.show("感谢发送失败") } + case let action as FeedDetailActions.ReplyToUser: + state.replyContent = "@\(action.userName) " + state.shouldFocusReply = true default: break; } diff --git a/V2er/View/FeedDetail/ReplyItemView.swift b/V2er/View/FeedDetail/ReplyItemView.swift index 9a63b96..9fd5dcc 100644 --- a/V2er/View/FeedDetail/ReplyItemView.swift +++ b/V2er/View/FeedDetail/ReplyItemView.swift @@ -83,6 +83,14 @@ struct ReplyItemView: View { } } .padding(.horizontal, 12) + .contentShape(Rectangle()) + .contextMenu { + Button { + dispatch(FeedDetailActions.ReplyToUser(id: topicId, userName: info.userName)) + } label: { + Label("回复", systemImage: "arrowshape.turn.up.left") + } + } .sheet(isPresented: $showingSafari) { if let url = safariURL { SafariView(url: url)