From 38a202109db76d3c0d0bfea801bb506f70d805db Mon Sep 17 00:00:00 2001 From: Giovanni Date: Wed, 2 Sep 2026 00:31:04 +0200 Subject: [PATCH] add a view to list worlds --- WorldBuilder/AppRouter.swift | 20 +++++++++++ WorldBuilder/Components/MainTabView.swift | 14 +++++--- WorldBuilder/Models/World.swift | 26 ++++++++++++++ .../Views/CreateWorld/CreateWorldView.swift | 34 ++++++++++++++----- WorldBuilder/Views/Home/HomeView.swift | 3 +- .../Views/WorldList/WorldListView.swift | 23 ++++++++++++- WorldBuilder/WorldBuilderApp.swift | 5 +++ 7 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 WorldBuilder/AppRouter.swift create mode 100644 WorldBuilder/Models/World.swift diff --git a/WorldBuilder/AppRouter.swift b/WorldBuilder/AppRouter.swift new file mode 100644 index 0000000..efe0f43 --- /dev/null +++ b/WorldBuilder/AppRouter.swift @@ -0,0 +1,20 @@ +// +// AppRouter.swift +// WorldBuilder +// +// Created by Giovanni Josserand on 01/09/2026. +// + +import SwiftUI + +@Observable +class AppRouter { + var selectedTab: AppTab = .home +} + + + +enum AppTab: Hashable { + case home + case worldsList +} diff --git a/WorldBuilder/Components/MainTabView.swift b/WorldBuilder/Components/MainTabView.swift index b2e4f28..60b53c1 100644 --- a/WorldBuilder/Components/MainTabView.swift +++ b/WorldBuilder/Components/MainTabView.swift @@ -7,19 +7,23 @@ import SwiftUI struct MainTabView: View { + @Environment(AppRouter.self) private var router + var body : some View { - TabView { + @Bindable var router = router + + TabView(selection: $router.selectedTab) { NavigationStack { HomeView() - }.tabItem { - Label("Accueil", systemImage: "house") } + .tabItem {Label("Accueil", systemImage: "house")} + .tag(AppTab.home) NavigationStack { WorldListView() - }.tabItem { - Label("Mes mondes", systemImage: "globe.europe.africa") } + .tabItem {Label("Mes mondes", systemImage: "globe.europe.africa")} + .tag(AppTab.worldsList) } } } diff --git a/WorldBuilder/Models/World.swift b/WorldBuilder/Models/World.swift new file mode 100644 index 0000000..447240f --- /dev/null +++ b/WorldBuilder/Models/World.swift @@ -0,0 +1,26 @@ +// +// World.swift +// WorldBuilder +// +// Created by Giovanni Josserand on 01/09/2026. +// + +import SwiftData +import Foundation + +@Model +class World { + var id : UUID + var createdAt : Date + var updatedAt : Date + var name : String + var overview : String + + init(name: String, overview: String) { + self.id = UUID() + self.name = name + self.overview = overview + self.createdAt = Date() + self.updatedAt = Date() + } +} diff --git a/WorldBuilder/Views/CreateWorld/CreateWorldView.swift b/WorldBuilder/Views/CreateWorld/CreateWorldView.swift index b6a5d2c..3e2726c 100644 --- a/WorldBuilder/Views/CreateWorld/CreateWorldView.swift +++ b/WorldBuilder/Views/CreateWorld/CreateWorldView.swift @@ -6,11 +6,19 @@ // import SwiftUI +import SwiftData struct CreateWorldView: View { @State private var worldName = "" - @State private var worldDescription = "" - + @State private var worldOverview = "" + + @Environment(\.modelContext) private var context + @Environment(\.dismiss) private var dismiss + @Environment(AppRouter.self) private var router + + @State private var showSaveError = false + @State private var saveErrorMessage = "" + var body: some View { Form { Section("Informations") { @@ -18,14 +26,23 @@ struct CreateWorldView: View { TextField( "Description", - text: $worldDescription, + text: $worldOverview, axis: .vertical ) } Section { Button("Créer le monde") { - createWorld() + let world = World(name: worldName, overview: worldOverview) + context.insert(world) + do { + try context.save() + router.selectedTab = .worldsList + dismiss() + }catch { + saveErrorMessage = "Impossible de sauvegarder le monde : \(error.localizedDescription)" + showSaveError = true + } } .disabled(worldName.isEmpty) .padding(.horizontal, 24) @@ -39,9 +56,10 @@ struct CreateWorldView: View { } .navigationTitle("Créer un monde") .navigationBarTitleDisplayMode(.inline) - } - - private func createWorld() { - print("Création du monde : \(worldName)") + .alert("Erreur", isPresented: $showSaveError) { + Button("OK") { } + } message: { + Text(saveErrorMessage) + } } } diff --git a/WorldBuilder/Views/Home/HomeView.swift b/WorldBuilder/Views/Home/HomeView.swift index 3ff2648..656ac7d 100644 --- a/WorldBuilder/Views/Home/HomeView.swift +++ b/WorldBuilder/Views/Home/HomeView.swift @@ -11,6 +11,7 @@ struct HomeView : View { var body: some View { NavigationLink("Créer un monde"){ CreateWorldView() - }.buttonStyle(.glass) + } + .buttonStyle(.glass) } } diff --git a/WorldBuilder/Views/WorldList/WorldListView.swift b/WorldBuilder/Views/WorldList/WorldListView.swift index 1e1afcd..61b4731 100644 --- a/WorldBuilder/Views/WorldList/WorldListView.swift +++ b/WorldBuilder/Views/WorldList/WorldListView.swift @@ -6,9 +6,30 @@ // import SwiftUI +import SwiftData struct WorldListView: View { + @Environment(\.modelContext) private var context + @Query(sort: \World.createdAt, order: .reverse) private var worlds: [World] + var body: some View { - Text("My worlds") + Group { + if worlds.isEmpty { + Text("Aucun monde") + NavigationLink("Créer un monde"){ + CreateWorldView() + } + .buttonStyle(.glass) + }else{ + List { + ForEach(worlds) {world in + Text(world.name) + Text(world.overview) + } + } + } + } + .navigationTitle("Mes mondes") + .navigationBarTitleDisplayMode(.inline) } } diff --git a/WorldBuilder/WorldBuilderApp.swift b/WorldBuilder/WorldBuilderApp.swift index c54f553..91810f4 100644 --- a/WorldBuilder/WorldBuilderApp.swift +++ b/WorldBuilder/WorldBuilderApp.swift @@ -6,12 +6,17 @@ // import SwiftUI +import SwiftData @main struct WorldBuilderApp: App { + @State private var router = AppRouter() + var body: some Scene { WindowGroup { ContentView() + .environment(router) } + .modelContainer(for: World.self) } }