feat: new deeplink status-im->status-app (#4198)

This commit is contained in:
yqrashawn 2023-11-02 13:56:06 +08:00 committed by GitHub
parent d3558d8e09
commit b65eda3f42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 48 additions and 21 deletions

View File

@ -5,6 +5,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"math/rand" "math/rand"
"strings"
"time" "time"
"github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/deprecation"
@ -16,6 +17,7 @@ import (
"github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/requests" "github.com/status-im/status-go/protocol/requests"
v1protocol "github.com/status-im/status-go/protocol/v1" v1protocol "github.com/status-im/status-go/protocol/v1"
"github.com/status-im/status-go/services/utils"
) )
var chatColors = []string{ var chatColors = []string{
@ -501,18 +503,30 @@ func CreateCommunityChat(orgID, chatID string, orgChat *protobuf.CommunityChat,
func (c *Chat) DeepLink() string { func (c *Chat) DeepLink() string {
if c.OneToOne() { if c.OneToOne() {
return "status-im://p/" + c.ID return "status-app://p/" + c.ID
} }
if c.PrivateGroupChat() { if c.PrivateGroupChat() {
return "status-im://g/args?a2=" + c.ID return "status-app://g/args?a2=" + c.ID
} }
if c.CommunityChat() { if c.CommunityChat() {
return "status-im://cc/" + c.ID communityChannelID := strings.TrimPrefix(c.ID, c.CommunityID)
pubkey, err := types.DecodeHex(c.CommunityID)
if err != nil {
return ""
}
serializedCommunityID, err := utils.SerializePublicKey(pubkey)
if err != nil {
return ""
}
return "status-app://cc/" + communityChannelID + "#" + serializedCommunityID
} }
if c.Public() { if c.Public() {
return "status-im://" + c.ID return "status-app://" + c.ID
} }
return "" return ""

View File

@ -162,3 +162,13 @@ func (s *ChatTestSuite) TestUpdateFirstMessageTimestamp() {
setAndCheck(FirstMessageTimestampNoMessage, false, 200) setAndCheck(FirstMessageTimestampNoMessage, false, 200)
setAndCheck(100, true, 100) setAndCheck(100, true, 100)
} }
func (s *ChatTestSuite) TestDeepLink() {
chat := &Chat{
CommunityID: "0x02b1188c997e666cd5505ffd5c4b5fdbe3084b78a486d8e709da3b32ad3708a89e",
ID: "0x02b1188c997e666cd5505ffd5c4b5fdbe3084b78a486d8e709da3b32ad3708a89ec432709e-fc73-440d-bb67-cb3a0929dfda",
ChatType: ChatTypeCommunityChat,
}
s.Require().Equal(chat.DeepLink(), "status-app://cc/c432709e-fc73-440d-bb67-cb3a0929dfda#zQ3shZL6dXiFCbDyxnXxwQa9v8QFC2q19subFtyxd7kVszMVo")
}

View File

@ -156,7 +156,7 @@ func (n NotificationBody) toCommunityRequestToJoinNotification(id string) *local
Message: n.Contact.PrimaryName() + " wants to join message " + n.Community.Name(), Message: n.Contact.PrimaryName() + " wants to join message " + n.Community.Name(),
BodyType: localnotifications.TypeMessage, BodyType: localnotifications.TypeMessage,
Category: localnotifications.CategoryCommunityRequestToJoin, Category: localnotifications.CategoryCommunityRequestToJoin,
Deeplink: "status-im://cr/" + n.Community.IDString(), Deeplink: "status-app://cr/" + n.Community.IDString(),
Image: "", Image: "",
} }
} }

View File

@ -7,7 +7,6 @@ import (
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/status-im/status-go/api/multiformat"
"github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/common"
@ -52,20 +51,7 @@ const baseShareURL = "https://status.app"
const channelUUIDRegExp = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$" const channelUUIDRegExp = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$"
func (m *Messenger) SerializePublicKey(compressedKey types.HexBytes) (string, error) { func (m *Messenger) SerializePublicKey(compressedKey types.HexBytes) (string, error) {
rawKey, err := crypto.DecompressPubkey(compressedKey) return utils.SerializePublicKey(compressedKey)
if err != nil {
return "", err
}
pubKey := types.EncodeHex(crypto.FromECDSAPub(rawKey))
secp256k1Code := "0xe701"
base58btc := "z"
multiCodecKey := secp256k1Code + strings.TrimPrefix(pubKey, "0x")
cpk, err := multiformat.SerializePublicKey(multiCodecKey, base58btc)
if err != nil {
return "", err
}
return cpk, nil
} }
func (m *Messenger) DeserializePublicKey(compressedKey string) (types.HexBytes, error) { func (m *Messenger) DeserializePublicKey(compressedKey string) (types.HexBytes, error) {

View File

@ -18,7 +18,7 @@ import (
type transactionState string type transactionState string
const ( const (
walletDeeplinkPrefix = "status-im://wallet/" walletDeeplinkPrefix = "status-app://wallet/"
failed transactionState = "failed" failed transactionState = "failed"
inbound transactionState = "inbound" inbound transactionState = "inbound"

View File

@ -41,3 +41,20 @@ func DeserializePublicKey(compressedKey string) (types.HexBytes, error) {
return crypto.CompressPubkey(pubKey), nil return crypto.CompressPubkey(pubKey), nil
} }
func SerializePublicKey(compressedKey types.HexBytes) (string, error) {
rawKey, err := crypto.DecompressPubkey(compressedKey)
if err != nil {
return "", err
}
pubKey := types.EncodeHex(crypto.FromECDSAPub(rawKey))
secp256k1Code := "0xe701"
base58btc := "z"
multiCodecKey := secp256k1Code + strings.TrimPrefix(pubKey, "0x")
cpk, err := multiformat.SerializePublicKey(multiCodecKey, base58btc)
if err != nil {
return "", err
}
return cpk, nil
}