@momo-kits/native-kits 0.162.44-debug → 0.162.45-debug
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +45 -3
- package/README.md +2 -2
- package/compose/build.gradle.kts +9 -1
- package/compose/build.gradle.kts.backup +8 -0
- package/compose/compose.podspec +1 -1
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +2 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +6 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +351 -111
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +20 -21
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +2 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +4 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +9 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +11 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +4 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +10 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +6 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +55 -22
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +12 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +7 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +13 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +13 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +3 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +14 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +19 -21
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +5 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +3 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +7 -15
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +2 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +1 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +314 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +43 -4
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +8 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +10 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +4 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +6 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +197 -60
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +127 -83
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +54 -62
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +97 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +377 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +122 -24
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +34 -14
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +3 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +1 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +116 -26
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +1 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +192 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +2 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +3 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +13 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +13 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +4 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +94 -0
- package/gradle/libs.versions.toml +1 -1
- package/gradle.properties +1 -1
- package/ios/Application/ApplicationEnvironment.swift +17 -0
- package/ios/Application/MaxApi.swift +30 -3
- package/ios/Avatar/Avatar.swift +4 -3
- package/ios/Badge/Badge.swift +6 -4
- package/ios/Badge/BadgeDot.swift +1 -1
- package/ios/Badge/BadgeRibbon.swift +0 -1
- package/ios/Button/Button.swift +15 -12
- package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +64 -18
- package/ios/Carousel/Carousel.swift +29 -12
- package/ios/Checkbox/Checkbox.swift +7 -3
- package/ios/Chip/Chip.swift +5 -4
- package/ios/Collapse/Collapse.swift +70 -19
- package/ios/Colors+Radius+Spacing/Colors.swift +10 -1
- package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
- package/ios/DateTimePicker/DateTimePicker.swift +54 -20
- package/ios/DateTimePicker/WheelPicker.swift +103 -105
- package/ios/Divider/Divider.swift +37 -4
- package/ios/Extensions/Color++.swift +38 -9
- package/ios/Extensions/OptionalEnvironmentObject.swift +12 -0
- package/ios/Extensions/SkeletonUICompat.swift +11 -0
- package/ios/Icon/Icon.swift +21 -23
- package/ios/Icon/Icons.swift +1329 -0
- package/ios/IconButton/IconButton.swift +15 -7
- package/ios/Image/Image.swift +7 -23
- package/ios/Information/Information.swift +27 -9
- package/ios/Input/ErrorView.swift +2 -2
- package/ios/Input/Input.swift +160 -147
- package/ios/Input/InputPhoneNumber.swift +12 -9
- package/ios/Input/InputSearch.swift +107 -77
- package/ios/Input/InputTextArea.swift +128 -145
- package/ios/InputDropDown/InputDropDown.swift +10 -7
- package/ios/InputMoney/InputMoney.swift +33 -11
- package/ios/InputOTP/InputOTP.swift +22 -12
- package/ios/Layout/Card.swift +50 -0
- package/ios/Layout/GridContext.swift +187 -3
- package/ios/Layout/Item.swift +5 -4
- package/ios/Layout/ScreenLayout.swift +385 -0
- package/ios/Layout/Section.swift +4 -100
- package/ios/Loader/Loader.swift +5 -9
- package/ios/Lottie/LottieView.swift +14 -2
- package/ios/{Application/Navigation/Overplay → Navigation}/BottomSheet.swift +169 -29
- package/ios/Navigation/BottomTab/BottomTab.swift +332 -0
- package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTabBar.swift +18 -7
- package/ios/Navigation/BottomTab/DuoBarCompression.swift +104 -0
- package/ios/Navigation/BottomTab/DuoTabBar.swift +329 -0
- package/ios/{Application → Navigation/Component}/FloatingButton.swift +43 -54
- package/ios/Navigation/Component/Header.swift +545 -0
- package/ios/Navigation/Component/HeaderBackground.swift +154 -0
- package/ios/Navigation/Component/HeaderJourney.swift +73 -0
- package/ios/Navigation/Component/HeaderLocation.swift +48 -0
- package/ios/Navigation/Component/HeaderRight.swift +425 -0
- package/ios/Navigation/Component/HeaderTitle.swift +36 -0
- package/ios/{Application/Navigation → Navigation/Component}/HeaderUser.swift +21 -24
- package/ios/Navigation/Component/SideBar.swift +183 -0
- package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +8 -8
- package/ios/Navigation/HostBackGestureBridge.swift +78 -0
- package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +9 -2
- package/ios/Navigation/Navigation.swift +204 -0
- package/ios/Navigation/NavigationContainer.swift +195 -0
- package/ios/{Application/Navigation → Navigation}/Navigator.swift +207 -107
- package/ios/Navigation/StackScreen.swift +930 -0
- package/ios/Navigation/StackTransition.swift +400 -0
- package/ios/Navigation/SwipeBackHaptic.swift +33 -0
- package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
- package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
- package/ios/Pagination/PaginationScroll.swift +2 -2
- package/ios/Popup/PopupDisplay.swift +72 -135
- package/ios/Popup/PopupInput.swift +10 -13
- package/ios/Popup/PopupLayout.swift +140 -0
- package/ios/Popup/PopupNotify.swift +59 -69
- package/ios/Popup/PopupPromotion.swift +31 -47
- package/ios/PopupView/FullscreenPopup.swift +13 -19
- package/ios/PopupView/PopupView.swift +1 -1
- package/ios/PopupView/Utils++.swift +0 -8
- package/ios/ProgressInfo/ProgressInfo.swift +4 -2
- package/ios/Radio/Radio.swift +2 -1
- package/ios/Rating/Rating.swift +9 -1
- package/ios/Resources/dot_loading.json +558 -0
- package/ios/Resources/lottie_circle_loader.json +1 -0
- package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
- package/ios/Skeleton/Skeleton.swift +22 -27
- package/ios/Slider/Slider.swift +16 -18
- package/ios/Stepper/Stepper.swift +6 -1
- package/ios/Steps/Steps.swift +8 -6
- package/ios/SuggestAction/SuggestAction.swift +5 -0
- package/ios/Swipeable/SwipeCell.swift +10 -6
- package/ios/Switch/Switch.swift +22 -20
- package/ios/TabView/TabView.swift +102 -21
- package/ios/Tag/Tag.swift +15 -4
- package/ios/Template/Logo/Logo.swift +2 -1
- package/ios/Template/TrustBanner/TrustBanner.swift +106 -54
- package/ios/Title/Title.swift +6 -17
- package/ios/Tooltip/Tooltip.swift +29 -14
- package/ios/Typography/FontScale.swift +3 -3
- package/ios/Typography/Text.swift +81 -19
- package/ios/Uploader/Uploader.swift +3 -1
- package/ios/native-kits.podspec +2 -1
- package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +80 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +2 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +173 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +1 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +2 -2
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +2 -0
- package/package.json +1 -1
- package/scripts/gen-ios-icons.mjs +36 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
- package/ios/Application/Components.swift +0 -270
- package/ios/Application/ComposeApi.swift +0 -22
- package/ios/Application/HeaderRight.swift +0 -306
- package/ios/Application/Navigation/BottomTab/BottomTab.swift +0 -104
- package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
- package/ios/Application/Navigation/HeaderTitle.swift +0 -57
- package/ios/Application/Navigation/NavigationContainer.swift +0 -213
- package/ios/Application/Navigation/NavigationOptions.swift +0 -109
- package/ios/Application/Navigation/NavigatorManager.swift +0 -22
- package/ios/Application/Navigation/component/Header.swift +0 -178
- package/ios/Application/Navigation/component/HeaderBackground.swift +0 -83
- package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
- package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
- package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
- package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -196
- package/ios/Application/Screen.swift +0 -250
- package/ios/Application/StackScreen.swift +0 -492
- /package/ios/{Application/Navigation → Navigation}/BottomTab/CurvedContainer.swift +0 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NavigationContainer.swift
|
|
3
|
+
// MoMoUIKits
|
|
4
|
+
//
|
|
5
|
+
// SwiftUI mirror of Compose's `navigation/NavigationContainer.kt`: hosts the kit stack
|
|
6
|
+
// (`StackHost`, the NavHost counterpart), injects Navigator, theme, localize and font scale, and
|
|
7
|
+
// renders every registered screen inside `StackScreen` chrome built from its options.
|
|
8
|
+
//
|
|
9
|
+
|
|
10
|
+
import SwiftUI
|
|
11
|
+
|
|
12
|
+
public struct NavigationContainer<Initial: View>: View {
|
|
13
|
+
@StateObject private var navigator: Navigator
|
|
14
|
+
@StateObject private var applicationEnvironment: ApplicationEnvironment
|
|
15
|
+
@StateObject private var localize: Localize
|
|
16
|
+
|
|
17
|
+
@Environment(\.appTheme) private var parentTheme
|
|
18
|
+
|
|
19
|
+
private let setNavigator: ((Navigator) -> Void)?
|
|
20
|
+
private let composeApi: KitComposeApi?
|
|
21
|
+
private let maxApi: MaxApi?
|
|
22
|
+
private let initialTheme: Theme?
|
|
23
|
+
|
|
24
|
+
/// `initialTheme` nil keeps the theme the host already put in the environment.
|
|
25
|
+
public init(
|
|
26
|
+
initialScreenName: String = "",
|
|
27
|
+
@ViewBuilder initialScreen: @escaping () -> Initial,
|
|
28
|
+
options: NavigationOptions? = nil,
|
|
29
|
+
initialTheme: Theme? = nil,
|
|
30
|
+
applicationContext: MiniAppContext? = nil,
|
|
31
|
+
composeApi: KitComposeApi? = nil,
|
|
32
|
+
config: KitConfig? = nil,
|
|
33
|
+
maxApi: MaxApi? = nil,
|
|
34
|
+
localize: Localize? = nil,
|
|
35
|
+
setNavigator: ((Navigator) -> Void)? = nil
|
|
36
|
+
) {
|
|
37
|
+
let nav = Navigator(
|
|
38
|
+
initialScreenName: initialScreenName.isEmpty ? (options?.screenName ?? "") : initialScreenName,
|
|
39
|
+
initialContent: { AnyView(initialScreen()) },
|
|
40
|
+
options: options,
|
|
41
|
+
composeApi: composeApi
|
|
42
|
+
)
|
|
43
|
+
nav.maxApi = maxApi
|
|
44
|
+
_navigator = StateObject(wrappedValue: nav)
|
|
45
|
+
_applicationEnvironment = StateObject(
|
|
46
|
+
wrappedValue: ApplicationEnvironment(
|
|
47
|
+
applicationContext: applicationContext,
|
|
48
|
+
composeApi: composeApi,
|
|
49
|
+
config: config,
|
|
50
|
+
maxApi: maxApi
|
|
51
|
+
)
|
|
52
|
+
)
|
|
53
|
+
// AI-GENERATED START: default to the app-language-observing shared Localize
|
|
54
|
+
_localize = StateObject(wrappedValue: localize ?? Localize.shared)
|
|
55
|
+
// AI-GENERATED END: default to the app-language-observing shared Localize
|
|
56
|
+
self.composeApi = composeApi
|
|
57
|
+
self.maxApi = maxApi
|
|
58
|
+
self.initialTheme = initialTheme
|
|
59
|
+
self.setNavigator = setNavigator
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// RN parity: the theme's own header image wins; config `headerBar` is only the fallback.
|
|
63
|
+
private var resolvedTheme: Theme {
|
|
64
|
+
let theme = initialTheme ?? parentTheme
|
|
65
|
+
guard !theme.assets.isHeaderImage,
|
|
66
|
+
let headerBar = applicationEnvironment.config?.headerBar, !headerBar.isEmpty else {
|
|
67
|
+
return theme
|
|
68
|
+
}
|
|
69
|
+
return theme.copy(assets: ThemeAssets(headerBackground: headerBar))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public var body: some View {
|
|
73
|
+
StackHost(
|
|
74
|
+
navigator: navigator,
|
|
75
|
+
entries: navigator.entries,
|
|
76
|
+
screen: { [navigator] entry in
|
|
77
|
+
guard let screen = navigator.registry.getScreen(id: entry.id) else { return AnyView(EmptyView()) }
|
|
78
|
+
return AnyView(ScreenHost(screen: screen, navigator: navigator))
|
|
79
|
+
},
|
|
80
|
+
decorate: { AnyView(withKitEnvironment($0)) }
|
|
81
|
+
)
|
|
82
|
+
// edge to edge: each screen's hosting controller takes the safe area and keyboard itself
|
|
83
|
+
.ignoresSafeArea()
|
|
84
|
+
.onAppear {
|
|
85
|
+
if navigator.composeApi == nil {
|
|
86
|
+
navigator.composeApi = composeApi
|
|
87
|
+
}
|
|
88
|
+
if navigator.maxApi == nil {
|
|
89
|
+
navigator.maxApi = maxApi
|
|
90
|
+
}
|
|
91
|
+
setNavigator?(navigator)
|
|
92
|
+
// Idempotent, so a re-appear won't double-count.
|
|
93
|
+
HostBackGestureBridge.shared.attach(navigator)
|
|
94
|
+
// AI-GENERATED START: demote the MaxApi language pull to a seed of last resort
|
|
95
|
+
// Only a seed: a Localize with a language source already tracks the host in both
|
|
96
|
+
// directions, so asking maxApi would just race it. `changeLanguage` normalizes the
|
|
97
|
+
// raw response and hops to main itself.
|
|
98
|
+
guard !localize.observesAppLanguage else { return }
|
|
99
|
+
maxApi?.getLanguage { data in
|
|
100
|
+
localize.changeLanguage(data?["response"] as? String)
|
|
101
|
+
}
|
|
102
|
+
// AI-GENERATED END: demote the MaxApi language pull to a seed of last resort
|
|
103
|
+
}
|
|
104
|
+
.onDisappear {
|
|
105
|
+
HostBackGestureBridge.shared.detach(navigator)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private func withKitEnvironment<Content: View>(_ content: Content) -> some View {
|
|
110
|
+
content
|
|
111
|
+
.environmentObject(navigator)
|
|
112
|
+
.environmentObject(applicationEnvironment)
|
|
113
|
+
.environment(\.applicationEnvironment, applicationEnvironment)
|
|
114
|
+
.environment(\.appTheme, resolvedTheme)
|
|
115
|
+
.momoLocalize(localize)
|
|
116
|
+
.momoFontScale(context: applicationEnvironment.applicationContext)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// MARK: - ScreenHost
|
|
121
|
+
|
|
122
|
+
private struct ScreenHost: View {
|
|
123
|
+
let screen: DynamicScreen
|
|
124
|
+
let navigator: Navigator
|
|
125
|
+
@StateObject private var navigation: Navigation
|
|
126
|
+
|
|
127
|
+
init(screen: DynamicScreen, navigator: Navigator) {
|
|
128
|
+
self.screen = screen
|
|
129
|
+
self.navigator = navigator
|
|
130
|
+
_navigation = StateObject(
|
|
131
|
+
wrappedValue: Navigation(id: screen.id, options: screen.options, registry: navigator.registry)
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
var body: some View {
|
|
136
|
+
OptionsStackScreen(
|
|
137
|
+
options: navigation.options,
|
|
138
|
+
screenName: screen.name,
|
|
139
|
+
goBack: { navigator.onBackSafe() },
|
|
140
|
+
content: screen.content
|
|
141
|
+
)
|
|
142
|
+
// Compose draws the overplay inside the screen it was shown over, under its LocalNavigation.
|
|
143
|
+
.overlay { OverplayLayer(screenId: screen.id) }
|
|
144
|
+
.environmentObject(navigation)
|
|
145
|
+
.momoScreenLayout()
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private struct OverplayLayer: View {
|
|
150
|
+
let screenId: Int
|
|
151
|
+
@EnvironmentObject private var navigator: Navigator
|
|
152
|
+
|
|
153
|
+
var body: some View {
|
|
154
|
+
if let item = navigator.overplay, item.screenId == screenId {
|
|
155
|
+
OverplayHost(item: item)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// MARK: - Overplay host
|
|
161
|
+
|
|
162
|
+
private struct OverplayHost: View {
|
|
163
|
+
let item: OverplayItem
|
|
164
|
+
@EnvironmentObject var navigator: Navigator
|
|
165
|
+
|
|
166
|
+
var body: some View {
|
|
167
|
+
// Each component self-animates on appear and drives its own exit through
|
|
168
|
+
// the Navigator before the item is removed (mirrors Compose's overplay).
|
|
169
|
+
switch item.type {
|
|
170
|
+
case .modal:
|
|
171
|
+
ModalScreen(overplayId: item.id, barrierDismissible: item.barrierDismissible) {
|
|
172
|
+
item.content()
|
|
173
|
+
}
|
|
174
|
+
.id(item.id)
|
|
175
|
+
case .bottomSheet:
|
|
176
|
+
BottomSheetView(
|
|
177
|
+
overplayId: item.id,
|
|
178
|
+
header: item.header ?? .title(),
|
|
179
|
+
isSurface: item.isSurface,
|
|
180
|
+
barrierDismissible: item.barrierDismissible,
|
|
181
|
+
draggable: item.draggable,
|
|
182
|
+
useBottomInset: item.useBottomInset,
|
|
183
|
+
footer: item.footer
|
|
184
|
+
) {
|
|
185
|
+
item.content()
|
|
186
|
+
}
|
|
187
|
+
.id(item.id)
|
|
188
|
+
case .snackBar:
|
|
189
|
+
if let snackBar = item.snackBar {
|
|
190
|
+
SnackBarView(overplayId: item.id, snackBar: snackBar, bottomInset: navigator.snackBarBottomInset())
|
|
191
|
+
.id(item.id)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|