This commit is contained in:
Ivan Vorobei
2019-06-26 22:12:35 +03:00
parent 2477f5d038
commit 48001a8e9a
1363 changed files with 6 additions and 3 deletions

View File

@@ -0,0 +1,53 @@
//
// UserDetailView.swift
// SwiftUIDemo
//
// Created by Thomas Ricouard on 04/06/2019.
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
//
import SwiftUI
import Combine
struct UserDetailView : View {
@EnvironmentObject var state: AppState
let userId: Int
var editModal: Modal {
let user = state.usersState.users[userId]
return Modal(UserEditForm(userId: user.id, saveHandler: { saved in
self.state.dispatch(action: UserActions.stopEditUser)
}).environmentObject(state)) {
self.state.dispatch(action: UserActions.stopEditUser)
}
}
var body: some View {
let user = state.usersState.users[userId]
return VStack {
Image(systemName: user.imageName)
Text(user.name)
Text(user.username).lineLimit(0)
}
.navigationBarTitle(Text(user.name), displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
self.state.dispatch(action: UserActions.startEditUser)
}) {
Text("Edit user")
}
.presentation(self.state.usersState.isEditingUser ? self.editModal : nil))
}
}
#if DEBUG
struct UserDetailView_Previews : PreviewProvider {
static var previews: some View {
NavigationView {
UserDetailView(userId: 0).environmentObject(sampleStore)
}
}
}
#endif

View File

@@ -0,0 +1,88 @@
//
// UserEditForm.swift
// SwiftUIDemo
//
// Created by Thomas Ricouard on 05/06/2019.
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
//
import SwiftUI
struct UserEditForm : View {
@EnvironmentObject var state: AppState
let userId: Int
let saveHandler: ((Bool) -> Swift.Void)?
@State var newUserName = ""
@State var newUserUsername = ""
@State var showSaved = false
@State var showError = false
var body: some View {
let user = state.usersState.users[userId]
return NavigationView {
VStack(alignment: .leading, spacing: 10) {
Text("User name")
TextField($newUserName, placeholder: Text("New name"))
.textFieldStyle(.roundedBorder)
Divider()
Text("Username")
TextField($newUserUsername, placeholder: Text("New username"))
.textFieldStyle(.roundedBorder)
}.padding(16)
Button(action: save) {
Text("Save")
.padding(8)
.foregroundColor(.white)
.background(Color.green)
.cornerRadius(8)
}
.navigationBarItems(trailing: Button(action: close) {
Text("Close")
})
.navigationBarTitle(Text("Edit \(user.name)"), displayMode: .inline)
Badge(text: "Saved successfully", color: .green, show: $showSaved)
Badge(text: "Missing username or name", color: .red, show: $showError)
}
}
func save() {
guard !newUserName.isEmpty && !newUserUsername.isEmpty else {
withAnimation{
showError = true
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.showError = false
}
return
}
withAnimation {
showSaved = true
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.showSaved = false
}
state.dispatch(action: UserActions.editUser(id: userId, name: newUserName, username: newUserUsername))
saveHandler?(true)
}
func close() {
saveHandler?(false)
}
}
#if DEBUG
struct UserEditForm_Previews : PreviewProvider {
static var previews: some View {
UserEditForm(userId: 0, saveHandler: nil).environmentObject(sampleStore)
}
}
#endif

View File

@@ -0,0 +1,66 @@
//
// ContentView.swift
// SwiftUIDemo
//
// Created by Thomas Ricouard on 04/06/2019.
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
//
import SwiftUI
struct UsersListView : View {
@EnvironmentObject var state: AppState
var body: some View {
NavigationView {
List {
Section {
Button(action: addUser) {
Text("Add user")
}
Button(action: targetUpdate) {
Text("Update first")
}
}
Section {
ForEach(state.usersState.users) {user in
NavigationButton(destination: UserDetailView(userId: user.id)) {
UserRow(user: user)
}
}
.onDelete(perform: delete)
.onMove(perform: move)
}
}
.listStyle(.grouped)
.navigationBarTitle(Text("Users (\(state.usersState.users.count))"))
.navigationBarItems(trailing: EditButton())
}
}
func addUser() {
state.dispatch(action: UserActions.addUser)
}
func targetUpdate() {
state.dispatch(action: UserActions.testEditFirstUser)
}
func delete(at offset: IndexSet) {
state.dispatch(action: UserActions.deleteUser(index: offset.first!))
}
func move(from: IndexSet, to: Int) {
state.dispatch(action: UserActions.move(from: from.first!, to: to))
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
UsersListView().environmentObject(sampleStore)
}
}
#endif

View File

@@ -0,0 +1,32 @@
//
// GreenBadge.swift
// SwiftUIDemo
//
// Created by Thomas Ricouard on 06/06/2019.
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
//
import SwiftUI
struct Badge : View {
let text: String
let color: Color
@Binding var show: Bool
var animation: Animation {
Animation
.spring(initialVelocity: 5)
.speed(2)
}
var body: some View {
Text(text)
.color(.white)
.padding()
.background(color)
.cornerRadius(8)
.scaleEffect(show ? 1: 0.5)
.opacity(show ? 1 : 0)
.animation(animation)
}
}

View File

@@ -0,0 +1,36 @@
//
// UserRw.swift
// SwiftUIDemo
//
// Created by Thomas Ricouard on 04/06/2019.
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
//
import SwiftUI
struct UserRow : View {
let user: User
var body: some View {
VStack {
HStack {
Image(systemName: user.imageName)
VStack {
Text(user.name)
Text(user.username)
.color(.secondary)
.lineLimit(0)
}
}
}
}
}
#if DEBUG
struct UserRw_Previews : PreviewProvider {
static var previews: some View {
UserRow(user: sampleData[0])
}
}
#endif