Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm test
npm run format-changes
20 changes: 18 additions & 2 deletions App/AppCore/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,29 @@ let package = Package(
.library(
name: "AppCore",
targets: ["AppCore"]
)
),
.library(
name: "Models",
targets: ["Models"]
),
.library(
name: "Beans",
targets: ["Beans"]
),
],
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
.target(
name: "AppCore"
name: "AppCore",
dependencies: ["Beans"]
),
.target(
name: "Models"
),
.target(
name: "Beans",
dependencies: ["Models"]
),
.testTarget(
name: "AppCoreTests",
Expand Down
3 changes: 2 additions & 1 deletion App/AppCore/Sources/AppCore/Tabs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// Created by Jay on 1/12/24.
//

import Beans
import Foundation
import SwiftUI

Expand Down Expand Up @@ -40,7 +41,7 @@ enum Tab: Int, Identifiable, CaseIterable {
var view: some View {
switch self {
case .coffee:
Text(self.label)
BeansListView()
case .settings:
Text(self.label)
}
Expand Down
72 changes: 72 additions & 0 deletions App/AppCore/Sources/Beans/BeansListView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
//
// BeansListView.swift
//
//
// Created by Jay on 1/12/24.
//

import Models
import SwiftUI

public struct BeansListView: View {
let columns = [
GridItem(.flexible(), spacing: 20),
GridItem(.flexible(), spacing: 20),
]

public init() {}

@State private var isNewBeanSheetPresented = false
@State private var beans: [Bean] = [.mock]

public var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 20) {
ForEach(beans) { bean in
BeanCard(bean: bean)
.frame(minHeight: 150, maxHeight: 200)
.clipShape(
RoundedRectangle(cornerSize: CGSize(width: 10, height: 10), style: .continuous)
)
.shadow(radius: 4)
}
newBeanButton
.sheet(isPresented: $isNewBeanSheetPresented) {
NavigationStack {
NewBeanView { bean in
beans.append(bean)
isNewBeanSheetPresented.toggle()
}
}
.presentationDetents([.medium])
}
}
}
.contentMargins(20.0)
}

@ViewBuilder
var newBeanButton: some View {
HStack(alignment: .center) {
Button {
isNewBeanSheetPresented.toggle()
} label: {
Image(systemName: "plus")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 50)
}
.frame(maxWidth: .infinity)
.padding(.vertical)
.background(.thinMaterial)
.clipShape(
RoundedRectangle(cornerSize: CGSize(width: 10, height: 10), style: .continuous)
)
}
.shadow(radius: 4)
}
}

#Preview {
BeansListView()
}
53 changes: 53 additions & 0 deletions App/AppCore/Sources/Beans/Components/BeanCard.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//
// BeanCard.swift
//
//
// Created by Jay on 1/12/24.
//

import Models
import SwiftUI

struct BeanCard: View {
var bean: Bean
var body: some View {
VStack {
Spacer()
HStack {
label
Spacer()
}
.background(.thinMaterial)
}
.background(image)
}

@ViewBuilder
var image: some View {
Image(systemName: "photo.fill")
.resizable()
.aspectRatio(contentMode: .fit)
}
@ViewBuilder
var label: some View {
VStack(alignment: .leading) {
Text(bean.name)
.font(.headline)
Text(bean.roastStyle.abbreviated.capitalized(with: .current))
.font(.subheadline)
}
.padding(.vertical, 8)
.padding(.leading)
.padding(.trailing, 4)
}
}

#Preview {
HStack(spacing: 20) {
BeanCard(bean: .mock)
.frame(width: 150, height: 200)

BeanCard(bean: Bean(name: "Test", website: "", roastStyle: .light))
.frame(width: 150, height: 200)
}
}
54 changes: 54 additions & 0 deletions App/AppCore/Sources/Beans/NewBeanView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
//
// NewBeanView.swift
//
//
// Created by Jay on 1/12/24.
//

import Models
import SwiftUI

struct NewBeanView: View {
@Environment(\.dismiss) var dismiss
var save: (Bean) -> Void

@State private var newBean = Bean(
name: "",
website: "",
roastStyle: .medium
)

var body: some View {
Form {
TextField("Name", text: $newBean.name)
TextField("Website", text: $newBean.website)
Picker("Roast Style", selection: $newBean.roastStyle) {
ForEach(RoastStyle.allCases) { roastStyle in
Text(roastStyle.long)
.tag(roastStyle)
}
}
}
.navigationTitle("New Bean")
.navigationBarTitleDisplayMode(.large)
.toolbar {
ToolbarItem {
Button("Save") {
save(newBean)
}
}
ToolbarItem(placement: .topBarLeading) {
Button("Cancel") {
dismiss()
}
.tint(.red)
}
}
}
}

#Preview {
NavigationStack {
NewBeanView(save: { _ in print("save") })
}
}
61 changes: 61 additions & 0 deletions App/AppCore/Sources/Models/Bean.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// Bean.swift
//
//
// Created by Jay on 1/12/24.
//

import Foundation

public enum RoastStyle: Int, Identifiable, CaseIterable {
public var id: Int {
self.rawValue
}

case light, medium, dark

public var long: String {
switch self {
case .light:
"Light roast"
case .medium:
"Medium roast"
case .dark:
"Dark roast"
}
}

public var abbreviated: String {
switch self {
case .light:
"light"
case .medium:
"medium"
case .dark:
"dark"
}
}
}

public struct Bean: Equatable, Identifiable {
public let id: UUID

public var name: String
public var website: String
public var roastStyle: RoastStyle

public init(id: UUID = UUID(), name: String, website: String, roastStyle: RoastStyle) {
self.id = id
self.name = name
self.website = website
self.roastStyle = roastStyle
}
}

extension Bean {
public static let mock = Bean(
name: "Holler Mountain",
website: "https://www.stumptowncoffee.com/products/holler-mountain",
roastStyle: .medium
)
}
10 changes: 10 additions & 0 deletions docs/Components.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Components.md

## Naming

### Order
Modifier + Element
Example: `BeansList`: `Beans` = modifier, `List` = Element

### Rules
- No punctuation. No hyphens no dots etc
1 change: 0 additions & 1 deletion scripts/commitlint.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
npm run format-changes
npx --no -- commitlint --edit ${1}