Add pull to refresh to iOS

This commit is contained in:
2021-01-02 16:59:42 +01:00
parent ceed971618
commit f22d1c6537
8 changed files with 30 additions and 8 deletions

View File

@@ -8,6 +8,7 @@ target 'circolapp' do
pod 'shared', :path => '../../shared' pod 'shared', :path => '../../shared'
pod 'Firebase/Messaging' pod 'Firebase/Messaging'
pod 'AppStorage', '~> 1.0.3' pod 'AppStorage', '~> 1.0.3'
pod "SwiftUIRefresh"
pod 'Carte' pod 'Carte'
post_install do |installer| post_install do |installer|

View File

@@ -52,6 +52,7 @@ PODS:
- GoogleUtilities/UserDefaults (7.1.1): - GoogleUtilities/UserDefaults (7.1.1):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- HTMLKit (3.1.0) - HTMLKit (3.1.0)
- Introspect (0.1.2)
- nanopb (2.30906.0): - nanopb (2.30906.0):
- nanopb/decode (= 2.30906.0) - nanopb/decode (= 2.30906.0)
- nanopb/encode (= 2.30906.0) - nanopb/encode (= 2.30906.0)
@@ -60,12 +61,15 @@ PODS:
- PromisesObjC (1.2.11) - PromisesObjC (1.2.11)
- shared (1.0): - shared (1.0):
- HTMLKit (~> 3.1.0) - HTMLKit (~> 3.1.0)
- SwiftUIRefresh (0.0.3):
- Introspect (~> 0.1.0)
DEPENDENCIES: DEPENDENCIES:
- AppStorage (~> 1.0.3) - AppStorage (~> 1.0.3)
- Carte - Carte
- Firebase/Messaging - Firebase/Messaging
- shared (from `../../shared`) - shared (from `../../shared`)
- SwiftUIRefresh
SPEC REPOS: SPEC REPOS:
trunk: trunk:
@@ -80,8 +84,10 @@ SPEC REPOS:
- GoogleDataTransport - GoogleDataTransport
- GoogleUtilities - GoogleUtilities
- HTMLKit - HTMLKit
- Introspect
- nanopb - nanopb
- PromisesObjC - PromisesObjC
- SwiftUIRefresh
EXTERNAL SOURCES: EXTERNAL SOURCES:
shared: shared:
@@ -99,10 +105,12 @@ SPEC CHECKSUMS:
GoogleDataTransport: 116c84c4bdeb76be2a7a46de51244368f9794eab GoogleDataTransport: 116c84c4bdeb76be2a7a46de51244368f9794eab
GoogleUtilities: 3dc4ff0d5e4840e2fa8eef0889620e8c33d4218c GoogleUtilities: 3dc4ff0d5e4840e2fa8eef0889620e8c33d4218c
HTMLKit: 4ed10a911462cbf972329ec6aaaa827208dfd70c HTMLKit: 4ed10a911462cbf972329ec6aaaa827208dfd70c
Introspect: 85a29d2c5ee4d3d15469ad0b75fd8839f3e72674
nanopb: 1bf24dd71191072e120b83dd02d08f3da0d65e53 nanopb: 1bf24dd71191072e120b83dd02d08f3da0d65e53
PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f
shared: fb3154b4def038b2b13aa88e01dd9f91bb2de9b5 shared: fb3154b4def038b2b13aa88e01dd9f91bb2de9b5
SwiftUIRefresh: ca6ae2718d25aad5dd68bbf5d2ae36ef6ade98bf
PODFILE CHECKSUM: 7decc03927fcaa3f2209e5b0ce4ee4c86d714007 PODFILE CHECKSUM: faad88d7c92ca3deaa3ebc5d53f6ff86592a6113
COCOAPODS: 1.10.0 COCOAPODS: 1.10.0

View File

