Something went wrong. Try again.
Something went wrong. Try again.
9.4 kB · 293 lines
Swift
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294//// ShortcutsView.swift// shortcut//// Created by Bailey Townsend on 6/24/25.//
import SwiftUI
struct DocumentationView: View {
@State private var searchText = "" var intentDocs: [IntentDoc] = [] var examples: [Example] = []
init() { let docs = IntentsDocumentation() intentDocs.append(docs.makeAPostDoc()) intentDocs.append(docs.createARecordDoc()) intentDocs.append(docs.getServiceAuthDoc()) intentDocs.append(docs.createATIDDoc()) intentDocs.append(docs.getDownloadBlobsDoc()) intentDocs.append(docs.deleteARecordDoc()) intentDocs.append(docs.getALocalAtIdentifierDoc()) intentDocs.append(docs.getARecordDoc()) intentDocs.append(docs.getRepoDoc()) intentDocs.append(docs.getListBlobsDoc()) intentDocs.append(docs.listRecordsDoc()) intentDocs.append(docs.putARecordDoc()) intentDocs.append(docs.resolveADidOrHandleDoc()) intentDocs.append(docs.createUpdateProfileDoc())
// intentDocs.append(docs.createUTCDoc()) examples = Examples.getExamples() }
var filteredItems: [IntentDoc] { if searchText.isEmpty { return intentDocs } else { return intentDocs.filter { item in item.name.key.localizedCaseInsensitiveContains(searchText) || item.description.key.localizedCaseInsensitiveContains(searchText) } } }
var filteredExamples: [Example] { if searchText.isEmpty { return examples } else { return examples.filter { item in item.title.key.localizedCaseInsensitiveContains(searchText) } } }
var body: some View { NavigationStack { List { Section(header: Text("Actions")) { ForEach(filteredItems, id: \.id) { item in NavigationLink { IntentDocumentationView(intentDoc: item) } label: { Label("\(item.name)", systemImage: item.icon) } } } Section(header: Text("Examples")) { ForEach(filteredExamples, id: \.id) { item in NavigationLink { ExampleView(example: item) // IntentDocumentationView(intentDoc: item) } label: { Label("\(item.title)", systemImage: item.icon) } } } } .navigationTitle("Shortcut actions") .searchable(text: $searchText, prompt: "Search items...") .toolbar { ToolbarItem(placement: .topBarLeading) { Link("Shortcuts", destination: URL(string: "shortcuts://")!) } } } }}
struct IntentDocumentationView: View { let intentDoc: IntentDoc
var body: some View { ScrollView { VStack(alignment: .leading, spacing: 24) { // Header Section headerSection
// Description Section descriptionSection
// Parameters Section if !intentDoc.parameters.isEmpty { parametersSection }
// Result Section if let result = intentDoc.result { resultSection(result) } } .padding() } // .navigationTitle(String(localized: intentDoc.name)) // .navigationBarTitleDisplayMode }
// MARK: - Header Section private var headerSection: some View { HStack(spacing: 16) { Image(systemName: intentDoc.icon) .font(.system(size: 40)) .foregroundColor(.accentColor) .frame(width: 60, height: 60) .background( Circle() .fill(Color.accentColor.opacity(0.1)) )
VStack(alignment: .leading, spacing: 4) { Text(intentDoc.name) .font(.title2) .fontWeight(.bold) if let docUrl = intentDoc.docUrl { Link(docUrl.text, destination: docUrl.url) } // Text("Intent Documentation") // .font(.caption) // .foregroundColor(.secondary) }
Spacer() } .padding(.vertical, 8) }
// MARK: - Description Section private var descriptionSection: some View { DocumentationSection(title: "Description", icon: "doc.text") { Text(intentDoc.description) .font(.body) .foregroundColor(.primary) } }
// MARK: - Parameters Section private var parametersSection: some View { DocumentationSection(title: "Parameters", icon: "list.bullet") { LazyVStack(spacing: 12) { ForEach(Array(intentDoc.parameters.enumerated()), id: \.offset) { index, parameter in ParameterCard(parameter: parameter) } } } }
// MARK: - Result Section private func resultSection(_ result: AppEntityResult) -> some View { DocumentationSection(title: "Result", icon: "return") { VStack(alignment: .leading, spacing: 16) { // Result Overview VStack(alignment: .leading, spacing: 8) { Text(result.name) .font(.headline) .foregroundColor(.primary)
Text(result.description) .font(.body) .foregroundColor(.secondary) } .padding() .background( RoundedRectangle(cornerRadius: 12) .fill(Color(.systemGray6)) )
// Result Parameters if !result.parameters.isEmpty { VStack(alignment: .leading, spacing: 12) { Text("Result Properties") .font(.subheadline) .fontWeight(.semibold) .foregroundColor(.primary)
ForEach(Array(result.parameters), id: \.id) { parameter in ParameterCard(parameter: parameter, isCompact: true) } } } } } }}
// MARK: - Supporting Views
struct DocumentationSection<Content: View>: View { let title: String let icon: String let content: Content
init(title: String, icon: String, @ViewBuilder content: () -> Content) { self.title = title self.icon = icon self.content = content() }
var body: some View { VStack(alignment: .leading, spacing: 16) { HStack(spacing: 8) { Image(systemName: icon) .foregroundColor(.accentColor) .font(.system(size: 16, weight: .medium))
Text(title) .font(.title3) .fontWeight(.semibold)
Spacer() }
content } .padding() .background( RoundedRectangle(cornerRadius: 16) .fill(Color(.systemBackground)) .shadow(color: .black.opacity(0.05), radius: 8, x: 0, y: 2) ) }}
struct ParameterCard: View { let parameter: IntentParameter let isCompact: Bool
init(parameter: IntentParameter, isCompact: Bool = false) { self.parameter = parameter self.isCompact = isCompact }
var body: some View { VStack(alignment: .leading, spacing: isCompact ? 6 : 8) { HStack { Text(parameter.name) .font(isCompact ? .subheadline : .headline) .fontWeight(.medium) .foregroundColor(.primary)
Spacer()
Text(parameter.type) .font(.caption) .fontWeight(.medium) .foregroundColor(.white) .padding(.horizontal, 8) .padding(.vertical, 4) .background( Capsule() .fill(Color.accentColor) ) } if let description = parameter.description { Text(description) .font(isCompact ? .caption : .body) .foregroundColor(.secondary) .fixedSize(horizontal: false, vertical: true) }
} .padding(isCompact ? 12 : 16) .background( RoundedRectangle(cornerRadius: 12) .fill(Color(.systemGray6)) ) }}#Preview { DocumentationView()}