gaivoronskii.com

import SwiftUI

struct User {

    struct Contacts {
        var phone: String
        var email: String
    }

    struct Location {
        var city: String
        var country: String
    }

    var name: String
    var about: String
    var contacts: Contacts
    var location: Location

    init() {
        self.name = "Andrei Gaivoronskii"
        self.about = "Making  Apps. From Russia With ♥. Fitness Enthusiast."

        self.contacts = .init(phone: "+7 911 100 01 05",
                              email: "andrei@gaivoronskii.com")

        self.location = .init(city: "Saint-Petersburg",
                              country: "Russia")
    }
}

struct MyCV {

    struct Job {
        var company: String
        var startDate: String
        var endDate: String? = nil
    }

    struct App {
        var name: String
        var link: String
    }

    var user: User
    var jobs: [Job]
    var apps: [App]

    init() {
        self.user = User()
        self.jobs = [
            .init(company: "Flow Health", startDate: "March 2022"),
            .init(company: "Beshenya Sushka", startDate: "December 2016", endDate: "October 2020"),
            .init(company: "Louis Vuitton", startDate: "September 2011", endDate: "January 2015"),
        ]
        self.apps = [
            .init(name: "RUN", link: "https://apps.apple.com/app/id1535400615"),
            .init(name: "BS365", link: "https://apps.apple.com/app/id1381169094"),
            .init(name: "Walker", link: "https://apps.apple.com/app/id1455639400"),
            .init(name: "Wallet", link: "https://apps.apple.com/app/id1038175626"),
            .init(name: "Fitness", link: "https://apps.apple.com/app/id1097500008"),
            .init(name: "QR Code", link: "https://apps.apple.com/app/id1604886331"),
            .init(name: "Activity", link: "https://apps.apple.com/app/id1427590589"),
        ]
    }
}

struct ContentView: View {

    private let myCV = MyCV()

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 8) {
                userView()
                locationView()
                contactsView()
                experienceView()
                applicationsView()
            }
            .padding()
        }
    }

    @ViewBuilder private func userView() -> some View {
        Text(myCV.user.name)
            .font(.title)
            .fontWeight(.bold)

        Text(myCV.user.about)
            .padding(.vertical)
            .foregroundColor(.secondary)
    }

    @ViewBuilder private func titleView(title: String) -> some View {
        Divider()
        Text(title)
            .underline()
            .font(.headline)
    }

    @ViewBuilder private func locationView() -> some View {
        titleView(title: "Location:")
        Text("\(myCV.user.location.city), \(myCV.user.location.country)")
            .padding(.bottom)
    }

    @ViewBuilder private func contactsView() -> some View {
        titleView(title: "Contacts:")
        HStack {
            Image(systemName: "phone.fill")
            Text(myCV.user.contacts.phone)
        }
        HStack {
            Image(systemName: "envelope.fill")
            Text(myCV.user.contacts.email)
        }
        .padding(.bottom)
    }

    @ViewBuilder private func experienceView() -> some View {
        titleView(title: "Experience:")

        ForEach(myCV.jobs, id: \.company) { job in
            VStack(alignment: .leading, spacing: 8) {
                Text(job.company)
                    .font(.system(size: 20, weight: .semibold, design: .monospaced))
                Text("\(job.startDate) - \(job.endDate ?? "Present")")
                    .font(.subheadline)
                    .foregroundColor(.secondary)
            }
            .padding(.bottom)
        }
    }

    @ViewBuilder private func applicationsView() -> some View {
        titleView(title: "Applications:")

        LazyVGrid(columns: columns, alignment: .leading, spacing: 12) {
            ForEach(myCV.apps, id: \.name) { app in
                if let url = URL(string: app.link) {
                    Link(app.name, destination: url)
                        .font(.system(size: 20, weight: .semibold, design: .monospaced))
                }
            }
        }
    }

    private let columns = [
        GridItem(.flexible()),
        GridItem(.flexible()),
    ]
}