feat:add prompt for android and iOS

This commit is contained in:
pengfei.zhou 2019-11-20 21:04:27 +08:00
parent 2290c8cd48
commit ec854ebe71
5 changed files with 172 additions and 3 deletions

View File

@ -19,6 +19,10 @@ import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import pub.doric.DoricContext; import pub.doric.DoricContext;
@ -119,7 +123,7 @@ public class ModalPlugin extends DoricJavaPlugin {
JSValue okBtn = jsObject.getProperty("okLabel"); JSValue okBtn = jsObject.getProperty("okLabel");
JSValue cancelBtn = jsObject.getProperty("cancelLabel"); JSValue cancelBtn = jsObject.getProperty("cancelLabel");
AlertDialog.Builder builder = new AlertDialog.Builder(getDoricContext().getContext(), R.style.Theme_Doric_Modal_Alert); AlertDialog.Builder builder = new AlertDialog.Builder(getDoricContext().getContext(), R.style.Theme_Doric_Modal_Confirm);
if (titleVal.isString()) { if (titleVal.isString()) {
builder.setTitle(titleVal.asString().value()); builder.setTitle(titleVal.asString().value());
} }
@ -155,4 +159,69 @@ public class ModalPlugin extends DoricJavaPlugin {
promise.reject(new JavaValue(e.getLocalizedMessage())); promise.reject(new JavaValue(e.getLocalizedMessage()));
} }
} }
@DoricMethod(name = "prompt", thread = ThreadMode.UI)
public void prompt(JSDecoder decoder, final DoricPromise promise) {
try {
JSObject jsObject = decoder.decode().asObject();
JSValue titleVal = jsObject.getProperty("title");
JSValue msgVal = jsObject.getProperty("msg");
JSValue okBtn = jsObject.getProperty("okLabel");
JSValue cancelBtn = jsObject.getProperty("cancelLabel");
JSValue defaultVal = jsObject.getProperty("defaultText");
JSValue text = jsObject.getProperty("text");
AlertDialog.Builder builder = new AlertDialog.Builder(getDoricContext().getContext(), R.style.Theme_Doric_Modal_Prompt);
if (titleVal.isString()) {
builder.setTitle(titleVal.asString().value());
}
String okLabel = getDoricContext().getContext().getString(android.R.string.ok);
if (okBtn.isString()) {
okLabel = okBtn.asString().value();
}
String cancelLabel = getDoricContext().getContext().getString(android.R.string.cancel);
if (cancelBtn.isString()) {
cancelLabel = cancelBtn.asString().value();
}
View v = LayoutInflater.from(getDoricContext().getContext()).inflate(R.layout.doric_modal_prompt, null);
TextView tvMsg = v.findViewById(R.id.tv_msg);
tvMsg.setText(msgVal.asString().value());
final EditText editText = v.findViewById(R.id.edit_input);
if (defaultVal.isString()) {
editText.setHint(defaultVal.asString().value());
}
if (text.isString()) {
editText.setText(text.asString().value());
editText.setSelection(text.asString().value().length());
}
builder.setView(v);
builder
.setPositiveButton(okLabel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
promise.resolve(new JavaValue(editText.getText().toString()));
}
})
.setNegativeButton(cancelLabel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
promise.reject(new JavaValue(editText.getText().toString()));
}
});
builder.setCancelable(false);
try {
builder.show();
} catch (Exception e) {
e.printStackTrace();
}
} catch (ArchiveException e) {
e.printStackTrace();
promise.reject(new JavaValue(e.getLocalizedMessage()));
}
}
} }

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="15dp"
android:paddingRight="15dp">
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp" />
<EditText
android:id="@+id/edit_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Theme.Doric.Modal.Prompt.EditText" />
</LinearLayout>

View File

@ -100,14 +100,45 @@ class ModalDemo extends Panel {
okLabel: "OkLabel", okLabel: "OkLabel",
cancelLabel: 'CancelLabel', cancelLabel: 'CancelLabel',
}).then( }).then(
e => { () => {
modal(context).toast('Clicked OK.') modal(context).toast('Clicked OK.')
}, },
e => { () => {
modal(context).toast('Clicked Cancel.') modal(context).toast('Clicked Cancel.')
}) })
} }
} as IText), } as IText),
text({
text: "Prompt",
layoutConfig: layoutConfig().w(LayoutSpec.AT_MOST),
textSize: 30,
textColor: Color.WHITE,
bgColor: colors[4],
textAlignment: Gravity.Center,
height: 50,
}),
label('Click me').apply({
width: 200,
height: 50,
bgColor: colors[0],
textSize: 30,
textColor: Color.WHITE,
layoutConfig: layoutConfig().exactly(),
onClick: () => {
modal(context).prompt({
msg: 'This is Prompt.',
title: 'Prompt title',
okLabel: "OkLabel",
cancelLabel: 'CancelLabel',
}).then(
e => {
modal(context).toast(`Clicked OK.Input:${e}`)
},
e => {
modal(context).toast(`Clicked Cancel.Input:${e}`)
})
}
} as IText),
]).apply({ ]).apply({
layoutConfig: layoutConfig().atmost().h(LayoutSpec.WRAP_CONTENT), layoutConfig: layoutConfig().atmost().h(LayoutSpec.WRAP_CONTENT),
gravity: Gravity.Center, gravity: Gravity.Center,

View File

@ -74,4 +74,42 @@ - (void)confirm:(NSDictionary *)dic withPromise:(DoricPromise *)promise {
[vc presentViewController:alert animated:YES completion:nil]; [vc presentViewController:alert animated:YES completion:nil];
}); });
} }
- (void)prompt:(NSDictionary *)dic withPromise:(DoricPromise *)promise {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:dic[@"title"]
message:dic[@"msg"]
preferredStyle:UIAlertControllerStyleAlert];
NSString *placeholder = dic[@"defaultText"];
NSString *preText = dic[@"text"];
[alert addTextFieldWithConfigurationHandler:^(UITextField *_Nonnull textField) {
if (placeholder.length > 0) {
textField.placeholder = placeholder;
}
if (preText.length > 0) {
textField.text = preText;
}
}];
__weak typeof(alert) _alert = alert;
UIAlertAction *okAction = [UIAlertAction actionWithTitle:dic[@"okLabel"] ?: NSLocalizedString(@"Ok", nil)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
__strong typeof(_alert) alert = _alert;
[promise resolve:alert.textFields.lastObject.text];
}];
[alert addAction:okAction];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:dic[@"cancelLabel"] ?: NSLocalizedString(@"Cancel", nil)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
__strong typeof(_alert) alert = _alert;
[promise reject:alert.textFields.lastObject.text];
}];
[alert addAction:cancelAction];
UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
[vc presentViewController:alert animated:YES completion:nil];
});
}
@end @end

View File

@ -47,5 +47,15 @@ export function modal(context: BridgeContext) {
return context.modal.confirm(arg) return context.modal.confirm(arg)
} }
}, },
prompt: (arg: {
title?: string,
msg?: string,
okLabel?: string,
cancelLabel?: string,
text?: string,
defaultText?: string,
}) => {
return context.modal.prompt(arg)
},
} }
} }