npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

webview-native-bridge

v1.0.12

Published

Webview native bridge - support to communicate with native

Downloads

19

Readme

Using

Install

npm install webview-native-bridge

or

yarn add webview-native-bridge

Import

import bridge, { useBridgeWindow } from "webview-native-bridge";

Built-in functions

bridge.getPlatformAsync(): Promise<string>
bridge.getPlatformVersionAsync(): Promise<string>

bridge.checkPermissionAsync(permission: string): Promise<PermissionStatus>
bridge.requestPermissionAsync(permission: string, rationale?: Rationale): Promise<PermissionStatus>
// ex: permission = Permissions.android.ACCESS_FINE_LOCATION
// ex: permission = Permissions.android.LOCATION_WHEN_IN_USE
// ex: permission = Permissions.ios.CONTACTS

// FOR IOS ONLY
bridge.checkNotificationsPermissionAsync(): Promise<NotificationsPermissionResponse>
// FOR IOS ONLY
bridge.requestNotificationsPermissionAsync(options: NotificationPermissionOption[]): Promise<NotificationsPermissionResponse>

bridge.getGeoLocationAsync(request?: GeolocationRequest): Promise<GeolocationResponse>

bridge.setContentAsync(name: string, content: string): Promise<void>
bridge.getContentAsync(name: string): Promise<string>

bridge.showSmallAdsAsync(): Promise<void>
bridge.showFullscreenAdsAsync(): Promise<void>
bridge.showVideoAdsAsync(): Promise<void>

bridge.openInBrowserAsync(url: string): Promise<void>
bridge.openDeepLinkAsync(deepLink: string, fallbackUrl?: string)
bridge.canOpenDeepLinkAsync(deepLink: string): Promise<boolean>
bridge.openSettingsAsync(): Promise<void>

bridge.getFirebaseTokenAsync(): Promise<string>
bridge.getFirebaseInitialMessageAsync(): Promise<FirebaseMessage | null>

bridge.getContactsAsync(option?: ContactOption): Promise<Contact[]>

// FOR ANDROID ONLY
bridge.detectCallAsync(phoneNumber: string, callType: CallType[], timeoutInMs: number): Promise<boolean>

bridge.getColorSchemeAsync(): Promise<ColorSchemeName>
bridge.getAppStateAsync(): Promise<AppStateStatus>
bridge.getBatteryLevelAsync(): Promise<number>

bridge.getStatusBarHeightAsync(): Promise<number>
bridge.setStatusBarStyleAsync(style: StatusBarStyle): Promise<void>
bridge.setStatusBarHiddenAsync(hidden: boolean): Promise<void>

bridge.addDisallowBackUrlsAsync(url: string[] | string): Promise<boolean>

bridge.vibrateAsync(pattern: number[], repeat?: boolean = false): Promise<void>
bridge.cancelVibrateAsync(): Promise<void>

bridge.getBrightnessAsync(): Promise<number>
bridge.setBrightnessAsync(value: number): Promise<void>

bridge.setTorchStateAsync(torchOn: boolean): Promise<void>

bridge.takePhotoAsync(option: TakePhotoOption): Promise<TakePhotoResult>
bridge.takeVideoAsync(option: TakeVideoOption): Promise<TakeVideoResult>
bridge.scanQrCodeAsync(option: ScanQrCodeOption): Promise<string>

bridge.downloadFileAsync(url: string): Promise<void>
bridge.uploadFileAsync(fileUploadRequest: FileUploadRequest): Promise<FileUploadResponse>

bridge.storeFileAsync(name: string, url: string): Promise<StoreFileResult>
bridge.hasFileAsync(name: string): Promise<boolean>
bridge.removeFileAsync(name: string): Promise<void>

bridge.displayPdfAsync(filename: string): Promise<void>

bridge.shareAsync(content: ShareContent): Promise<ShareAction>
bridge.copyToClipboard(text: string): Promise<void>,

bridge.getEnvironmentOptionsAsync(): Promise<EnvironmentOption[]>,
bridge.setEnvironmentAsync(envCode: string): Promise<void>,
bridge.addEnvironmentAsync(env: EnvironmentOption): Promise<EnvironmentAdditionResult>,
bridge.getCurrentEnvironmentAsync(): Promise<EnvironmentOption>,
bridge.getVersionInfoAsync(): Promise<VersionInfo>
bridge.getCodeVersionInfoAsync(): Promise<CodeVersionInfo>

bridge.restartAsync(): Promise<void>

