Created
August 1, 2019 15:22
-
-
Save twof/70499fe865d850066690797363dbca06 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import SwiftUI | |
import Combine | |
struct Track: Hashable, Identifiable { | |
var id: Int | |
let name: String | |
var voteScore: Int = 0 | |
var currentVote: VoteDirection = .none | |
} | |
var tracks = [ | |
Track(id: 0, name: "Red Hot Chili Peppers"), | |
Track(id: 1, name: "Sour Fruit") | |
] | |
class AppState: ObservableObject, Identifiable { | |
var willChange = ObservableObjectPublisher() | |
@Published var tracks: [Track] = [] | |
} | |
struct PlayerView: View { | |
let skipAction: () -> Void | |
var body: some View { | |
VStack { | |
HStack { | |
Button(action: self.skipAction) { | |
Image(systemName: "arrow.right.to.line") | |
} | |
} | |
} | |
} | |
} | |
struct PartyView: View { | |
@ObservedObject var state: AppState | |
init(state: AppState) { | |
self.state = state | |
self.state.tracks = tracks | |
} | |
var body: some View { | |
VStack { | |
PlayerView( | |
skipAction: { | |
guard self.state.tracks.count > 0 else { return } | |
self.state.tracks.remove(at: 0) | |
} | |
) | |
Playlist(tracks: self.$state.tracks) | |
} | |
} | |
} | |
struct Playlist: View { | |
@Binding var tracks: [Track] | |
var body: some View { | |
List(self.tracks) { track in | |
TrackRow(track: self.$tracks[track.id]) | |
} | |
} | |
} | |
struct TrackRow: View { | |
@Binding var track: Track | |
var body: some View { | |
HStack { | |
Text(track.name) | |
VoteButtons(vote: $track.currentVote) | |
} | |
} | |
} | |
enum VoteDirection { | |
case up | |
case down | |
case none | |
} | |
struct VoteButtons: View { | |
@Binding var vote: VoteDirection | |
var body: some View { | |
VStack { | |
Image(systemName: vote == .up ? "arrowtriangle.up.fill" : "arrowtriangle.up") | |
.onTapGesture { | |
self.vote = .up | |
} | |
Image(systemName: vote == .down ? "arrowtriangle.down.fill" : "arrowtriangle.down") | |
.onTapGesture { | |
self.vote = .down | |
} | |
} | |
} | |
} | |
struct ContentView : View { | |
var body: some View { | |
PartyView(state: AppState()) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment