diff --git a/Sources/LiveViewNative/ModifierStack.swift b/Sources/LiveViewNative/ModifierStack.swift new file mode 100644 index 000000000..229c91aad --- /dev/null +++ b/Sources/LiveViewNative/ModifierStack.swift @@ -0,0 +1,33 @@ +// +// ModifierStack.swift +// +// +// Created by Carson Katri on 6/29/23. +// + +import SwiftUI + +/// A container that decodes a modifier stack. +/// +/// Use this as a modifier: +/// +/// ```swift +/// content +/// .modifier(modifierStack) +/// ``` +public struct _ModifierStack: Decodable, ViewModifier { + private let stack: [ModifierContainer] + + @ObservedElement private var element + @LiveContext private var context + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + self.stack = try container.decode([ModifierContainer].self) + } + + public func body(content: Content) -> some View { + content + .applyModifiers(stack[...], element: element, context: context.storage) + } +} diff --git a/lib/live_view_native_swift_ui/types/modifier_stack.ex b/lib/live_view_native_swift_ui/types/modifier_stack.ex new file mode 100644 index 000000000..093c0ce4d --- /dev/null +++ b/lib/live_view_native_swift_ui/types/modifier_stack.ex @@ -0,0 +1,7 @@ +defmodule LiveViewNativeSwiftUi.Types.ModifierStack do + use LiveViewNativePlatform.Modifier.Type + def type, do: :map + + def cast(%LiveViewNativeSwiftUi.Modifiers{} = value), do: {:ok, Jason.decode!(Jason.encode!(value))} + def cast(_), do: :error +end