diff --git a/File Templates/MVVM-Reducer.xctemplate/TemplateInfo.plist b/File Templates/MVVM-Reducer.xctemplate/TemplateInfo.plist index e9d583e..1f37485 100644 --- a/File Templates/MVVM-Reducer.xctemplate/TemplateInfo.plist +++ b/File Templates/MVVM-Reducer.xctemplate/TemplateInfo.plist @@ -7,9 +7,9 @@ Kind Xcode.IDEFoundation.TextSubstitutionFileTemplateKind Description - A SwiftUI custom view with preview and library content provider + A SwiftUI screen with MVVM architecture using OversizeArchitecture Summary - SwiftUI View + MVVM Screen SortOrder 1 AllowedTypes @@ -19,9 +19,9 @@ Platforms DefaultCompletionName - ___VARIABLE_productName___Screen + Screen MainTemplateFile - ___VARIABLE_productName___Screen.swift + ___VARIABLE_productName___.swift CFBundleIdentifier Image diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___.swift new file mode 100644 index 0000000..68a9ec4 --- /dev/null +++ b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___.swift @@ -0,0 +1,10 @@ +// ___FILEHEADER___ + +import OversizeArchitecture + +@Module +public enum ___FILEBASENAMEASIDENTIFIER___: ModuleProtocol {} + +public struct ___VARIABLE_productName___Input: Sendable {} + +public struct ___VARIABLE_productName___Output: Sendable {} diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___View.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___View.swift new file mode 100644 index 0000000..20e69b2 --- /dev/null +++ b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___View.swift @@ -0,0 +1,28 @@ +// ___FILEHEADER___ + +import OversizeArchitecture +import OversizeNavigation +import OversizeUI +import SwiftUI + +@View(module: ___VARIABLE_productName___.self) +public struct ___FILEBASENAMEASIDENTIFIER___: ViewProtocol { + public var body: some View { + NavigationLayoutView("Title") { + content + } background: { + Color.backgroundSecondary + } + .toolbarTitleDisplayMode(.inline) + } + + var content: some View { + Text("Content") + } +} + +#Preview { + NavigationStack { + ___VARIABLE_productName___.build() + } +} diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___ViewModel.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___ViewModel.swift new file mode 100644 index 0000000..15ba665 --- /dev/null +++ b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___ViewModel.swift @@ -0,0 +1,6 @@ +// ___FILEHEADER___ + +import OversizeArchitecture + +@ViewModel(module: ___VARIABLE_productName___.self) +public actor ___FILEBASENAMEASIDENTIFIER___: ViewModelProtocol {} diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___ViewState.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___ViewState.swift new file mode 100644 index 0000000..8bfe17d --- /dev/null +++ b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___/___VARIABLE_productName___ViewState.swift @@ -0,0 +1,10 @@ +// ___FILEHEADER___ + +import Observation +import OversizeArchitecture +import SwiftUI + +@Observable +public final class ___FILEBASENAMEASIDENTIFIER___: ViewStateProtocol { + public init(input: ___VARIABLE_productName___.Input?) {} +} diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___Reducer.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___Reducer.swift deleted file mode 100644 index 398591e..0000000 --- a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___Reducer.swift +++ /dev/null @@ -1,17 +0,0 @@ -// ___FILEHEADER___ - -import Foundation - -public final class ___FILEBASENAMEASIDENTIFIER___: Sendable { - private let viewModel: ___VARIABLE_productName___ViewModel - - public init(viewModel: ___VARIABLE_productName___ViewModel) { - self.viewModel = viewModel - } - - func callAsFunction(_ event: ___VARIABLE_productName___ViewModel.InputEvent, function _: String = #function, file _: String = #file) { - Task { - await viewModel.handleEvent(event) - } - } -} diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___Screen.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___Screen.swift deleted file mode 100644 index 425de79..0000000 --- a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___Screen.swift +++ /dev/null @@ -1,32 +0,0 @@ -// ___FILEHEADER___ - -import OversizeUI -import SwiftUI - -public struct ___FILEBASENAMEASIDENTIFIER___: View { - - @State var viewState: ___VARIABLE_productName___ViewState - let reducer: ___VARIABLE_productName___Reducer - - // Initial - public init(viewState: ___VARIABLE_productName___ViewState, reducer: ___VARIABLE_productName___Reducer) { - self.viewState = viewState - self.reducer = reducer - } - public var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -public extension ___FILEBASENAMEASIDENTIFIER___ { - static func build() -> some View { - let viewState = ___VARIABLE_productName___ViewState() - let viewModel = ___VARIABLE_productName___ViewModel(state: viewState) - let reducer = ___VARIABLE_productName___Reducer(viewModel: viewModel) - return ___FILEBASENAMEASIDENTIFIER___(viewState: viewState, reducer: reducer) - } -} - -#Preview { - ___FILEBASENAMEASIDENTIFIER___.build() -} diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___ViewModel.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___ViewModel.swift deleted file mode 100644 index 4f0264c..0000000 --- a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___ViewModel.swift +++ /dev/null @@ -1,32 +0,0 @@ -// ___FILEHEADER___ - -import SwiftUI - -extension ___FILEBASENAMEASIDENTIFIER___ { - enum InputEvent { - case onAppear - } -} - -public actor ___FILEBASENAMEASIDENTIFIER___ { - /// ViewState - public var state: ___VARIABLE_productName___ViewState - - /// Initialization - public init(state: ___VARIABLE_productName___ViewState) { - self.state = state - } - - func handleEvent(_ event: InputEvent) async { - switch event { - case .onAppear: - await onAppear() - } - } -} - -// MARK: - User Actions - -public extension ___FILEBASENAMEASIDENTIFIER___ { - func onAppear() async { } -} diff --git a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___ViewState.swift b/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___ViewState.swift deleted file mode 100644 index 3d15646..0000000 --- a/File Templates/MVVM-Reducer.xctemplate/___VARIABLE_productName___Screen/___VARIABLE_productName___ViewState.swift +++ /dev/null @@ -1,19 +0,0 @@ -// ___FILEHEADER___ - -import SwiftUI - -@MainActor -@Observable -public final class ___FILEBASENAMEASIDENTIFIER___: Sendable { - - /// Initialization - public init() {} -} - -// MARK: - User Actions - -public extension ___FILEBASENAMEASIDENTIFIER___ { - func update(_ handler: @Sendable @MainActor (___VARIABLE_productName___ViewState) -> Void) async { - await MainActor.run { handler(self) } - } -}