Built-in events

bridge.addFirebaseMessageListener(listener: FirebaseMessageHandler)
bridge.removeFirebaseMessageListeners()
bridge.removeFirebaseMessageListener(listener: FirebaseMessageHandler)

bridge.addAppStateChangedListener(listener: AppStateChangedBridgeHandler)
bridge.removeAppStateChangedListeners()
bridge.removeAppStateChangedListener(listener: AppStateChangedBridgeHandler)

bridge.addBatteryLevelChangedListener(listener: BatteryLevelChangedBridgeHandler)
bridge.removeBatteryLevelChangedListeners()
bridge.removeBatteryLevelChangedListener(listener: BatteryLevelChangedBridgeHandler)

bridge.addConnectionChangedListener(listener: ConnectionChangedBridgeHandler)
bridge.removeConnectionChangedListeners()
bridge.removeConnectionChangedListener(listener: ConnectionChangedBridgeHandler)

Call customize function

bridge.$sendCommandAsync(name: string, parameters?: any[]);

Set mock

bridge.$setMock(sendCommandAsyncFunction: SendCommandFunction);

For hosting in React Native app

useBridgeWindow((window as any).ReactNativeWebView as Window);

For hosting in Native app

useBridgeWindow((window as any).NAME_OF_INJECTED_WEBVIEW_WINDOW as Window);

References

Permission names

const Permissions = {
    android: {
        ACCEPT_HANDOVER: 'android.permission.ACCEPT_HANDOVER',
        ACCESS_BACKGROUND_LOCATION: 'android.permission.ACCESS_BACKGROUND_LOCATION',
        ACCESS_COARSE_LOCATION: 'android.permission.ACCESS_COARSE_LOCATION',
        ACCESS_FINE_LOCATION: 'android.permission.ACCESS_FINE_LOCATION',
        ACTIVITY_RECOGNITION: 'android.permission.ACTIVITY_RECOGNITION',
        ADD_VOICEMAIL: 'com.android.voicemail.permission.ADD_VOICEMAIL',
        ANSWER_PHONE_CALLS: 'android.permission.ANSWER_PHONE_CALLS',
        BODY_SENSORS: 'android.permission.BODY_SENSORS',
        CALL_PHONE: 'android.permission.CALL_PHONE',
        CAMERA: 'android.permission.CAMERA',
        GET_ACCOUNTS: 'android.permission.GET_ACCOUNTS',
        PROCESS_OUTGOING_CALLS: 'android.permission.PROCESS_OUTGOING_CALLS',
        READ_CALENDAR: 'android.permission.READ_CALENDAR',
        READ_CALL_LOG: 'android.permission.READ_CALL_LOG',
        READ_CONTACTS: 'android.permission.READ_CONTACTS',
        READ_EXTERNAL_STORAGE: 'android.permission.READ_EXTERNAL_STORAGE',
        READ_PHONE_NUMBERS: 'android.permission.READ_PHONE_NUMBERS',
        READ_PHONE_STATE: 'android.permission.READ_PHONE_STATE',
        READ_SMS: 'android.permission.READ_SMS',
        RECEIVE_MMS: 'android.permission.RECEIVE_MMS',
        RECEIVE_SMS: 'android.permission.RECEIVE_SMS',
        RECEIVE_WAP_PUSH: 'android.permission.RECEIVE_WAP_PUSH',
        RECORD_AUDIO: 'android.permission.RECORD_AUDIO',
        SEND_SMS: 'android.permission.SEND_SMS',
        USE_SIP: 'android.permission.USE_SIP',
        WRITE_CALENDAR: 'android.permission.WRITE_CALENDAR',
        WRITE_CALL_LOG: 'android.permission.WRITE_CALL_LOG',
        WRITE_CONTACTS: 'android.permission.WRITE_CONTACTS',
        WRITE_EXTERNAL_STORAGE: 'android.permission.WRITE_EXTERNAL_STORAGE',
    },
    ios: {
        APP_TRACKING_TRANSPARENCY: 'ios.permission.APP_TRACKING_TRANSPARENCY',
        BLUETOOTH_PERIPHERAL: 'ios.permission.BLUETOOTH_PERIPHERAL',
        CALENDARS: 'ios.permission.CALENDARS',
        CAMERA: 'ios.permission.CAMERA',
        CONTACTS: 'ios.permission.CONTACTS',
        FACE_ID: 'ios.permission.FACE_ID',
        LOCATION_ALWAYS: 'ios.permission.LOCATION_ALWAYS',
        LOCATION_WHEN_IN_USE: 'ios.permission.LOCATION_WHEN_IN_USE',
        MEDIA_LIBRARY: 'ios.permission.MEDIA_LIBRARY',
        MICROPHONE: 'ios.permission.MICROPHONE',
        MOTION: 'ios.permission.MOTION',
        PHOTO_LIBRARY: 'ios.permission.PHOTO_LIBRARY',
        PHOTO_LIBRARY_ADD_ONLY: 'ios.permission.PHOTO_LIBRARY_ADD_ONLY',
        REMINDERS: 'ios.permission.REMINDERS',
        SIRI: 'ios.permission.SIRI',
        SPEECH_RECOGNITION: 'ios.permission.SPEECH_RECOGNITION',
        STOREKIT: 'ios.permission.STOREKIT',
    }
}

