Skip to content

Instantly share code, notes, and snippets.

@lhoward
Last active October 31, 2020 22:41
Show Gist options
  • Select an option

  • Save lhoward/29079e80ec79c2d7fe458db0aeb8c2a5 to your computer and use it in GitHub Desktop.

Select an option

Save lhoward/29079e80ec79c2d7fe458db0aeb8c2a5 to your computer and use it in GitHub Desktop.
private struct ReselectTabViewModifier: ViewModifier {
@Environment(\.didReselectTab) private var didReselectTab
let visibleAction: (() -> Void)
let hiddenAction: (() -> Void)?
@State var isVisible = false
init(ifVisible visibleAction: @escaping (() -> Void),
else hiddenAction: (() -> Void)?) {
self.visibleAction = visibleAction
self.hiddenAction = hiddenAction
}
func body(content: Content) -> some View {
content
.isVisible(self.$isVisible)
.onReceive(didReselectTab.receive(on: RunLoop.main)) { _ in
if self.isVisible {
self.visibleAction()
} else if let hiddenAction = self.hiddenAction {
hiddenAction()
}
}
}
}
extension View {
public func onReselect(ifVisible visibleAction: @escaping (() -> Void),
else hiddenAction: (() -> Void)? = nil) -> some View {
return self.modifier(ReselectTabViewModifier(ifVisible: visibleAction, else: hiddenAction))
}
}
extension EnvironmentValues {
struct DidReselectTabKey: EnvironmentKey {
static let defaultValue: AnyPublisher<TabSelection, Never> = Empty<TabSelection, Never>().eraseToAnyPublisher()
}
var didReselectTab: AnyPublisher<TabSelection, Never> {
get {
return self[DidReselectTabKey.self]
}
set {
self[DidReselectTabKey.self] = newValue
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment