Skip to content

Commit

Permalink
Merge pull request #16 from loloop/mc/beta-sheet-error-queue
Browse files Browse the repository at this point in the history
adds changelog, notification queue, categories page actually working and a bunch of other things
  • Loading branch information
loloop authored Nov 22, 2023
2 parents 7cffed1 + 1f1d3a0 commit 4deb02d
Show file tree
Hide file tree
Showing 41 changed files with 1,143 additions and 255 deletions.
37 changes: 36 additions & 1 deletion app/LandinhoLib/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,16 @@ let package = Package(
products: [
.library(name: "Admin", targets: ["Admin"]),
.library(name: "APIClient", targets: ["APIClient"]),
.library(name: "BetaSheet", targets: ["BetaSheet"]),
.library(name: "Categories", targets: ["Categories"]),
.library(name: "CategoriesAdmin", targets: ["CategoriesAdmin"]),
.library(name: "Common", targets: ["Common"]),
.library(name: "EventDetail", targets: ["EventDetail"]),
.library(name: "EventsAdmin", targets: ["EventsAdmin"]),
.library(name: "Home", targets: ["Home"]),
.library(name: "NotificationsQueue", targets: ["NotificationsQueue"]),
.library(name: "RacesAdmin", targets: ["RacesAdmin"]),
.library(name: "Router", targets: ["Router"]),
.library(name: "ScheduleList", targets: ["ScheduleList"]),
.library(name: "Settings", targets: ["Settings"]),
.library(name: "Sharing", targets: ["Sharing"]),
Expand All @@ -44,16 +47,22 @@ let package = Package(
.target(
name: "APIClient",
dependencies: [
"NotificationsQueue",
composable
]),

.target(
name: "Common"),
name: "BetaSheet",
dependencies: [
composable
]),

.target(
name: "Categories",
dependencies: [
"APIClient",
"NotificationsQueue",
"ScheduleList",
composable
]),

Expand All @@ -66,6 +75,9 @@ let package = Package(
composable
]),

.target(
name: "Common"),

.target(
name: "EventDetail",
dependencies: [
Expand All @@ -79,6 +91,7 @@ let package = Package(
dependencies: [
"APIClient",
"Common",
"NotificationsQueue",
composable
]),

Expand All @@ -92,12 +105,31 @@ let package = Package(
composable
]),

.target(
name: "NotificationsQueue",
dependencies: [
composable
]),

.target(
name: "RacesAdmin",
dependencies: [
"APIClient",
"Common",
"EventsAdmin",
"NotificationsQueue",
composable
]),

.target(
name: "Router",
dependencies: [
"Home",
"Categories",
"EventDetail",
"ScheduleList",
"Settings",
"Sharing",
composable
]),

Expand All @@ -115,13 +147,16 @@ let package = Package(
dependencies: [
"Admin",
"APIClient",
"BetaSheet",
"NotificationsQueue",
composable
]),

.target(
name: "Sharing",
dependencies: [
"Common",
"NotificationsQueue",
"WidgetUI",
composable
]),
Expand Down
10 changes: 8 additions & 2 deletions app/LandinhoLib/Sources/APIClient/APIClientService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
// Created by Mauricio Cardozo on 30/06/23.
//

import Foundation
import ComposableArchitecture
import Foundation
import NotificationsQueue

@_spi(Internal) public protocol APIClientServiceProtocol: DependencyKey, TestDependencyKey {
func request<T: Decodable>(
Expand All @@ -24,6 +25,8 @@ final class APIClientService: APIClientServiceProtocol {
static var liveValue: APIClientService = APIClientService()
public static let live: any APIClientServiceProtocol = APIClientService()

@Dependency(\.notificationQueue) var notificationQueue

var persistentHeaders: [String: String] = [
"Content-Type": "application/json",
"Accept": "application/json"
Expand Down Expand Up @@ -90,8 +93,11 @@ final class APIClientService: APIClientServiceProtocol {
let decoded = try decoder.decode(T.self, from: response.0)
return decoded
} catch(let error) {
let JSONString = String(data: response.0, encoding: .utf8)
notificationQueue.enqueue(.critical("Erro de conexão"))
notificationQueue.enqueue(.debug(JSONString ?? ""))
throw APIError(
jsonString: String(data: response.0, encoding: .utf8),
jsonString: JSONString,
innerError: error)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Race Car Illustration Rio Janeiro.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
180 changes: 180 additions & 0 deletions app/LandinhoLib/Sources/BetaSheet/BetaSheet.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
//
// File.swift
//
//
// Created by Mauricio Cardozo on 21/11/23.
//

import Foundation
import SwiftUI

public struct BetaSheet: View {

public init() {}

@Environment(\.dismiss) var dismiss

@State var isContinueEnabled: Bool = false

public var body: some View {
VStack {
ScrollView {
VStack(spacing: 30) {
Image("AppIcon", bundle: .module)
.resizable()
.frame(width: 250, height: 250, alignment: .center)
.clipShape(RoundedRectangle(cornerRadius: 35.0, style: .continuous))
.padding(.top)

Text("Bem vindo ao teste beta do VroomVroom!")
.font(.system(.largeTitle, design: .rounded, weight: .bold))
.multilineTextAlignment(.center)

TitleTextView(title: "Problemas conhecidos", text: issues)
TitleTextView(title: "Adicionados na última atualização", text: latestRelease)
TitleTextView(title: "Próximos passos", text: nextSteps)

Text("Para ver esta tela novamente, clique em Changelog na tela de Ajustes. Esta tela também aparecerá sempre que uma versão nova do app for lançada.")
.font(.headline)
.padding(.horizontal)
.onVisible {
isContinueEnabled = true
}
}
}

Button(action: {
dismiss()
}, label: {
Text("Continuar")
.padding(.vertical, 5)
.frame(maxWidth: .infinity)
})
.disabled(!isContinueEnabled)
.buttonStyle(.borderedProminent)
.padding([.horizontal, .bottom])
}
}

struct TitleTextView: View {
let title: LocalizedStringKey
let text: LocalizedStringKey

var body: some View {
VStack(alignment: .leading) {
Text(title)
.font(.title3)
.bold()
Text(text)
.font(.callout)
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal)
}
}

let issues: LocalizedStringKey = """
• Design obviamente não está nem um pouco próximo de estar pronto
• App não tem cache em nada. Tudo vai ser recarregado quando o app inicia
• A tela de categorias não tem função alguma. Quer ver as corridas de alguma categoria específica? Entra na tela de Admin pra ver
• Eventos principais na tela de detalhe não tem informação da data
• Quando existem apenas dois eventos principais na tela de detalhe, o layout é meio esquisito
• O botão de um Widget pequeno não está funcionando quando colocado na Home
• Na home provisória, passar para o próximo evento de um widget pequeno afeta TODOS os widgets pequenos
• Erros atualmente mostram o payload completo do erro
"""

let latestRelease: LocalizedStringKey = """
21/11
• Essa tela!
• Notificações de erro - Clica em "Termos de Serviço", "Sobre o Desenvolvedor" ou "Política de Privacidade" nos Ajustes pra testar
• Ícone novo
• Número da versão nos ajustes
• A tela de categorias agora funciona! Não, ainda não dá pra favoritar.
20/11
• WIP: É possível compartilhar uma imagem que tem os horários de uma corrida
• WIP: Tela de detalhes de uma corrida
Antes disso, não tava anotando a data 😂:
• Home placeholder com visualização dos Widgets
• Painel de administração
• Widget pequeno, médio e grande
"""

let nextSteps: LocalizedStringKey = """
Esta lista será completamente limpa antes do lançamento público do aplicativo
• Ícone de verdade desenhado por um ser humano e não a aberração atual
• Compartilhar uma corrida direto da Home
• Imagem de fundo ao compartilhar uma corrida por imagem
• Opção de remover sessões de treino de um Widget pequeno
• Compartilhar texto de uma corrida -> Estilo o bot
• Botão de voltar tela será reposicionado na tela de compartilhar corrida
• Parte de administração das categorias será escondida e protegida por senha
• Adicionar cores para as categorias
• O widget pequeno deixará de mostrar os horários de eventos que já se passaram (ex.: deixa de mostrar o treino livre se é a hora da classificação)
• Categorias terão uma "accent color"
• Home de verdade, com os horários de todas as categorias, categorias favoritas aparecendo primeiro e paginação
• App Clip
• Botão de compartilhar o app em Ajustes -> App Clip ou Link
• Tela sobre o desenvolvedor
• Ações rápidas no ícone do aplicativo
• Design final da Home, Tela de Corrida, Categorias, Ajustes, Compartilhar, etc para iOS e iPadOS
• Widget extra-largo para iPads
Para o futuro:
• Notificações quando eventos específicos forem começar
• Enviar feedback de horário direto numa corrida
• Pedir horário da próxima corrida para a Siri
• Busca de Categorias
• Easter egg com Live Activity na busca de Categorias -> Você poderá criar um lembrete para a tela de notificações a partir de uma busca
• Suporte a Deep Links, para compartilhar o link de uma corrida - Leva para o CalendarioF1 se for F1
• Suporte a mais de um fuso horário
• App de visionOS
• App de macOS
• Widgets de Lock Screen
• Widgets de watchOS
• App de watchOS
• App de tvOS
"""
}

#Preview {
BetaSheet()
}

// https://stackoverflow.com/questions/60595900/how-to-check-if-a-view-is-displayed-on-the-screen-swift-5-and-swiftui
public extension View {
func onVisible(perform action: @escaping () -> Void) -> some View {
modifier(BecomingVisible(action: action))
}
}

private struct BecomingVisible: ViewModifier {

@State var action: (() -> Void)?

func body(content: Content) -> some View {
content.overlay {
GeometryReader { proxy in
Color.clear
.preference(
key: VisibleKey.self,
// See discussion!
value: UIScreen.main.bounds.intersects(proxy.frame(in: .global))
)
.onPreferenceChange(VisibleKey.self) { isVisible in
guard isVisible, let action else { return }
action()
self.action = nil
}
}
}
}

struct VisibleKey: PreferenceKey {
static var defaultValue: Bool = false
static func reduce(value: inout Bool, nextValue: () -> Bool) { }
}
}
Loading

0 comments on commit 4deb02d

Please sign in to comment.