refactor DataStore

This commit is contained in:
Martin Barreto 2021-07-28 12:12:34 -03:00
parent 97a429ac9c
commit 7f1df180bb
4 changed files with 17 additions and 18 deletions

View File

@ -21,27 +21,27 @@ class DataItem {
}
class DataStore: ObservableObject {
var items = CurrentValueSubject<[Int: DataItem], Never>([:])
@Published var items = [Int: DataItem]()
func setView(_ view: AnyView, tabViewDelegate: PagerTabViewDelegate? = nil, at index: Int) {
if let item = items.value[index] {
if let item = items[index] {
item.view = view
item.tabViewDelegate = tabViewDelegate
} else {
items.value[index] = DataItem(view: view, tabViewDelegate: tabViewDelegate)
items[index] = DataItem(view: view, tabViewDelegate: tabViewDelegate)
}
}
func setAppear(callback: @escaping () -> Void, at index: Int) {
if let item = items.value[index] {
if let item = items[index] {
item.appearCallback = callback
} else {
items.value[index] = DataItem(view: nil, callback: callback)
items[index] = DataItem(view: nil, callback: callback)
}
}
func remove(at index: Int) {
items.value[index] = nil
items[index] = nil
}
}

View File

@ -31,7 +31,7 @@ struct PagerTabItemModifier<NavTabView: View> : ViewModifier {
at: index)
}
}.onDisappear {
dataStore.items.value[index]?.tabViewDelegate?.setState(state: .normal)
dataStore.items[index]?.tabViewDelegate?.setState(state: .normal)
dataStore.remove(at: index)
}
}

View File

@ -18,14 +18,14 @@ struct NavBarItem: View {
}
var body: some View {
if id < dataStore.items.value.keys.count {
if id < dataStore.items.keys.count {
Button(action: {
self.currentIndex = id
}, label: {
dataStore.items.value[id]?.view
dataStore.items[id]?.view
}).buttonStyle(PlainButtonStyle())
.onLongPressGesture(minimumDuration: 0, maximumDistance: .infinity) { pressing in
dataStore.items.value[id]?.tabViewDelegate?.setState(state: pressing ? .highlighted : .selected)
dataStore.items[id]?.tabViewDelegate?.setState(state: pressing ? .highlighted : .selected)
} perform: {}
}
}

View File

@ -12,7 +12,7 @@ public struct PagerTabViewStyle {
var indicatorBarHeight: CGFloat
var indicatorBarColor: Color
public init(tabItemSpacing: CGFloat = 0, tabItemHeight: CGFloat = 100, indicatorBarHeight: CGFloat = 2, indicatorBarColor: Color = .blue){
public init(tabItemSpacing: CGFloat = 0, tabItemHeight: CGFloat = 50, indicatorBarHeight: CGFloat = 2, indicatorBarColor: Color = .blue){
self.tabItemSpacing = tabItemSpacing
self.tabItemHeight = tabItemHeight
self.indicatorBarHeight = indicatorBarHeight
@ -52,8 +52,7 @@ public struct PagerTabStripView<Content> : View where Content: View {
if let selection = selection {
useBinding = true
self._selectionBiding = selection
}
else{
} else {
useBinding = false
self._selectionBiding = .constant(0)
}
@ -134,13 +133,13 @@ private struct WrapperPagerTabStripView<Content> : View where Content: View {
})
.onChange(of: self.selection) { [selection] newIndex in
self.currentOffset = self.offsetFor(index: newIndex)
if let callback = dataStore.items.value[newIndex]?.appearCallback {
if let callback = dataStore.items[newIndex]?.appearCallback {
callback()
}
if let tabViewDelegate = dataStore.items.value[selection]?.tabViewDelegate {
if let tabViewDelegate = dataStore.items[selection]?.tabViewDelegate {
tabViewDelegate.setState(state: .normal)
}
if let tabViewDelegate = dataStore.items.value[newIndex]?.tabViewDelegate, newIndex != selection {
if let tabViewDelegate = dataStore.items[newIndex]?.tabViewDelegate, newIndex != selection {
tabViewDelegate.setState(state: .selected)
}
}
@ -159,9 +158,9 @@ private struct WrapperPagerTabStripView<Content> : View where Content: View {
}
.modifier(NavBarModifier(itemCount: $itemCount, selection: $selection))
.environmentObject(self.dataStore)
.onReceive(self.dataStore.items.throttle(for: 0.05, scheduler: DispatchQueue.main, latest: true)) { items in
.onReceive(self.dataStore.$items.throttle(for: 0.05, scheduler: DispatchQueue.main, latest: true)) { items in
self.itemCount = items.keys.count
if let tabViewDelegate = dataStore.items.value[selection]?.tabViewDelegate {
if let tabViewDelegate = dataStore.items[selection]?.tabViewDelegate {
tabViewDelegate.setState(state: .selected)
}
}