@tuofeng/react-native-dialogs
v1.0.3
Published
React Native wrappers for https://github.com/afollestad/material-dialogs
Downloads
5
Maintainers
Readme
react-native-dialogs
An Android only module for Material Design dialogs. This is a wrapper over afollestad/material-dialogs. This module is designed for Android only with no plans to support iOS.
Table of Contents
Installation
Install:
Link:
react-native link react-native-dialogs
- Or if this fails, link manually using these steps
Compile application using
react-native run-android
Manual Linking
Follow these steps if automatic linking (react-native link
) failed.
In
android/app/build.gradle
, add the dependency to your app build:dependencies { ... compile project(':react-native-dialogs') // Add this }
In
android/build.gradle
, it should already be there, but in case it is not, add Jitpack maven repository to download the library afollestad/material-dialogs:allprojects { repositories { ... jcenter() // Add this if it is not already here ... } }
In
android/settings.gradle
:rootProject.name = ... ... include ':react-native-dialogs' // Add this project(':react-native-dialogs').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-dialogs/android') // Add this ... include ':app'
Import and add package, in
android/app/src/main/.../MainApplication.java
:... import android.app.Application; ... import com.aakashns.reactnativedialogs.ReactNativeDialogsPackage; // Add new import ... public class MainApplication extends Application implements ReactApplication { ... @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), ... new ReactNativeDialogsPackage() // Add the package here ); } }
Usage
Import it in your JS:
import DialogAndroid from 'react-native-dialogs';
Call API:
class Blah extends Component { render() { return <Button title="Show DialogAndroid" onPress={this.showDialogAndroid} /> } showDialogAndroid = async () => { const { action } = await DialogAndroid.alert('Title', 'Message'); switch (action) { case DialogAndroid.actionPositive: console.log('positive!') break; case DialogAndroid.actionNegative: console.log('negative!') break; case DialogAndroid.actionNeutral: console.log('netural!') break; case DialogAndroid.actionDismiss: console.log('dismissed!') break; } } }
API
Properties
defaults
{ positiveText: 'OK' }
The default options to be used by all methods. To modify this, either directly manipulate with DialogAndroid.defaults = { ... }
or use assignDefaults
actionDismiss
static actionDismiss = "actionDismiss"
actionNegative
static actionNegative = "actionNegative"
actionNeutral
static actionNeutral = "actionNeutral"
actionPositive
static actionPositive = "actionPositive"
listPlain
static listPlain = "listPlain"
listRadio
static listRadio = "listRadio"
listCheckbox
static listCheckbox = "listCheckbox"
progressHorizontal
static progressHorizontal = "progressHorizontal"
Methods
alert
static alert( title: Title, content: Content, options: OptionsAlert ): Promise< {| action: "actionDismiss" | "actionNegative" | "actionNeutral" | "actionPositive" |} | {| action: "actionDismiss" | "actionNegative" | "actionNeutral" | "actionPositive", checked: boolean |} >
Shows a dialog.
| Parameter | Type | Default | Required | Description |
|-----------|--------------------------------------|---------|----------|------------------------------------------|
| title | string, null, void
| | | Title of dialog |
| content | string, null, void
| | | Message of dialog |
| options | OptionsAlert
| | | See OptionsAlert
|
assignDefaults
static assignDefaults({ [string]: value ): void
Set default colors for example, so you don't have to provide it on every method call.
{ positiveText: 'OK' }
dismiss
static dismiss(): void
Hides the currently showing dialog.
prompt
static prompt( title?: null | string, content?: null | string, options: OptionsPrompt ): Promise< {| action: "actionNegative" | "actionNeutral" | "actionDismiss" |} | {| action: "actionNegative" | "actionNeutral", checked: boolean |} | {| action: "actionPositive", text: string |} | {| action: "actionPositive", text: string, checked: boolean |} >
Shows a dialog with a text input field.
| Parameter | Type | Default | Required | Description |
|-----------|----------------------------------------|---------|----------|--------------------------------------------|
| title | string, null, void
| | | Title of dialog |
| content | string, null, void
| | | Message of dialog |
| options | OptionsPrompt
| | | See OptionsPrompt
|
showPicker
static showPicker( title?: null | string, content?: null | string, options: OptionsPicker ): Promise< {| action: "actionNegative" | "actionNeutral" | "actionDismiss" |} | {| action: "actionNegative" | "actionNeutral" | "actionDismiss", checked: boolean |} | {| action: "actionSelect", selectedItem: ListItem |} | {| action: "actionSelect", selectedItem: ListItem, checked: boolean |} | {| action: "actionSelect", selectedItems: ListItem[] |} | {| action: "actionSelect", selectedItems: ListItem[], checked: boolean |} >
Shows a regular alert, but also with items that can be selected.
| Parameter | Type | Default | Required | Description |
|-----------|------------------------------------------|---------|----------|--------------------------------------------|
| title | string, null, void
| | | Title of dialog |
| content | string, null, void
| | | Message of dialog |
| options | OptionsPicker
| | | See OptionsPrompt
|
showProgress
static showProgress( content?: null | string, options: OptionsProgress ): Promise<{| action:"actionDismiss" |}>
Shows a progress dialog. By default no buttons are shown, and hardware back button does not close it. You must close it with DialogAndroid.dismiss()
.
| Parameter | Type | Default | Required | Description |
|-----------|--------------------------------------------|---------|----------|----------------------------------------------|
| content | string, null, void
| | | Message of dialog |
| options | OptionsProgress
| | | See OptionsPrompt
|
Types
Flow is used as the typing system.
Internal Types
type ActionType
"actionDismiss" | "actionNegative" | "actionNeutral" | "actionPositive" | "actionSelect"
type ListItem
{ label:string } | { label:string, id:any } | {}
Notes
- If
label
key does not exist, specify which key should be used as the label withlabelKey
property ofOptionsPicker
. id
is only required ifselectedId
/selectedIds
needs to be used.- If
id
key does not exist, specify which key should be used as the id withidKey
property ofOptionsPicker
.
- If
type ListType
"listCheckbox" | "listPlain" | "listRadio"
type OptionsAlert
{ ...OptionsCommon, ...OptionsAlert }
| Key | Type | Default | Required | Description |
|--------------------|--------------------------------------------|---------|----------|------------------------------------------------|
| ...OptionsCheckbox | OptionsCheckbox
| | | See OptionsCheckbox
|
| ...OptionsCommon | OptionsCommon
| | | See OptionsCommon
|
type OptionsCheckbox
{ checkboxLabel?: string, checkboxDefaultValue?: boolean }
| Key | Type | Default | Required | Description |
|----------------------|-----------|---------|----------|------------------------------------------------------------------------------------|
| checkboxLabel | string
| | | If set, then there is a checkbox shown at the bottom of the dialog with this label |
| checkboxDefaultValue | boolean
| false
| | The initial state of the checkbox. Does nothing if checkboxLabel
is not set |
type OptionsCommon
{ cancelable?: boolean, content?: string, contentColor?: string, contentIsHtml?: boolean, forceStacking?: boolean, linkColor?: ColorValue, negativeColor?: ColorValue, negativeText?: string, neutralColor?: ColorValue, neutralText?: string, positiveColor?: ColorValue, positiveText?: string, // default "OK" title?: string, titleColor?: ColorValue, maxNumberOfItems?: boolean, }
| Key | Type | Default | Required | Description |
|---------------|--------------------------------------------------------------------------|---------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------|
| cancelable | boolean
| | | If tapping outside of dialog area, or hardware back button, should dismiss dialog. |
| content | string
| | | Dialog message |
| contentColor | ColorValue
| | | Color of dialog message |
| contentIsHtml | boolean
| | | If dialog message should be parsed as html. (supported tags include: <a>
, <img>
, etc) |
| forceStacking | boolean
| | | If you have multiple action buttons that together are too wide to fit on one line, the dialog will stack the buttons to be vertically oriented. |
| linkColor | ColorValue
| | | If contentIsHtml
is true, and content
contains <a>
tags, these are colored with this color |
| negativeColor | ColorValue
| | | |
| negativeText | string
| | | If falsy, button is not shown. |
| neutralColor | ColorValue
| | | |
| neutralText | string
| | | Shows button in far left with this string as label. If falsy, button is not shown. |
| positiveColor | ColorValue
| | | |
| positiveText | string
| | | If falsy, button is not shown. |
| title | string
| | | Title of dialog |
| titleColor | ColorValue
| | | Color of title |
| maxNumberOfItems | int
| | | If you want to set a max amount of visible items in a list |
type OptionsProgress
{ contentColor: $PropertyType<OptionsCommon, 'contentColor'>, contentIsHtml: $PropertyType<OptionsCommon, 'contentIsHtml'>, linkColor: $PropertyType<OptionsCommon, 'linkColor'>, style?: ProgressStyle, title: $PropertyType<OptionsCommon, 'title'>, titleColor: $PropertyType<OptionsCommon, 'titleColor'>', widgetColor: $PropertyType<OptionsCommon, 'widgetColor'> }
| Key | Type | Default | Required | Description |
|---------------|--------------------------------------------------------------------------|---------|----------|----------------------------------------------------------|
| contentColor | OptionsCommon#contentColor
| | | See OptionsCommon#contentColor
|
| contentIsHtml | OptionsCommon#contentIsHtml
| | | See OptionsCommon#contentIsHtml
|
| linkColor | OptionsCommon#linkColor
| | | See OptionsCommon#linkColor
|
| style | ProgressStyle
| | | See ProgressStyle
|
| title | OptionsCommon#title
| | | See OptionsCommon#title
|
| titleColor | OptionsCommon#titleColor
| | | See OptionsCommon#titleColor
|
| widgetColor | ColorValue
| | | Color of progress indicator |
type OptionsPicker
{ ...OptionsCommon, idKey?: string, items: ListItem[], labelKey?: string, neutralIsClear?: boolean, selectedId?: any, selectedIds?: any[], type?: string, widgetColor?: ColorValue }
| Key | Type | Default | Required | Description |
|-----------------|--------------------------------------------------------------------------|---------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| OptionsCheckbox | OptionsCheckbox
| | | See OptionsCheckbox
|
| OptionsCommon | OptionsCommon
| | | See OptionsCommon
|
| idKey | string
| "id" | | |
| items | ListItem
[] | | Yes | See ListItem
|
| labelKey | string
| "label" | | |
| neutralIsClear | boolean
| | | Pressing the neutral button causes the dialog to be closed and selectedItems
to be an empty array. Only works if neutralText
is also supplied. |
| selectedId | any
| | | The respective radio will be selected on dialog show. If no such id is found, then nothing is selected. Only applicable if type
is DialogAndroid.listRadio
. Requires that items[]
contain key described by idKey
. |
| selectedIds | any[]
| | | The respective checkbox will be selected on dialog show. If no such id is found, nothing is selected for that id. Only applicable if type
is DialogAndroid.listCheckbox
. Requires that items[]
contain key described by idKey
. |
| type | ListType
| DialogAndroid.listPlain
| | See ListType
|
| widgetColor | ColorValue
| | | Color of radio or checkbox |
type OptionsPrompt
{ ...OptionsCommon, keyboardType?: | 'numeric' | 'number-pad' | 'numeric-password' | 'decimal-pad' | 'email-address' | 'password' | 'phone-pad' | 'url', defaultValue?: string, placeholder?: string, allowEmptyInput?: boolean, minLength?: number, maxLength?: number, widgetColor?: ColorValue }
| Key | Type | Default | Required | Description |
|-----------------|--------------------------------------------------------------------------|---------|----------|------------------------------------------------|
| OptionsCheckbox | OptionsCheckbox
| | | See OptionsCheckbox
|
| OptionsCommon | OptionsCommon
| | | See OptionsCommon
|
| widgetColor | ColorValue
| | | Color of field underline and cursor |
type ProgressStyle
"progressHorizontal"
Examples
To see the examples redone with checkboxLabel
see this PR - Github :: aakashns/react-native-dialogs - #86
Progress Dialog
DialogAndroid.showProgress('Downloading...', {
style: DialogAndroid.progressHorizontal // omit this to get circular
});
setTimeout(DialogAndroid.dismiss, 5000);
Basic List
const { selectedItem } = await DialogAndroid.showPicker('Pick a fruit', null, {
items: [
{ label:'Apple', id:'apple' },
{ label:'Orange', id:'orange' },
{ label:'Pear', id:'pear' }
]
});
if (selectedItem) {
// when negative button is clicked, selectedItem is not present, so it doesn't get here
console.log('You selected item:', selectedItem);
}
Radio List
Set positiveText
to null
for auto-dismiss behavior on press of a radio button item.
const { selectedItem } = await DialogAndroid.showPicker('Pick a fruit', null, {
// positiveText: null, // if positiveText is null, then on select of item, it dismisses dialog
negativeText: 'Cancel',
type: DialogAndroid.listRadio,
selectedId: 'apple',
items: [
{ label:'Apple', id:'apple' },
{ label:'Orange', id:'orange' },
{ label:'Pear', id:'pear' }
]
});
if (selectedItem) {
// when negative button is clicked, selectedItem is not present, so it doesn't get here
console.log('You picked:', selectedItem);
}
Without auto-dismiss
Here we pass in a string to positiveText
, this prevents the auto-dismiss on select of a radio item.
const { selectedItem } = await DialogAndroid.showPicker('Pick a fruit', null, {
positiveText: 'OK', // this is what makes disables auto dismiss
negativeText: 'Cancel',
type: DialogAndroid.listRadio,
selectedId: 'apple',
items: [
{ label:'Apple', id:'apple' },
{ label:'Orange', id:'orange' },
{ label:'Pear', id:'pear' }
]
});
if (selectedItem) {
// when negative button is clicked, selectedItem is not present, so it doesn't get here
console.log('You picked:', selectedItem);
}
Checklist
const { selectedItems } = await DialogAndroid.showPicker('Select multiple fruits', null, {
type: DialogAndroid.listCheckbox,
selectedIds: ['apple', 'orange'],
items: [
{ label:'Apple', id:'apple' },
{ label:'Orange', id:'orange' },
{ label:'Pear', id:'pear' }
]
});
if (selectedItems) {
if (!selectedItems.length) {
console.log('You selected no items.');
} else {
console.log('You selected items:', selectedItems);
}
}
With clear list button
We can make the neutral button be a special button. Pressing it will clear the list and close the dialog. If you want this behavior, set neutralIsClear
to true
and also set neutralText
to a string. Both of these properties must be set.
const { selectedItems } = await DialogAndroid.showPicker('Select multiple fruits', null, {
type: DialogAndroid.listCheckbox,
selectedIds: ['apple', 'orange'],
neutralIsClear: true, /////// added this
neutralText: 'Clear', /////// added this
items: [
{ label:'Apple', id:'apple' },
{ label:'Orange', id:'orange' },
{ label:'Pear', id:'pear' }
]
});
if (selectedItems) {
if (!selectedItems.length) {
console.log('You selected no items.');
} else {
console.log('You selected items:', selectedItems);
}
}
Prompt
const { action, text } = await DialogAndroid.prompt('Title - optional', 'Message - optional');
if (action === DialogAndroid.actionPositive) {
console.log(`You submitted: "${text}"`);
}
HTML
DialogAndroid.alert('Title', `This is a link <a href="https://www.duckduckgo.com/">DuckDuckGo</a>`, {
contentIsHtml: true
});
assignDefaults
You can set some defaults so you don't have to change it everytime.
DialogAndroid.assignDefaults({
title: 'Default Title',
positiveText: null,
contentColor: 'rgba(0, 0, 0, 0.2)',
widgetColor: 'blue'
})
Now any time you omit or pass undefined
to contentColor
, widgetColor
, or title
, it will use the defaults we assigned here.
DialogAndroid.alert(undefined, 'message here')
This will show title "Default Title", with no positive button, and the color of the message will be 20% black. If you did Dialog.showProgress
, the progress indicator would be blue. etc.
Contributors
Thanks goes to these wonderful people (emoji key):
| Vojtech Novak💬 💻 🤔 👀 | Noitidart💻 📖 💡 🤔 | Alisson Carvalho💻 | Anthony Ou💻 | Ashley White💻 | Bee💻 | BrianSo💻 | |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| | Byron Wang💻 | Farzad Abdolhosseini💻 | Geoffrey Goh🐛 💻 | Gustavo Fão Valvassori💻 🤔 | Henrik📖 | heydabop💻 | Huang Yu💻 | | Iragne💻 | Janic Duplessis💻 | jeffchienzabinet💻 | Jeremy Dagorn📖 | jykun💻 | Mattias Pfeiffer📖 | pureday📖 | | Radek Czemerys💻 | Ricardo Fuhrmann📖 | Ross💻 | Vinicius Zaramella💻 | | | |
This project follows the all-contributors specification. Contributions of any kind welcome!