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
21 changes: 21 additions & 0 deletions CoffeeTracker/CoffeeTracker.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
371E297327C40FEF00C8ACBF /* BeansCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371E297227C40FEF00C8ACBF /* BeansCollectionView.swift */; };
371E297527C4100900C8ACBF /* NewBeansView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371E297427C4100900C8ACBF /* NewBeansView.swift */; };
376A5E5327D844D60038BDA0 /* PhotoPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376A5E5227D844D60038BDA0 /* PhotoPickerView.swift */; };
3776B9DE27E8B32D0042C494 /* OctoKit in Frameworks */ = {isa = PBXBuildFile; productRef = 3776B9DD27E8B32D0042C494 /* OctoKit */; };
3776B9E127E8B3450042C494 /* UserFeedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3776B9E027E8B3450042C494 /* UserFeedback.swift */; };
3782E03527C4AA81000F0404 /* BeansCollectionViewOO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3782E03427C4AA81000F0404 /* BeansCollectionViewOO.swift */; };
3797E1C427D6A52F000FE457 /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3797E1C327D6A52F000FE457 /* View+Extensions.swift */; };
3797E1C627D6A6F3000FE457 /* Color+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3797E1C527D6A6F3000FE457 /* Color+Extension.swift */; };
Expand Down Expand Up @@ -49,6 +51,7 @@
371E297227C40FEF00C8ACBF /* BeansCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeansCollectionView.swift; sourceTree = "<group>"; };
371E297427C4100900C8ACBF /* NewBeansView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewBeansView.swift; sourceTree = "<group>"; };
376A5E5227D844D60038BDA0 /* PhotoPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoPickerView.swift; sourceTree = "<group>"; };
3776B9E027E8B3450042C494 /* UserFeedback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFeedback.swift; sourceTree = "<group>"; };
3782E03427C4AA81000F0404 /* BeansCollectionViewOO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeansCollectionViewOO.swift; sourceTree = "<group>"; };
3797E1C327D6A52F000FE457 /* View+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Extensions.swift"; sourceTree = "<group>"; };
3797E1C527D6A6F3000FE457 /* Color+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extension.swift"; sourceTree = "<group>"; };
Expand All @@ -65,6 +68,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
3776B9DE27E8B32D0042C494 /* OctoKit in Frameworks */,
37C9838727E4E5B8007C85E3 /* RevenueCat in Frameworks */,
37B776A627C67A6F00EFD566 /* CloudKit.framework in Frameworks */,
);
Expand Down Expand Up @@ -172,6 +176,7 @@
children = (
37F18B2727E4C09500F609DF /* AboutView.swift */,
37F18B2927E4C15200F609DF /* BuyDevCoffeeSection.swift */,
3776B9E027E8B3450042C494 /* UserFeedback.swift */,
);
path = About;
sourceTree = "<group>";
Expand All @@ -194,6 +199,7 @@
name = CoffeeTracker;
packageProductDependencies = (
37C9838627E4E5B8007C85E3 /* RevenueCat */,
3776B9DD27E8B32D0042C494 /* OctoKit */,
);
productName = CoffeeTracker;
productReference = 371E294B27C40D2100C8ACBF /* Coffee_.app */;
Expand Down Expand Up @@ -225,6 +231,7 @@
mainGroup = 371E294227C40D2100C8ACBF;
packageReferences = (
37C9838527E4E5B8007C85E3 /* XCRemoteSwiftPackageReference "purchases-ios" */,
3776B9DC27E8B32D0042C494 /* XCRemoteSwiftPackageReference "octokit" */,
);
productRefGroup = 371E294C27C40D2100C8ACBF /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -265,6 +272,7 @@
371E296527C40EC900C8ACBF /* BeanModel.swift in Sources */,
371E295B27C40D2200C8ACBF /* CoffeeTracker.xcdatamodeld in Sources */,
371E296E27C40F9A00C8ACBF /* BeanDetailView.swift in Sources */,
3776B9E127E8B3450042C494 /* UserFeedback.swift in Sources */,
371E297327C40FEF00C8ACBF /* BeansCollectionView.swift in Sources */,
371E296C27C40F5E00C8ACBF /* SFSymbolHelper.swift in Sources */,
3797E1C427D6A52F000FE457 /* View+Extensions.swift in Sources */,
Expand Down Expand Up @@ -481,6 +489,14 @@
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
3776B9DC27E8B32D0042C494 /* XCRemoteSwiftPackageReference "octokit" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/nerdishbynature/octokit.swift";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 0.9.0;
};
};
37C9838527E4E5B8007C85E3 /* XCRemoteSwiftPackageReference "purchases-ios" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/RevenueCat/purchases-ios.git";
Expand All @@ -492,6 +508,11 @@
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
3776B9DD27E8B32D0042C494 /* OctoKit */ = {
isa = XCSwiftPackageProductDependency;
package = 3776B9DC27E8B32D0042C494 /* XCRemoteSwiftPackageReference "octokit" */;
productName = OctoKit;
};
37C9838627E4E5B8007C85E3 /* RevenueCat */ = {
isa = XCSwiftPackageProductDependency;
package = 37C9838527E4E5B8007C85E3 /* XCRemoteSwiftPackageReference "purchases-ios" */;
Expand Down

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

134 changes: 134 additions & 0 deletions CoffeeTracker/CoffeeTracker/About/UserFeedback.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
//
// UserFeedback.swift
// CoffeeTracker
//
// Created by Maegan Wilson on 3/21/22.
//

import SwiftUI
import OctoKit

struct UserFeedbackView: View {
@Environment(\.dismiss) private var dismiss

// @Binding var issueSubmitted: Bool?

@State private var title: String = ""
@State private var details: String = "Include any additional information here."
@State private var selectedFeedbackType: FeedbackType = .feature
@State private var buttonState: ButtonState = .neutral
@State private var errorText = ""

var body: some View {
Form {
Section {
TextField("Summary", text: $title)
} header: {
Text("Short summary")
}

Section {
Picker("Feedback", selection: $selectedFeedbackType) {
Text("Bug").tag(FeedbackType.bug)
Text("Feature Request").tag(FeedbackType.feature)
}.pickerStyle(.menu)
} header: {
Text("Type")
}

Section {
TextEditor(text: $details)
.frame(height: 100.0)
} header: {
Text("Feedback Details")
}

/// MARK: Submit Button
VStack {
Button(action: addIssueToGithub) {
switch buttonState {
case .neutral:
Text("\(Image(systemName: "paperplane")) Submit")
.frame(width: 200.0, height: 50.0)
.background(Color.blue)
case .error:
Text("\(Image(systemName: "paperplane")) Submit")
.frame(width: 200.0, height: 50.0)
.background((title.count == 0) ? Color.red : Color.blue)
case .sending:
Text("\(Image(systemName: "paperplane.fill")) Sending")
.frame(width: 200.0, height: 50.0)
.background(Color.gray)
case .sent:
Text("\(Image(systemName: "checkmark")) Submitted")
.frame(width: 200.0, height: 50.0)
.background(Color.green)
}
}
.animation(.easeInOut, value: buttonState)
.animation(.easeInOut, value: title)
.foregroundColor(Color.white)
.cornerRadius(10.0)

Text(errorText)
.foregroundColor(.red)
}.frame(maxWidth: .infinity)
.listRowBackground(Color.clear)
.listRowInsets(.init())
.border(.clear, width: 0)
}.navigationTitle("Feedback")
}

private enum ButtonState {
case neutral
case error
case sending
case sent
}

private enum FeedbackType: String {
case bug
case feature = "enhancement"
}

let config = TokenConfiguration(ProcessInfo.processInfo.environment["GitHubAPI"])

let appVersion: String = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "2022"
let appBuild: String = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "1"

private func addIssueToGithub() {
buttonState = .sending
let device = UIDevice()
var issueBody = "| Auto Gen | Information |\n"
issueBody += "|---|---|\n"
issueBody += "| Date | \(Date.now) |\n"
issueBody += "|App Version| \(appVersion) \(appBuild)|\n"
issueBody += "|OS Version| \(device.systemVersion)|\n"
issueBody += "|Device Model| \(device.model)|\n"
issueBody += "\n" + details + "\n"

Octokit(config).postIssue(owner: "CCTPlus",
repository: "coffeetracker",
title: title,
body: issueBody,
assignee: "maeganwilson",
labels: [selectedFeedbackType.rawValue]) { response in
switch response {
case .success:
buttonState = .sent
case .failure(let error):
print(error)
errorText = "No summary given."
buttonState = .error
}
}
}
}

struct UserFeedbackView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
UserFeedbackView()
}
}
}