Extension Types

Edit on Github

Understand All the Different Typs

Extension types are determined by the available hooks.

The first hooks supported by Status are chat command and wallet settings.

Chat Command

Identifiers

The root identifier for any chat command is hooks/chat.command. Use this to build a chat command extension.

Each extension also requires a unique identifier, e.g. hooks/chat.command.collectible.

In the case of a chat command, the unique identifier is what a user is required to type (e.g. /collectible) in order to execute a command within a chat.

This unique ID must be unique from all other command IDs. It is recommended to use the DApp or company’s name in the ID to ensure this.

Properties

Once declared, a chat command requires the following properties to be mapped:

  • Scope
  • Description
  • Preview
  • Short preview
  • Parameters
  • Optional: on-send and on-receive

This is declared like so:

hooks/chat.command.collectible
{:description    "Send collectible"
:scope            #{:personal-chats}
:preview          [collectible-preview]
:short-preview    [collectible-short-preview]
:on-send          [send-collectible]
:parameters       [{:id            :id
                    :type          :text
                    :placeholder   "Collectible name"}]}

Scope

A chat command can be executed within any combination of the following scopes:

  • personal-chat: a 1-1 chat between users
  • group-chats: a private chat between multiple users
  • public-chats: a public chat open to any user

Description

The description is a short phrase exposed in the interface after the unique identifier, e.g. Send collectible.

A user sees:

/collectible Send collectible

Preview

The preview is a view that a user sees as the result of a command’s execution within a chat. It is declared with views/[name-of-my-preview].

A developer can customize previews using the syntax described for defining a view.

Previews also come with an injected payload, accessible via a properties symbol:

{:incoming-group false
 :message-id 0x..
 :last? true
 :current-public-key 0x...
 :content {:command-path [collectible #{:personal-chats}]
           :params {:collectible-id    "CK"}}
 :display-photo? false
 :last-in-group? true
 :datemark today
 :show? true
 :message-type :user-message
 :clock-value 154020773584601
 :user-statuses {0x... {:chat-id ..., :message-id 0x..., :whisper-identity 0x..., :status :sending}}
 :first-in-group? true,
 :from 0x...
 :timestamp-str 1:28 PM
 :group-chat false
 :chat-id 0x...
 :content-type command
 :modal? false
 :last-outgoing? true
 :appearing? true
 :timestamp 1540207735840
 :display-username? false
 :outgoing true}

Short preview

The short preview is a view that a user sees on the chat screen when the last message in a given item is a chat command. It is declared with views/[name-of-my-short-preview].

A developer can customize short previews using the syntax described for defining a view.

Short previews also come with an injected payload, accessible via a properties symbol:

{:message-id 0x..., 
 :content {:command-path [collectible #{:personal-chats}]
           :params {:collectible-id    "CK"}}
 :show? true
 :message-type :user-message
 :clock-value 154020622416101
 :from 0x...
 :chat-id 0x...
 :content-type command
 :appearing? true
 :timestamp 1540206224139
 :outgoing true}

Parameters

Parameters prompt the user to make selections or input data.

They are identified by an id and must define an input type as well as some placeholder text for the user.

They can optionally include suggestions to cue the user with additional UI components.

Declare parameters like this:

:parameters   [{:id            :collectible-id
                :type          :text
                :placeholder   "Collectible name"}]

This example allows a user to select between their various collectibles, either by typing in the “Collectible name” or using the UI’s suggestions.

Suggestions

A parameter can optionally include suggestions to cue the user with additional UI components.

:parameters   [{:id            :collectible-id
                :type          :text
                :suggestions   [user-collectibles]
                :placeholder   "Collectible name"}]

This example allows a user to select between their various collectibles, either by typing in the “Collectible name” or using the UI’s suggestions.

To set the parameter value from a suggestion view, the chat.command/set-parameter event must be used. chat.command/set-custom-parameter can also be used to add extra parameters that will be accessible to all command messages recipients.

views/user-collectibles
[view
 [button {:on-click [chat.command/set-parameter {:value "value"}]}
  "Set parameter value"]
 [button {:on-click [chat.command/set-custom-parameter {:key :extra :value "value"}]}
  "Set custom parameter value"]]

on-send and on-receive

on-send and on-receive allow a command to fire events when a message is sent or received.

In the collectible example, on-send creates a transaction to move the collectible from user A’s wallet to user B’s wallet.

on-send and on-receive both come with the injected payload:

{:chat-id 0x...     
 :content-type command
 :content {:command-path [collectible #{:personal-chats}]
           :params {:collectible-id    "CK"}}}

Wallet settings

Wallet settings hook allow you to plug extra panels in the wallet. Those will be accessible via the wallet settings menu.

To implement a wallet settings you will need to provide the following properties:

  • label (the name that will be displayed in the wallet settings menu)
  • view (the view that will be displayed fullscreen)
 views/view
 [text "Hello"]

 hooks/wallet.settings.hello
 {:label   "Test wallet settings"
  :view    [view]}

You can find a simple example here