Skip to content

Commit

Permalink
Shared State (#2858)
Browse files Browse the repository at this point in the history
* Shared State

* fix compiler errors in 5.7

* fixes and tests

* fix

* fix

* wip

* longer sleeps

* fix test

* fix tests

* Clean up some typos in SharingState.md (#2860)

* public inits

* wip

* wip

* add test for shared state and onChange

* Case study for sandboxing shared state

* tweaks to case study

* wip

* add tests to sandboxing case study

* rename files

* wip

* simplify sync up tests

* wip

* fix

* wip

* fix $shared.publisher non-determinism and write test that currently fails but ideally would not.

* more docs and a test for autoclosure

* more docs

* wip

* update todo with persistence

* wip

* wip

* support default `nil` optionals in `@Shared`

* Introduce unavailable overload for better diagnostics

* Fix autocomplete from `@Shared(.`

* Revert "Fix autocomplete from `@Shared(.`"

This reverts commit fd1798f.

* Fix defaults

* wip

* Give persistence keys a synchronous update interface (#2880)

* Don't use async sequence for persistence

* wip

* wip

* wip

* Update Sources/ComposableArchitecture/SharedState/PersistenceKey.swift

Co-authored-by: Hal Lee <[email protected]>

---------

Co-authored-by: Hal Lee <[email protected]>

* Revert sharing in Todos for now

* wip

* wip

* Pass initial shared value to strategy / register app storage (#2904)

* Pass initial shared value to strategy / register app storage

This PR modifies the `PersistenceKey` protocol so that its `load` and
`subscribe` endpoints are handed the initial value and must return a
non-optional value. By feeding this value in, we can ensure that
`.appStorage` declared in a feature is registered outside the feature.

* wip

* wip

* wip

* wip

* wip

* wip

* swift-format

* Update Sources/ComposableArchitecture/Documentation.docc/Articles/SharingState.md

Co-authored-by: Pyry Jahkola <[email protected]>

* non-exhaustive fix

* wip

* remove decodable for now

* Fix app storage registration with `nil` values

* fix

* wip

* tutorial

* fixes

* lots of tutorial fixes

* more tutorial fixes

* more tutorial fixes

* more tutorial fixes

* tutorial fixes

* wip

* re-arrange test

* Remove store shared preview quarantine

* Add support for \.defaultInMemoryStorage (#2965)

* fix

* Added Privacy Manifest file (#2930)

* Added Privacy Manifest file

* Update [email protected]

---------

Co-authored-by: Stephen Celis <[email protected]>

* remove warning overloads

* write default instead of register

this is more consistent with SwiftUI's property wrapper, and causes less
strangeness when multiple repeat properties have different defaults

* move privacy manifest

* wip

* wip

* EphemeralFileStorage -> InMemoryFileStorage

* documented gotcha

* add test

* Shared state beta task snaps (#2976)

* wip

* wip

* wip

* wip

* wip

* wip

* wip

---------

Co-authored-by: Brandon Williams <[email protected]>

* wip

* Use notification center instead of KVO for user defaults observation. (#2978)

* Use notification center instead of KVO for user defaults observation.

* wip

* wip

* Introduce @SharedReader (#2979)

* wip

* wip

* wip

* wip

* wip

* wip

* Introduce @SharedReader.

* wip

* wip

* sendable

* wip

* wip

---------

Co-authored-by: Stephen Celis <[email protected]>

* Make Shared.Subscription.cancel public (#2983)

* added failing test

* Add convenience initializers

* Save to file storage when app is about to be terminated (#2992)

* Save file storage on termination too.

* wip

* Shared change tracking enhancements (#2989)

* wip

* wip

* wip

* wip

* Add unavailable conformance

* wip

* wip

* wip

* Don't need to check for previews.

* Add default providing persistence key (#2980)

* wip - default providing key

* warn on default access

* Revert "warn on default access"

This reverts commit 3870645.

* wip

* wip

* wip - tests

* wip - reader key

* fix docs

* A few changes.

* A few more changes.

* docs

---------

Co-authored-by: Brandon Williams <[email protected]>

* Fix optional shared defaults.

* undo last commit but keep test

* wip

* Better shared state change tracking and `TestStore` interactions (#2995)

* A fix for shared assertion.

* fixes

* wip

---------

Co-authored-by: Brandon Williams <[email protected]>

* docs

* docs

* wip

* Throttle for 1 second.

* fix typo in examples: `let` -> `var` (#2999)

Co-authored-by: Andreas Tielmann <[email protected]>

* wip

* wip

* fix observing projection

* Ping `Shared.publisher` in `willSet` so prev/next values observable

* wip

* wip

* remove sandbox demo

* wip

* wip

* recover inlining

* wip

* wip

* fix docc

* wip

* wip

* re-entrant test

* wip

* Don’t assume CastableLookup (#3011)

* Don’t assume CastableLookup

If the observed value in `UserDefaults` is a `RawRepresentable` type, simply casting to `Value` might fail because the raw representing type could be different from `Value`.  Instead of querying `UserDefaults` directly here, we should call `loadValue()` which will do the right thing for raw representable types (esp. try to call `Value.init(rawValue:)` with the value obtained from `UserDefaults`).

* Add test

---------

Co-authored-by: Stephen Celis <[email protected]>

* Make `FileStorage` more opaque (#3010)

* Make `FileStorage` more opaque

Previously, we had a public protocol and conformances, but we don't
expect anyone to conform outside the library, so instead let's hide
things in a more opaque struct.

The downside of this PR is that it's a breaking API change pretty late
in the game:

```diff
-$0.defaultFileStorage = InMemoryFileStorage()
+$0.defaultFileStorage = .inMemory
```

We could add public deprecated functions that emulate the old
initializers if we think it's worth it...

* wip

* wip

* wip

* wip

* wip

* wip

* fix for 5.7.1

* sync ups clean up

* more docs

* more tests

* shared testing tiups

* wip

* wip

* Fix typo. (#3014)

* more shared state docs

* relax version of swift-dependencies.

* dep change

* fix == and hash on Shared and more tests

* revert == changes

* add test

* Remove hashable conformance from shared

* remove conditional encodability from shared

* wip

* remove syncups tutorial

* wip

* fix

* fix file storage deletion resubscription

* wip

* wip

* wip

* wip

* wip

* fix

* eager throttle

---------

Co-authored-by: Brandon Williams <[email protected]>
Co-authored-by: NF <[email protected]>
Co-authored-by: Hal Lee <[email protected]>
Co-authored-by: Brandon Williams <[email protected]>
Co-authored-by: Pyry Jahkola <[email protected]>
Co-authored-by: Daniel Lyons <[email protected]>
Co-authored-by: Hilton Campbell <[email protected]>
Co-authored-by: Luke Redpath <[email protected]>
Co-authored-by: andtie <[email protected]>
Co-authored-by: Andreas Tielmann <[email protected]>
Co-authored-by: Alex Kovács <[email protected]>
Co-authored-by: Zev Eisenberg <[email protected]>
  • Loading branch information
13 people authored Apr 29, 2024
1 parent 6239ed0 commit e121b91
Show file tree
Hide file tree
Showing 114 changed files with 7,710 additions and 969 deletions.
230 changes: 127 additions & 103 deletions Examples/CaseStudies/CaseStudies.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

57 changes: 49 additions & 8 deletions Examples/CaseStudies/SwiftUICaseStudies/00-RootView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import SwiftUI

struct RootView: View {
@State var isNavigationStackCaseStudyPresented = false
@State var isSignUpCaseStudyPresented = false

var body: some View {
NavigationStack {
Expand Down Expand Up @@ -33,11 +34,6 @@ struct RootView: View {
OptionalBasicsView(store: store)
}
}
NavigationLink("Shared state") {
Demo(store: Store(initialState: SharedState.State()) { SharedState() }) { store in
SharedStateView(store: store)
}
}
NavigationLink("Alerts and Confirmation Dialogs") {
Demo(
store: Store(initialState: AlertAndConfirmationDialog.State()) {
Expand All @@ -61,6 +57,51 @@ struct RootView: View {
Text("Getting started")
}

Section {
NavigationLink("In memory") {
Demo(
store: Store(initialState: SharedStateInMemory.State()) { SharedStateInMemory() }
) { store in
SharedStateInMemoryView(store: store)
}
}
NavigationLink("User defaults") {
Demo(
store: Store(initialState: SharedStateUserDefaults.State()) {
SharedStateUserDefaults()
}
) { store in
SharedStateUserDefaultsView(store: store)
}
}
NavigationLink("File storage") {
Demo(
store: Store(initialState: SharedStateFileStorage.State()) {
SharedStateFileStorage()
}
) { store in
SharedStateFileStorageView(store: store)
}
}
NavigationLink("Notifications") {
Demo(
store: Store(initialState: SharedStateNotifications.State()) {
SharedStateNotifications()
}
) { store in
SharedStateNotificationsView(store: store)
}
}
Button("Sign up flow") {
isSignUpCaseStudyPresented = true
}
.sheet(isPresented: $isSignUpCaseStudyPresented) {
SignUpFlow()
}
} header: {
Text("Shared state")
}

Section {
NavigationLink("Basics") {
Demo(store: Store(initialState: EffectsBasics.State()) { EffectsBasics() }) { store in
Expand Down Expand Up @@ -102,7 +143,7 @@ struct RootView: View {

Section {
Button("Stack") {
self.isNavigationStackCaseStudyPresented = true
isNavigationStackCaseStudyPresented = true
}
.buttonStyle(.plain)

Expand Down Expand Up @@ -171,7 +212,7 @@ struct RootView: View {
}
}
.navigationTitle("Case Studies")
.sheet(isPresented: self.$isNavigationStackCaseStudyPresented) {
.sheet(isPresented: $isNavigationStackCaseStudyPresented) {
Demo(store: Store(initialState: NavigationDemo.State()) { NavigationDemo() }) { store in
NavigationDemoView(store: store)
}
Expand All @@ -194,7 +235,7 @@ struct Demo<State, Action, Content: View>: View {
}

var body: some View {
self.content(self.store)
content(store)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ struct Animations {
return .run { send in
for color in [Color.red, .blue, .green, .orange, .pink, .purple, .yellow, .black] {
await send(.setColor(color), animation: .linear)
try await self.clock.sleep(for: .seconds(1))
try await clock.sleep(for: .seconds(1))
}
}
.cancellable(id: CancelID.rainbow)
Expand Down
Loading

0 comments on commit e121b91

Please sign in to comment.