diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabOptions.java b/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabOptions.java index 2f2c614dd0f..1aa1fb01e9f 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabOptions.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabOptions.java @@ -12,6 +12,7 @@ import com.reactnativenavigation.parse.params.Text; import com.reactnativenavigation.parse.parsers.BoolParser; import com.reactnativenavigation.parse.parsers.ColorParser; +import com.reactnativenavigation.parse.parsers.IconParser; import com.reactnativenavigation.parse.parsers.NumberParser; import com.reactnativenavigation.parse.parsers.TextParser; import com.reactnativenavigation.utils.TypefaceLoader; @@ -29,8 +30,8 @@ public static BottomTabOptions parse(TypefaceLoader typefaceManager, JSONObject options.text = TextParser.parse(json, "text"); options.textColor = ColorParser.parse(json, "textColor"); options.selectedTextColor = ColorParser.parse(json, "selectedTextColor"); - if (json.has("icon")) options.icon = TextParser.parse(json.optJSONObject("icon"), "uri"); - if (json.has("selectedIcon")) options.selectedIcon = TextParser.parse(json.optJSONObject("selectedIcon"), "uri"); + options.icon = IconParser.parse(json, "icon"); + options.selectedIcon = IconParser.parse(json, "selectedIcon"); options.iconColor = ColorParser.parse(json, "iconColor"); options.selectedIconColor = ColorParser.parse(json, "selectedIconColor"); options.badge = TextParser.parse(json, "badge"); diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/parse/parsers/IconParser.java b/lib/android/app/src/main/java/com/reactnativenavigation/parse/parsers/IconParser.java new file mode 100644 index 00000000000..766cdf5e141 --- /dev/null +++ b/lib/android/app/src/main/java/com/reactnativenavigation/parse/parsers/IconParser.java @@ -0,0 +1,21 @@ +package com.reactnativenavigation.parse.parsers; + +import com.reactnativenavigation.parse.params.NullText; +import com.reactnativenavigation.parse.params.Text; + +import org.json.JSONException; +import org.json.JSONObject; + +import javax.annotation.Nullable; + +public class IconParser { + public static Text parse(@Nullable JSONObject json, String key) { + if (json == null) return new NullText(); + try { + return json.get(key) instanceof String ? TextParser.parse(json, key) : TextParser.parse(json.optJSONObject(key), "uri"); + } catch (JSONException e) { + e.printStackTrace(); + } + return new NullText(); + } +} diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/StackBehaviour.java b/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/StackBehaviour.java index e8e65146480..de6513443e6 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/StackBehaviour.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/StackBehaviour.java @@ -12,7 +12,7 @@ import androidx.annotation.NonNull; import androidx.coordinatorlayout.widget.CoordinatorLayout; -public class StackBehaviour extends BehaviourDelegate { +public class StackBehaviour extends BehaviourDelegate { public StackBehaviour(BehaviourAdapter delegate) { super(delegate); } diff --git a/lib/src/commands/OptionsProcessor.ts b/lib/src/commands/OptionsProcessor.ts index 50d09375ce6..334303b1d7c 100644 --- a/lib/src/commands/OptionsProcessor.ts +++ b/lib/src/commands/OptionsProcessor.ts @@ -1,8 +1,9 @@ -import isEqual from 'lodash/isEqual' -import isObject from 'lodash/isObject' -import isArray from 'lodash/isArray' -import endsWith from 'lodash/endsWith' -import forEach from 'lodash/forEach' +import isEqual from 'lodash/isEqual'; +import isObject from 'lodash/isObject'; +import isArray from 'lodash/isArray'; +import isString from 'lodash/isString'; +import endsWith from 'lodash/endsWith'; +import forEach from 'lodash/forEach'; import { Store } from '../components/Store'; import { UniqueIdProvider } from '../adapters/UniqueIdProvider'; @@ -53,7 +54,7 @@ export class OptionsProcessor { endsWith(key, 'Icon') || endsWith(key, 'Image') ) { - options[key] = this.assetService.resolveFromRequire(value); + options[key] = isString(value) ? value : this.assetService.resolveFromRequire(value); } } diff --git a/lib/src/interfaces/Options.ts b/lib/src/interfaces/Options.ts index 1a61dbd18d2..df131305444 100644 --- a/lib/src/interfaces/Options.ts +++ b/lib/src/interfaces/Options.ts @@ -549,6 +549,8 @@ export interface DotIndicatorOptions { visible?: boolean; } +export type ImageResource = string; + export interface OptionsBottomTab { dotIndicator?: DotIndicatorOptions; @@ -572,7 +574,7 @@ export interface OptionsBottomTab { * Set the tab icon * Note: On Android `icon` is required */ - icon?: ImageRequireSource; + icon?: ImageRequireSource | ImageResource; /** * Set the icon tint */ diff --git a/playground/ios/playground/Images.xcassets/AppIcon.appiconset/Contents.json b/playground/ios/playground/Images.xcassets/AppIcon.appiconset/Contents.json index 3e9f06923b4..21788b29412 100644 --- a/playground/ios/playground/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/playground/ios/playground/Images.xcassets/AppIcon.appiconset/Contents.json @@ -65,6 +65,11 @@ "idiom" : "iphone", "filename" : "Icon-180.png", "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/playground/ios/playground/Images.xcassets/icon_res.imageset/Contents.json b/playground/ios/playground/Images.xcassets/icon_res.imageset/Contents.json new file mode 100644 index 00000000000..9406bf2c2cd --- /dev/null +++ b/playground/ios/playground/Images.xcassets/icon_res.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "clear@2x.ios.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/playground/ios/playground/Images.xcassets/icon_res.imageset/clear@2x.ios.png b/playground/ios/playground/Images.xcassets/icon_res.imageset/clear@2x.ios.png new file mode 100644 index 00000000000..7c489c148fe Binary files /dev/null and b/playground/ios/playground/Images.xcassets/icon_res.imageset/clear@2x.ios.png differ diff --git a/playground/ios/playground/clear@2x.ios.png b/playground/ios/playground/clear@2x.ios.png new file mode 100644 index 00000000000..7c489c148fe Binary files /dev/null and b/playground/ios/playground/clear@2x.ios.png differ