givee

Categories iOS
Stack SwiftUI, SwiftData, EventKit

visão geral

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. O Givee nasceu disso: um lugar só para tudo isso, para nada se perder antes do aniversário de alguém.

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 tem busca e filtros de ordenação — recursos que fazem diferença quando a lista cresce.

trechos de código

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)")
        }
    }
}

escolhas de design

cores

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

tipografia

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

algumas fontes utilizadas neste projeto são proprietárias e podem não ser exibidas corretamente caso não estejam instaladas em seu sistema.

fundamentação

O design do Givee se baseia em uma metáfora de caderno digital, usando 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 cria uma hierarquia visual que puxa o olhar para títulos e nomes, e a fisicalidade dos traços de marcador dá a tudo uma sensação de scrapbook, não de banco de dados.

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. O resultado é algo que parece pessoal, não administrativo.

créditos

pessoas