Files
psp_panel/WEBVIEW_BRIDGE.md
ahasani 822bf96966 feat: add new form field components for company details and consumer management
- Implemented CompanyNameComponent, DescriptionComponent, DeviceIdComponent, EconomicCodeComponent, EmailComponent, FirstNameComponent, FiscalCodeComponent, GuildIdComponent, LastNameComponent, LegalNameComponent, LicenseStartsAtComponent, MobileComponent, MobileNumberComponent, ModelComponent, NameComponent, NationalCodeComponent, NationalIdComponent, PartnerTokenComponent, PosTypeComponent, PostalCodeComponent, ProviderIdComponent, QuantityComponent, RegistrationCodeComponent, RegistrationNumberComponent, SerialNumberComponent, SetOffComponent, SkuComponent, TerminalComponent, UnitPriceComponent, UsernameComponent.
- Added field control configurations for new fields in the form.
- Updated routing and branding configurations for TIS tenant.
- Created consumer type models for handling individual and legal consumer data.
2026-04-27 21:53:11 +03:30

2.8 KiB

WebView Bridge Contract

This document defines the Android WebView bridge contract used by tenant builds like tis.

Scope

  • The bridge is enabled per tenant via environment.enableNativeBridge.
  • Current tenant config:
    • src/environments/environment.tis.ts -> enableNativeBridge: true
    • other environments -> false

JavaScript host objects

The web app checks bridge methods on:

  1. window.AndroidBridge
  2. window.Android (fallback)

Your Android app can expose either one.

Required native methods

Expose these synchronous methods through @JavascriptInterface:

  • pay(payloadJson: String): String
  • print(payloadJson: String): String

Both methods must return a JSON string.

Return JSON format

Success:

{
  "success": true,
  "data": {}
}

Failure:

{
  "success": false,
  "error": "Reason message"
}

If a non-JSON string is returned, the app treats it as success with raw data.

Payload schemas

pay(payload)

Called before invoice submit when terminal amount is greater than zero.

{
  "amount": 1200000,
  "totalAmount": 3500000,
  "invoiceDate": "2026-04-27T10:30:00.000Z"
}

Fields:

  • amount number: terminal payment amount.
  • totalAmount number: full invoice total.
  • invoiceDate string: ISO date-time.

print(payload)

Called after successful invoice creation (and from invoice view print action).

{
  "invoiceId": "a7e1f2...",
  "code": "INV-1745730090000"
}

Fields are optional, but should be used when available.

Web behavior summary

  • On native pay failure:
    • Invoice submit is stopped.
    • User sees warning toast.
  • On native print failure or missing bridge:
    • In invoice page, app falls back to window.print().
    • In POS checkout flow, print failure does not block successful submit.

Android integration example (Kotlin)

class AndroidBridge(
    private val context: Context
) {
    @JavascriptInterface
    fun pay(payloadJson: String): String {
        return try {
            // TODO: parse payloadJson and run POS payment SDK synchronously
            """{"success":true,"data":{"txId":"12345"}}"""
        } catch (e: Exception) {
            """{"success":false,"error":"${e.message ?: "Payment failed"}"}"""
        }
    }

    @JavascriptInterface
    fun print(payloadJson: String): String {
        return try {
            // TODO: parse payloadJson and print with printer SDK
            """{"success":true}"""
        } catch (e: Exception) {
            """{"success":false,"error":"${e.message ?: "Print failed"}"}"""
        }
    }
}

Attach to WebView:

webView.settings.javaScriptEnabled = true
webView.addJavascriptInterface(AndroidBridge(this), "AndroidBridge")

Notes

  • For production, use HTTPS for web app + API to avoid mixed-content issues.
  • Keep method names and payload keys exactly as specified.