Skip to content

Instantly share code, notes, and snippets.

@twof
Created August 1, 2019 15:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save twof/70499fe865d850066690797363dbca06 to your computer and use it in GitHub Desktop.
Save twof/70499fe865d850066690797363dbca06 to your computer and use it in GitHub Desktop.
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