PermissionStatus

type PermissionStatus = "unavailable" | "blocked" | "denied" | "granted" | "limited"

Rationale

interface Rationale {
    title: string;
    message: string;
    buttonPositive: string;
    buttonNegative?: string;
    buttonNeutral?: string;
}

PermissionStatusResults

const PermissionStatusResults = {
    UNAVAILABLE: "unavailable",
    BLOCKED: "blocked",
    DENIED: "denied",
    GRANTED: "granted",
    LIMITED: "limited",
}

NotificationsPermissionResponse

interface NotificationsPermissionResponse {
    status: PermissionStatus;
    settings: NotificationPermissionSettings;
}

interface NotificationPermissionSettings {
    alert?: boolean;
    badge?: boolean;
    sound?: boolean;
    carPlay?: boolean;
    criticalAlert?: boolean;
    provisional?: boolean;
    lockScreen?: boolean;
    notificationCenter?: boolean;
}

NotificationPermissionOption

type NotificationPermissionOption = 'alert' | 'badge' | 'sound' | 'carPlay' | 'criticalAlert' | 'provisional'

GeolocationRequest

interface GeolocationRequest {
    enableHighAccuracy?: boolean,
    timeout?: number;
    maximumAge?: number;
}

GeolocationResponse

interface GeolocationResponse {
    coords: {
        latitude: number;
        longitude: number;
        altitude: number | null;
        accuracy: number;
        altitudeAccuracy: number | null;
        heading: number | null;
        speed: number | null;
    };
    timestamp: number;
}

ContactOption

interface ContactOption {
    includePhoto?: boolean,
    matchingString?: string
}

Contact

interface Contact {
    recordID: string;
    backTitle: string;
    company: string|null;
    emailAddresses: ContactEmailAddress[];
    displayName: string;
    familyName?: string;
    givenName: string;
    middleName: string;
    jobTitle: string;
    phoneNumbers: ContactPhoneNumber[];
    hasThumbnail: boolean;
    thumbnailPath: string;
    postalAddresses: ContactPostalAddress[];
    prefix: string;
    suffix: string;
    department: string;
    birthday: ContactBirthday;
    imAddresses: ContactInstantMessageAddress[]
    note: string;
}

interface ContactEmailAddress {
    label: string;
    email: string;
}

interface ContactPhoneNumber {
    label: string;
    number: string;
}

interface ContactPostalAddress {
    label: string;
    formattedAddress: string;
    street: string;
    pobox: string;
    neighborhood: string;
    city: string;
    region: string;
    state: string;
    postCode: string;
    country: string;
}

interface ContactInstantMessageAddress {
    username: string;
    service: string;
}

interface ContactBirthday {
    day: number;
    month: number;
    year: number;
}

Call

type CallType = "OUTGOING" | "INCOMING" | "MISSED" | "UNKNOWN";

ColorSchemeName

type ColorSchemeName = 'light' | 'dark' | null | undefined

AppStateStatus

type AppStateStatus = 'active' | 'background' | 'inactive' | 'unknown' | 'extension'

StatusBarStyle

type StatusBarStyle = 'default' | 'light-content' | 'dark-content'

TakePhotoOption

interface TakePhotoOption {
    camera?: "back" | "front",
    maxWidth?: number,
    maxHeight?: number,
    quality?: number,
}

TakePhotoResult

interface TakePhotoResult {
    uri?: string;
    width?: number;
    height?: number;
    fileSize?: number;
    type?: string;
    fileName?: string;
}

TakeVideoOption

