givee

Categories iOS
Stack SwiftUI, SwiftData, EventKit

overview

O Givee foi o primeiro grande projeto de aplicativo do qual participei. Ele surgiu na Apple Developer Academy, quando fomos desafiados a desenvolver um app sobre qualquer tema que resolvesse a dor de alguém. A ideia surgiu enquanto discutíamos problemas comuns que as pessoas enfrentam ao dar presentes, como não lembrar de datas, do que cada pessoa gosta e do preço de muitos objetos pelos quais as pessoas expressam interesse. Assim, o Givee surgiu com o objetivo de centralizar o planejamento de presentes, eliminando a necessidade de anotações espalhadas e esquecimentos de última hora.

O aplicativo permite que os usuários criem perfis para cada pessoa importante, registrando datas comemorativas (como aniversários e bodas) e associando ideias de presentes a elas. Cada item na lista de presentes pode incluir notas detalhadas, estimativas de preços e links diretos para compra.

No backend local, usamos SwiftData para criar relacionamentos entre os perfis dos usuários, suas datas importantes e os presentes sugeridos. Um recurso técnico fundamental foi a integração com o EventKit, que permite aos usuários exportar datas registradas no app diretamente para o calendário nativo do iOS, para que nenhum aniversário seja esquecido. A interface em SwiftUI foi projetada para ser limpa e eficiente, com funcionalidades de busca e filtros de ordenação para gerenciar listas extensas facilmente.

tech stack

SwiftUI
framework de UI
SwiftData
persistência local
EventKit
integração com calendário

code snippets

Usamos o EventKit para conectar os lembretes de presentes ao calendário do sistema. O código cria eventos de dia inteiro com recorrência anual para datas importantes, garantindo que o cronograma do usuário esteja acessível em todos os seus dispositivos.

class CalendarManager: ObservableObject {
    private let eventStore = EKEventStore()
    @Published var authorizationStatus: EKAuthorizationStatus = .notDetermined
    
    func requestAccess() {
        eventStore.requestFullAccessToEvents { granted, error in
            DispatchQueue.main.async {
                self.authorizationStatus = granted ? .authorized : .denied
            }
        }
    }
    
    func createEvent(title: String, date: Date) {
        let event = EKEvent(eventStore: eventStore)
        event.title = title
        event.startDate = date
        event.endDate = date
        event.isAllDay = true
        event.calendar = eventStore.defaultCalendarForNewEvents
        
        let recurrenceRule = EKRecurrenceRule(
            recurrenceWith: .yearly,
            interval: 1,
            end: nil
        )
        event.recurrenceRules = [recurrenceRule]
        
        do {
            try eventStore.save(event, span: .thisEvent)
            print("Event Created")
        } catch {
            print("Error creating event: \(error.localizedDescription)")
        }
    }
}

design choices

palette

papel #F4F2F2
grafite #757575
oceano #80AFBD
menta #7FBD8C
blush #E9B8E8
coral #F8CFC9
marcador #F5FF62
cítrico #FFDFBB

typography

SF Pro Display / títulos e texto primário
Zebras jogam xadrez com o velho faquir
SF Pro Rounded / rótulos e tom casual
Zebras jogam xadrez com o velho faquir

some fonts used in this project are proprietary and may not display correctly if they are not installed on your system.

rationale

O design do Givee se baseia em uma metáfora de caderno digital, utilizando a cor paper (#F4F2F2) para estabelecer um tom caloroso e acessível. Ao evitar o branco clínico, o app parece mais um rascunho ou bloco de notas. Isso combina com o processo iterativo de presentear, onde ideias costumam ser semi-formadas antes da compra final.

O elemento mais distintivo é o uso de cores de destaque (ocean, blush, citrus, etc.) implementadas via ZStacks. No código (como em GiftTitleView e NameSectionView), essas cores aparecem como retângulos deslocados atrás do texto, mimetizando a ação física de usar um marcador de texto. Isso cumpre um propósito funcional ao criar uma hierarquia visual clara que atrai o olhar para títulos e nomes, enquanto reforça o sentimento artesanal e tátil que transforma elementos padrão de UI do iOS em algo personalizado.

Essa abordagem continua com fontes arredondadas e formas suaves. Como presentear é algo pessoal, evitei listas frias estilo planilha. Ao estilizar componentes como DateCapsule e TagView com tons de coral, o app trata perfis como entradas valiosas de um scrapbook, não meros pontos de dados. Isso faz o usuário sentir que está cultivando um relacionamento, não apenas gerenciando tarefas.

credits