Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,23 @@ FrostSwiftFFI/Package.swift
### Xcodebuild gitignore

Examples/FrostCompanion/build/


# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## User settings
*.xcuserdatad
xcuserdata/
## Obj-C/Swift specific
*.hmap

## App packaging
*.ipa
*.dSYM.zip
*.dSYM

## Playgrounds
timeline.xctimeline
playground.xcworkspace

*/project.xcworkspace/xcuserdata/
125 changes: 121 additions & 4 deletions Examples/FrostCompanion/FrostCompanion.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Binary file not shown.
47 changes: 47 additions & 0 deletions Examples/FrostCompanion/FrostCompanion/AppFeature.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//
// AppFeature.swift
// FrostCompanion
//
// Created by Pacu in 2024.
//


import Foundation
import ComposableArchitecture
@Reducer
struct AppFeature {
@ObservableState
struct State: Equatable {
var path = StackState<Path.State>()
var mainScreen = MainScreenFeature.State()
}

enum Action {
case path(StackActionOf<Path>)
case mainScreen(MainScreenFeature.Action)
}

@Reducer(state: .equatable)
enum Path {
case importParticipant(ParticipantImportFeature)
case coordinator(TrustedDealerFeature)
case newTrustedDealerScheme(NewTrustedScheme)
}

var body: some ReducerOf<Self> {
Scope(state: \.mainScreen, action: \.mainScreen) {
MainScreenFeature()
}
Reduce { state, action in
switch action {
// case .path(.element(_, .coordinator(.)))
case .path:
return .none

case .mainScreen:
return .none
}
}
.forEach(\.path, action: \.path)
}
}
44 changes: 44 additions & 0 deletions Examples/FrostCompanion/FrostCompanion/AppView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// AppView.swift
// FrostCompanion
//
// Created by Pacu in 2024.
//


import SwiftUI
import ComposableArchitecture
struct AppView: View {
@Bindable var store: StoreOf<AppFeature>
var body: some View {
NavigationStack(
path: $store.scope(state: \.path, action: \.path)
) {
MainScreenView(
store:
store.scope(
state: \.mainScreen,
action: \.mainScreen
)
)
} destination: { store in
switch store.case {
case let .importParticipant(importStore):
ParticipantImportView(store: importStore)
case let .coordinator(trustedDealerStore):
NewTrustedDealerSchemeView(store: trustedDealerStore)
case let .newTrustedDealerScheme(newTrustedDealerScheme):
NewTrustedDealerSchemeFeature()
}
}
}
}

#Preview {
AppView(store: Store(
initialState: AppFeature.State()
){
AppFeature()
}
)
}
24 changes: 0 additions & 24 deletions Examples/FrostCompanion/FrostCompanion/ContentView.swift

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//
// NewTrustedDealerSchemeFeature.swift
// FrostCompanion
//
// Created by Pacu in 2024.
//


import Foundation
import ComposableArchitecture

@Reducer
struct NewTrustedDealerSchemeFeature {
@ObservableState
struct State {
let schemeConfig: FROSTSchemeConfig
var scheme: TrustedDealerScheme?
// var path: StackState<
}

enum Action {
case dealerSucceeded(TrustedDealerScheme)
case dealerFailed(AppErrors)
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// NewTrustedDealerSchemeView.swift
// FrostCompanion
//
// Created by Pacu in 2024.
//


import SwiftUI
import ComposableArchitecture

struct NewTrustedDealerSchemeView: View {
static let intFormater: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.allowsFloats = false
formatter.maximumFractionDigits = 0
return formatter
}()

@Bindable var store: StoreOf<TrustedDealerFeature>
@FocusState var focus: TrustedDealerFeature.State.Field?
var body: some View {
Form {
Section {
TextField("Min Participants", value: $store.minParticipants, format: .number)
.focused($focus, equals: .minParticipants)
TextField("Max Participants", value: $store.maxParticipants, formatter: Self.intFormater)
.focused($focus, equals: .minParticipants)
Button("create scheme") {
store.send(.createSchemePressed)
}
}
.bind($store.focus, to: $focus)
}
.padding()
}
}

#Preview {
NewTrustedDealerSchemeView(store: Store(initialState: TrustedDealerFeature.State(), reducer: {
TrustedDealerFeature()
}))
}
Loading