interface TakeVideoOption {
    camera?: "back" | "front",
    maxWidth?: number,
    maxHeight?: number,
    quality?: "low" | "medium" | "high",
    durationLimit?: number, 
}

TakeVideoResult

interface TakeVideoResult {
    uri?: string;
    width?: number;
    height?: number;
    fileSize?: number;
    type?: string;
    fileName?: string;
    duration?: number;
}

ScanQrCodeOption

interface ScanQrCodeOption {
    camera?: "back" | "front", 
    type?: "qrCode" | "barCode" | "both"
}

FileUploadRequest

interface FileUploadRequest {
    method?: 'POST' | 'PUT' | 'PATCH' | string,
    url: string,
    file: string,
    name?: string,
    headers?: Record<string, string>
}

FileUploadResponse

interface FileUploadResponse {
    statusCode: number,
    headers: Record<string, string>,
    body: string
}

StoreFileResult

interface StoreFileResult {
    size: number,
    statusCode: number
}

ShareContent

type ShareContent = {
        title?: string;
        message: string;
    } | {
        title?: string;
        url: string;
    }

ShareAction

type ShareAction = 'sharedAction' | 'dismissedAction'

EnvironmentOption

interface EnvironmentOption {
    name: string,
    code: string,
    url: {
        phone: string,
        tablet?: string
    }
}

EnvironmentAdditionResult

interface EnvironmentAdditionResult {
    success: boolean,
    message: string,
}

VersionInfo

interface VersionInfo {
    versionName: string,
    versionCode: number
}

CodeVersionInfo

interface CodeVersionInfo {
    current: string,
    next: number
}

FirebaseMessage

interface FirebaseMessage {
    /**
    * The collapse key a message was sent with. Used to override existing messages with the same
    * key.
    */
    collapseKey?: string;

    /**
    * A unique ID assigned to every message.
    */
    messageId?: string;

    /**
    * The message type of the message.
    */
    messageType?: string;
    /**
    * The topic name or message identifier.
    */
    from?: string;
    /**
    * The address for the message.
    */
    to?: string;

    /**
    * The time to live for the message in seconds.
    *
    * Defaults to 3600.
    */
    ttl?: number;

    /**
    * The time the message was sent, in milliseconds since the start of unix epoch
    */
    sentTime?: number;

    /**
    * Any additional data sent with the message.
    */
    data?: { [key: string]: string };

    /**
    * Additional Notification data sent with the message
    */
    notification?: FirebaseNotification;

    /**
    * Whether the iOS APNs message was configured as a background update notification.
    *
    * @platform ios iOS
    */
    contentAvailable?: boolean;

    /**
    * Whether the iOS APNs `mutable-content` property on the message was set
    * allowing the app to modify the notification via app extensions.
    *
    * @platform ios iOS
    */
    mutableContent?: boolean;

    /**
    * The iOS category this notification is assigned to.
    *
    * @platform ios iOS
    */
    category?: string;

    /**
    * An iOS app specific identifier used for notification grouping.
    */
    threadId?: string;
}

interface FirebaseNotification {
    /**
    * The notification title.
    */
    title?: string,

    /**
    * The native localization key for the notification title.
    */
    titleLocKey?: string,

    /**
    * Any arguments that should be formatted into the resource specified by titleLocKey.
    */
    titleLocArgs?: string[],

    /**
    * The notification body content.
    */
    body?: string,

    /**
    * The native localization key for the notification body content.
    */
    bodyLocKey?: string,

    /**
    * Any arguments that should be formatted into the resource specified by bodyLocKey.
    */
    bodyLocArgs?: string[],

    ios?: {
        /**
        * The notification's subtitle.
        */
        subtitle?: string,

        /**
        * The native localization key for the notification's subtitle.
        */
        subtitleLocKey?: string,

        /**
        * Any arguments that should be formatted into the resource specified by subtitleLocKey.
        */
        subtitleLocArgs?: string[],

        /**
        * The value of the badge on the home screen app icon.
        * If not specified, the badge is not changed.
        * If set to 0, the badge has been removed.
        */
        badge?: string,
    },