@@ -12,6 +12,7 @@
950C1788258E5BD300B2DBFE /* PhoneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950C1787258E5BD300B2DBFE /* PhoneView.swift */; }; 950C1788258E5BD300B2DBFE /* PhoneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950C1787258E5BD300B2DBFE /* PhoneView.swift */; };
9512D3C1257AB4F60023C3A1 /* NewReminderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9512D3C0257AB4F60023C3A1 /* NewReminderView.swift */; }; 9512D3C1257AB4F60023C3A1 /* NewReminderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9512D3C0257AB4F60023C3A1 /* NewReminderView.swift */; };
952DEDDF2576F8DC001DF85D /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952DEDDE2576F8DC001DF85D /* SceneDelegate.swift */; }; 952DEDDF2576F8DC001DF85D /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952DEDDE2576F8DC001DF85D /* SceneDelegate.swift */; };
953DDE7E2580312500C457CE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 953DDE7D2580312500C457CE /* LaunchScreen.storyboard */; };
954AF8F62588A5C300666D0C /* CircularList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AF8F52588A5C300666D0C /* CircularList.swift */; }; 954AF8F62588A5C300666D0C /* CircularList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AF8F52588A5C300666D0C /* CircularList.swift */; };
954AF8F82588A5CF00666D0C /* FavouritesList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AF8F72588A5CF00666D0C /* FavouritesList.swift */; }; 954AF8F82588A5CF00666D0C /* FavouritesList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AF8F72588A5CF00666D0C /* FavouritesList.swift */; };
954AF8FA2588A5DD00666D0C /* RemindersList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AF8F92588A5DD00666D0C /* RemindersList.swift */; }; 954AF8FA2588A5DD00666D0C /* RemindersList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AF8F92588A5DD00666D0C /* RemindersList.swift */; };
@@ -24,7 +25,6 @@
955B7A0E257D098C0091B1F9 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955B7A0D257D098C0091B1F9 /* SearchBar.swift */; }; 955B7A0E257D098C0091B1F9 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955B7A0D257D098C0091B1F9 /* SearchBar.swift */; };
955B7A10257D10A70091B1F9 /* ViewControllerResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955B7A0F257D10A70091B1F9 /* ViewControllerResolver.swift */; }; 955B7A10257D10A70091B1F9 /* ViewControllerResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955B7A0F257D10A70091B1F9 /* ViewControllerResolver.swift */; };
955B984D25962C3800ED4831 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 955B984F25962C3800ED4831 /* Localizable.strings */; }; 955B984D25962C3800ED4831 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 955B984F25962C3800ED4831 /* Localizable.strings */; };
953DDE7E2580312500C457CE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 953DDE7D2580312500C457CE /* LaunchScreen.storyboard */; };
95906F48257508660060F5D0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95906F47257506360060F5D0 /* Assets.xcassets */; }; 95906F48257508660060F5D0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95906F47257506360060F5D0 /* Assets.xcassets */; };
95906F4D257510370060F5D0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 95906F4C257510370060F5D0 /* GoogleService-Info.plist */; }; 95906F4D257510370060F5D0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 95906F4C257510370060F5D0 /* GoogleService-Info.plist */; };
95B4CE142588BC890090D5E8 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95B4CE132588BC890090D5E8 /* SettingsView.swift */; }; 95B4CE142588BC890090D5E8 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95B4CE132588BC890090D5E8 /* SettingsView.swift */; };
@@ -64,6 +64,7 @@
9512D3C0257AB4F60023C3A1 /* NewReminderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewReminderView.swift; sourceTree = "<group>"; }; 9512D3C0257AB4F60023C3A1 /* NewReminderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewReminderView.swift; sourceTree = "<group>"; };
952C5954255C57650018C010 /* shared.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = shared.framework; path = "../../shared/build/xcode-frameworks/shared.framework"; sourceTree = "<group>"; }; 952C5954255C57650018C010 /* shared.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = shared.framework; path = "../../shared/build/xcode-frameworks/shared.framework"; sourceTree = "<group>"; };
952DEDDE2576F8DC001DF85D /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; }; 952DEDDE2576F8DC001DF85D /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
953DDE7D2580312500C457CE /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
954AF8F52588A5C300666D0C /* CircularList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircularList.swift; sourceTree = "<group>"; }; 954AF8F52588A5C300666D0C /* CircularList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircularList.swift; sourceTree = "<group>"; };
954AF8F72588A5CF00666D0C /* FavouritesList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavouritesList.swift; sourceTree = "<group>"; }; 954AF8F72588A5CF00666D0C /* FavouritesList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavouritesList.swift; sourceTree = "<group>"; };
954AF8F92588A5DD00666D0C /* RemindersList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemindersList.swift; sourceTree = "<group>"; }; 954AF8F92588A5DD00666D0C /* RemindersList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemindersList.swift; sourceTree = "<group>"; };
@@ -77,7 +78,6 @@
955B7A0F257D10A70091B1F9 /* ViewControllerResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewControllerResolver.swift; sourceTree = "<group>"; }; 955B7A0F257D10A70091B1F9 /* ViewControllerResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewControllerResolver.swift; sourceTree = "<group>"; };
955B984E25962C3800ED4831 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; 955B984E25962C3800ED4831 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
955B985025962C3B00ED4831 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; }; 955B985025962C3B00ED4831 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
953DDE7D2580312500C457CE /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
95906F47257506360060F5D0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 95906F47257506360060F5D0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
95906F4C257510370060F5D0 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; }; 95906F4C257510370060F5D0 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
959B531E25764726009AD895 /* circolapp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = circolapp.entitlements; sourceTree = "<group>"; }; 959B531E25764726009AD895 /* circolapp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = circolapp.entitlements; sourceTree = "<group>"; };

View File

@@ -72,7 +72,7 @@ extension AppDelegate : UNUserNotificationCenterDelegate {
// Handle new circular notification // Handle new circular notification
let repository = iOSRepository.getCircularRepository() let repository = iOSRepository.getCircularRepository()
iOSRepository.updateCirculars(circularRepository: repository) iOSRepository.updateCirculars(circularRepository: repository, circularUpdated: {})
// UI is updated automatically // UI is updated automatically
completionHandler([]) completionHandler([])
@@ -91,7 +91,7 @@ extension AppDelegate : UNUserNotificationCenterDelegate {
} }
let repository = iOSRepository.getCircularRepository() let repository = iOSRepository.getCircularRepository()
iOSRepository.updateCirculars(circularRepository: repository) iOSRepository.updateCirculars(circularRepository: repository, circularUpdated: {})
completionHandler() completionHandler()
} }

View File

@@ -33,7 +33,7 @@ class iOSRepository {
return CircularRepository(circularDao: getCircularDao(), serverAPI: serverAPI) return CircularRepository(circularDao: getCircularDao(), serverAPI: serverAPI)
} }
public static func updateCirculars(circularRepository: CircularRepository) { public static func updateCirculars(circularRepository: CircularRepository, circularUpdated: @escaping () -> Void) {
circularRepository.updateCirculars(returnNewCirculars: true, completionHandler: circularRepository.updateCirculars(returnNewCirculars: true, completionHandler:
{ result, error in { result, error in
if let errorReal = error { if let errorReal = error {
@@ -50,6 +50,8 @@ class iOSRepository {
for circular in result!.first as! Array<Circular> { for circular in result!.first as! Array<Circular> {
indexToSpotlight(circular: circular) indexToSpotlight(circular: circular)
} }
circularUpdated()
}) })
} }

View File

@@ -68,6 +68,6 @@ class iOSServerApi {
UserDefaults.standard.set(newTopic, forKey: topicKey) UserDefaults.standard.set(newTopic, forKey: topicKey)
} }
iOSRepository.updateCirculars(circularRepository: CircularRepository(circularDao: iOSRepository.getCircularDao(), serverAPI: serverAPI)) iOSRepository.updateCirculars(circularRepository: CircularRepository(circularDao: iOSRepository.getCircularDao(), serverAPI: serverAPI), circularUpdated: {})
} }
} }

View File

@@ -17,6 +17,7 @@
*/ */
import SwiftUI import SwiftUI
import SwiftUIRefresh
struct CircularList: View { struct CircularList: View {
@ObservedObject var circularViewModel = CircularViewModel(repository: iOSRepository.getCircularRepository()) @ObservedObject var circularViewModel = CircularViewModel(repository: iOSRepository.getCircularRepository())
@@ -27,6 +28,12 @@ struct CircularList: View {
CircularView(circular: circular) CircularView(circular: circular)
} }
.navigationBarTitle(Text("Circulars"), displayMode: .large) .navigationBarTitle(Text("Circulars"), displayMode: .large)
.pullToRefresh() { endRefreshing in circularViewModel.updateCirculars {
DispatchQueue.main.async {
endRefreshing()
}
}
}
.addSearchBar(self.searchBar) .addSearchBar(self.searchBar)
.onReceive(searchBar.$text) {query in .onReceive(searchBar.$text) {query in
self.circularViewModel.search(query: query) self.circularViewModel.search(query: query)

View File

@@ -33,7 +33,7 @@ class CircularViewModel: ObservableObject {
self.repository = repository self.repository = repository
schoolID = UserDefaults.standard.integer(forKey: key) schoolID = UserDefaults.standard.integer(forKey: key)
iOSRepository.updateCirculars(circularRepository: repository) iOSRepository.updateCirculars(circularRepository: repository, circularUpdated: {})
userDefaultsObserver = UserDefaults.standard.observe(\.school, options: [.initial, .new], changeHandler: { (defaults, change) in userDefaultsObserver = UserDefaults.standard.observe(\.school, options: [.initial, .new], changeHandler: { (defaults, change) in
self.schoolID = change.newValue ?? 0 self.schoolID = change.newValue ?? 0
@@ -48,6 +48,10 @@ class CircularViewModel: ObservableObject {
userDefaultsObserver?.invalidate() userDefaultsObserver?.invalidate()
} }
func updateCirculars(circularUpdated: @escaping () -> Void) {
iOSRepository.updateCirculars(circularRepository: repository, circularUpdated: circularUpdated)
}
func startObservingCirculars() { func startObservingCirculars() {
stopObserving() stopObserving()
circularWatcher = repository.circularDao.getCFlowCirculars(school: Int32(schoolID)).watch { circulars in circularWatcher = repository.circularDao.getCFlowCirculars(school: Int32(schoolID)).watch { circulars in