Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@

import com.reactnativenavigation.options.params.Bool;
import com.reactnativenavigation.options.params.NullBool;
import com.reactnativenavigation.options.params.NullText;
import com.reactnativenavigation.options.params.Text;
import com.reactnativenavigation.options.parsers.BoolParser;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class ModalOptions {

public static ModalOptions parse(final JSONObject json) {
Expand All @@ -17,15 +23,41 @@ public static ModalOptions parse(final JSONObject json) {
options.presentationStyle = ModalPresentationStyle.fromString(json.optString("modalPresentationStyle"));
options.blurOnUnmount = BoolParser.parse(json, "blurOnUnmount");

JSONObject modal = json.optJSONObject("modal");
if (modal != null) {
options.swipeToDismiss = BoolParser.parse(modal, "swipeToDismiss");
options.prefersGrabberVisible = BoolParser.parse(modal, "prefersGrabberVisible");
options.selectedDetent = parseText(modal, "selectedDetent");
options.largestUndimmedDetent = parseText(modal, "largestUndimmedDetent");
options.detents = ModalSheetDetentParser.parse(modal.optJSONArray("detents"));
}

return options;
}

private static Text parseText(JSONObject json, String key) {
if (!json.has(key)) {
return new NullText();
}
return new Text(json.optString(key));
}

public ModalPresentationStyle presentationStyle = ModalPresentationStyle.Unspecified;
public @NonNull Bool blurOnUnmount = new NullBool();
public @NonNull Bool swipeToDismiss = new NullBool();
public @NonNull Bool prefersGrabberVisible = new NullBool();
public @NonNull Text selectedDetent = new NullText();
public @NonNull Text largestUndimmedDetent = new NullText();
public @NonNull List<ModalSheetDetent> detents = new ArrayList<>();

public void mergeWith(final ModalOptions other) {
if (other.presentationStyleHasValue()) presentationStyle = other.presentationStyle;
if (other.blurOnUnmount.hasValue()) blurOnUnmount = other.blurOnUnmount;
if (other.swipeToDismiss.hasValue()) swipeToDismiss = other.swipeToDismiss;
if (other.prefersGrabberVisible.hasValue()) prefersGrabberVisible = other.prefersGrabberVisible;
if (other.selectedDetent.hasValue()) selectedDetent = other.selectedDetent;
if (other.largestUndimmedDetent.hasValue()) largestUndimmedDetent = other.largestUndimmedDetent;
if (!other.detents.isEmpty()) detents = other.detents;
}

private boolean presentationStyleHasValue() {
Expand All @@ -35,6 +67,20 @@ private boolean presentationStyleHasValue() {
public void mergeWithDefault(final ModalOptions defaultOptions) {
if (!presentationStyleHasValue()) presentationStyle = defaultOptions.presentationStyle;
if (!blurOnUnmount.hasValue()) blurOnUnmount = defaultOptions.blurOnUnmount;
if (!swipeToDismiss.hasValue()) swipeToDismiss = defaultOptions.swipeToDismiss;
if (!prefersGrabberVisible.hasValue()) prefersGrabberVisible = defaultOptions.prefersGrabberVisible;
if (!selectedDetent.hasValue()) selectedDetent = defaultOptions.selectedDetent;
if (!largestUndimmedDetent.hasValue()) largestUndimmedDetent = defaultOptions.largestUndimmedDetent;
if (detents.isEmpty()) detents = defaultOptions.detents;
}

public boolean hasSheetPresentationOptions() {
return !detents.isEmpty()
|| selectedDetent.hasValue()
|| prefersGrabberVisible.hasValue();
}

public boolean isPageSheetPresentation() {
return presentationStyle == ModalPresentationStyle.PageSheet;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
public enum ModalPresentationStyle {
Unspecified("unspecified"),
None("none"),
OverCurrentContext("overCurrentContext");
OverCurrentContext("overCurrentContext"),
PageSheet("pageSheet");

public String name;

Expand All @@ -12,11 +13,17 @@ public enum ModalPresentationStyle {
}

public static ModalPresentationStyle fromString(String name) {
if (name == null) {
return Unspecified;
}
switch (name) {
case "none":
return None;
case "overCurrentContext":
return OverCurrentContext;
case "pageSheet":
case "formSheet":
return PageSheet;
default:
return Unspecified;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.reactnativenavigation.options;

public class ModalSheetDetent {

public enum Type {
SYSTEM,
CUSTOM
}

public Type type;
public String systemId;
public String customId;
public float height;

public static ModalSheetDetent system(String id) {
ModalSheetDetent detent = new ModalSheetDetent();
detent.type = Type.SYSTEM;
detent.systemId = id;
return detent;
}

public static ModalSheetDetent custom(String id, float height) {
ModalSheetDetent detent = new ModalSheetDetent();
detent.type = Type.CUSTOM;
detent.customId = id;
detent.height = height;
return detent;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.reactnativenavigation.options;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class ModalSheetDetentParser {

public static List<ModalSheetDetent> parse(JSONArray json) {
if (json == null) {
return new ArrayList<>();
}
List<ModalSheetDetent> detents = new ArrayList<>();
for (int i = 0; i < json.length(); i++) {
ModalSheetDetent detent = parseDetent(json.opt(i));
if (detent != null) {
detents.add(detent);
}
}
return detents;
}

private static ModalSheetDetent parseDetent(Object item) {
if (item instanceof String) {
return ModalSheetDetent.system(((String) item).toLowerCase());
}
if (!(item instanceof JSONObject)) {
return null;
}
JSONObject dict = (JSONObject) item;
String id = dict.optString("id", null);
if (id == null || id.isEmpty()) {
return null;
}
double height = dict.optDouble("height", 0);
if (height <= 0) {
return null;
}
return ModalSheetDetent.custom(id, (float) height);
}
}
Loading