    /**
    * Additional Android specific properties set on the notification.
    */
    android?: {
        /**
        * The sound played when the notification was delivered on the device (channel settings permitted).
        *
        * Set as "default" if the default device notification sound was used.
        */
        sound?: string,

        /**
        * The channel ID set on the notification. If not set, the notification uses the default
        * "Miscellaneous" channel set by FCM.
        */
        channelId?: string,

        /**
        * The custom color used to tint the notification content.
        */
        color?: string,

        /**
        * The custom small icon used to display on the notification. If not set, uses the default
        * application icon defined in the AndroidManifest file.
        */
        smallIcon?: string,

        /**
        * The custom image was provided and displayed in the notification body.
        */
        imageUrl?: string,

        /**
        * Deep link URL provided to the notification.
        */
        link?: string,

        /**
        * The current unread notification count for this application, managed by the device.
        */
        count?: number,

        /**
        * Name of the click action set on the notification.
        */
        clickAction?: string,

        /**
        * The notification priority.
        *
        * Note, on devices which have channel support (Android 8.0 (API level 26) +),
        * this value will be ignored. Instead, the channel "importance" level is used.
        */
        priority?:
        | FirebaseNotificationAndroidPriority.PRIORITY_MIN
        | FirebaseNotificationAndroidPriority.PRIORITY_LOW
        | FirebaseNotificationAndroidPriority.PRIORITY_DEFAULT
        | FirebaseNotificationAndroidPriority.PRIORITY_HIGH
        | FirebaseNotificationAndroidPriority.PRIORITY_MAX,

        /**
        * Ticker text set on the notification.
        *
        * Ticker text is used for devices with accessibility enabled (e.g. to read out the message).
        */
        ticker?: string,

        /**
        * The visibility of a notification. This value determines how the notification is shown on the users
        * devices (e.g. on the lock-screen).
        */
        visibility?:
        | FirebaseNotificationAndroidVisibility.VISIBILITY_SECRET
        | FirebaseNotificationAndroidVisibility.VISIBILITY_PRIVATE
        | FirebaseNotificationAndroidVisibility.VISIBILITY_PUBLIC,
    },
}  

enum FirebaseNotificationAndroidVisibility {
    /**
    * Do not reveal any part of this notification on a secure lock-screen.
    */
    VISIBILITY_SECRET = -1,

    /**
    * Show this notification on all lock-screens, but conceal sensitive or private information on secure lock-screens.
    */
    VISIBILITY_PRIVATE = 0,

    /**
    * Show this notification in its entirety on all lock-screens.
    */
    VISIBILITY_PUBLIC = 1,
}

enum FirebaseNotificationAndroidPriority {
    /**
    * The application small icon will not show up in the status bar, or alert the user. The notification
    * will be in a collapsed state in the notification shade and placed at the bottom of the list.
    */
    PRIORITY_MIN = -2,

    /**
    * The application small icon will show in the device status bar, however the notification will
    * not alert the user (no sound or vibration). The notification will show in it's expanded state
    * when the notification shade is pulled down.
    */
    PRIORITY_LOW = -1,

    /**
    * When a notification is received, the device smallIcon will appear in the notification shade.
    * When the user pulls down the notification shade, the content of the notification will be shown
    * in it's expanded state.
    */
    PRIORITY_DEFAULT = 0,

    /**
    * Notifications will appear on-top of applications, allowing direct interaction without pulling
    * own the notification shade. This level is used for urgent notifications, such as
    * incoming phone calls, messages etc, which require immediate attention.
    */
    PRIORITY_HIGH = 1,

    /**
    * The priority highest level a notification can be set at.
    */
    PRIORITY_MAX = 2,
}

Events

BridgeHandlerArgument

interface BridgeHandlerArgument<T> {
    name: string,
    data: T
}

BridgeHandler

type BridgeHandler = (arg: BridgeHandlerArgument<any>) => Promise<boolean> | Promise<undefined> | Promise<void> | boolean | undefined | void;

FirebaseMessageHandler

type FirebaseMessageHandler = (arg: BridgeHandlerArgument<FirebaseMessage>) => Promise<boolean> | Promise<undefined> | Promise<void> | boolean | undefined | void

AppStateChangedBridgeHandler

type AppStateChangedBridgeHandler = (arg: BridgeHandlerArgument<string>) => Promise<boolean> | Promise<undefined> | Promise<void> | boolean | undefined | void

BatteryLevelChangedBridgeHandler

type BatteryLevelChangedBridgeHandler = (arg: BridgeHandlerArgument<number>) => Promise<boolean> | Promise<undefined> | Promise<void> | boolean | undefined | void;

ConnectionChangedBridgeHandler

type ConnectionChangedBridgeHandler = (arg: BridgeHandlerArgument<string>) => Promise<boolean> | Promise<undefined> | Promise<void> | boolean | undefined | void