1
1
import { useTranslation } from 'react-i18next'
2
2
import { isUndefined } from '@fluent-wallet/checks'
3
- import Alert from '@fluent-wallet/component-alert'
3
+
4
4
import {
5
5
DappFooter ,
6
- CompWithLabel ,
7
6
TitleNav ,
8
7
AccountDisplay ,
9
8
DisplayBalance ,
@@ -15,8 +14,13 @@ import {
15
14
useCurrentTicker ,
16
15
useAddress ,
17
16
} from '../../hooks/useApi'
18
- import PlaintextMessage from './components/PlaintextMessage'
17
+
19
18
import { RPC_METHODS } from '../../constants'
19
+ import { detectSIWEMessage } from '../../utils'
20
+ import { useMemo } from 'react'
21
+ import { TypedDataSign } from './components/TypedDataSign'
22
+ import { PersonalSign } from './components/PersonalSign'
23
+ import { SignInSign } from './components/SignInSign'
20
24
const { PERSONAL_SIGN , ACCOUNT_GROUP_TYPE } = RPC_METHODS
21
25
22
26
function RequestSignature ( ) {
@@ -38,20 +42,59 @@ function RequestSignature() {
38
42
const isHw =
39
43
AddressData ?. account ?. accountGroup ?. vault ?. type === ACCOUNT_GROUP_TYPE . HW
40
44
41
- const plaintextData =
42
- ! isPersonalSign && req ?. params ?. [ 1 ] ? JSON . parse ( req . params [ 1 ] ) : { }
45
+ const plaintextData = useMemo (
46
+ ( ) =>
47
+ ! isPersonalSign && req ?. params ?. [ 1 ] ? JSON . parse ( req . params [ 1 ] ) : { } ,
48
+ [ isPersonalSign , req ?. params ] ,
49
+ )
43
50
const personalSignData = isPersonalSign ? req ?. params ?. [ 0 ] ?? '' : ''
44
51
52
+ const { isSIWEMessage, parsedMessage} = detectSIWEMessage ( personalSignData )
53
+
54
+ const Content = useMemo ( ( ) => {
55
+ if ( isPersonalSign ) {
56
+ if ( ! isSIWEMessage )
57
+ return < PersonalSign personalSignData = { personalSignData } isHw = { isHw } />
58
+
59
+ return (
60
+ < SignInSign
61
+ parsedMessage = { parsedMessage }
62
+ isHw = { isHw }
63
+ currentNetwork = { app ?. currentNetwork }
64
+ />
65
+ )
66
+ }
67
+
68
+ return < TypedDataSign plaintextData = { plaintextData } isHw = { isHw } />
69
+ } , [
70
+ isPersonalSign ,
71
+ isSIWEMessage ,
72
+ parsedMessage ,
73
+ isHw ,
74
+ plaintextData ,
75
+ app ?. currentNetwork ,
76
+ personalSignData ,
77
+ ] )
78
+
79
+ const signTitle = useMemo ( ( ) => {
80
+ if ( isPersonalSign ) {
81
+ if ( isSIWEMessage ) {
82
+ return t ( 'signWithEthereumTitle' )
83
+ }
84
+
85
+ return t ( 'signText' )
86
+ }
87
+
88
+ return t ( 'signTypeMessage' )
89
+ } , [ isPersonalSign , isSIWEMessage , t ] )
90
+
45
91
return (
46
92
< div
47
93
id = "requestSignatureContainer"
48
94
className = "flex flex-col h-full w-full bg-blue-circles bg-no-repeat bg-bg"
49
95
>
50
96
< header id = "header" >
51
- < TitleNav
52
- title = { isPersonalSign ? t ( 'signText' ) : t ( 'signTypeMessage' ) }
53
- hasGoBack = { false }
54
- />
97
+ < TitleNav title = { signTitle } hasGoBack = { false } />
55
98
< div className = "flex mt-1 px-4 pb-3 items-center justify-between" >
56
99
< AccountDisplay
57
100
address = { address }
@@ -71,55 +114,7 @@ function RequestSignature() {
71
114
</ div >
72
115
</ header >
73
116
< div className = "flex-1 flex justify-between flex-col bg-gray-0 rounded-t-xl pb-4" >
74
- < main className = "rounded-t-xl pt-4 px-3 bg-gray-0" >
75
- { ! isPersonalSign ? (
76
- < div className = "ml-1" id = "signTypeMsgDes" >
77
- < div className = "text-sm text-gray-80 font-medium" >
78
- { t ( 'signThisMessage' ) }
79
- </ div >
80
- < div className = "text-xs text-gray-40 mt-1" >
81
- { plaintextData ?. domain ?. name }
82
- </ div >
83
- </ div >
84
- ) : null }
85
- < CompWithLabel
86
- label = {
87
- < p id = "labelDes" className = "font-medium" >
88
- { isPersonalSign ? t ( 'signThisText' ) : t ( 'message' ) }
89
- </ p >
90
- }
91
- >
92
- < div
93
- id = "plaintext"
94
- className = { `${
95
- isPersonalSign ? 'pl-3 max-h-[316px]' : 'pl-1 max-h-[282px]'
96
- } pr-3 pt-3 pb-4 rounded bg-gray-4 overflow-auto break-words`}
97
- >
98
- { isPersonalSign ? (
99
- personalSignData
100
- . replace ( / \r / g, '\n' )
101
- . split ( '\n' )
102
- . map ( str => (
103
- < div key = { str } className = { str ? '' : 'h-[18px]' } >
104
- { str }
105
- </ div >
106
- ) )
107
- ) : (
108
- < PlaintextMessage message = { plaintextData ?. message ?? { } } />
109
- ) }
110
- </ div >
111
- </ CompWithLabel >
112
- < Alert
113
- open = { isHw }
114
- className = "mt-3"
115
- type = "warning"
116
- closable = { false }
117
- width = "w-full"
118
- content = { t (
119
- isPersonalSign ? 'disablePersonSign' : 'disableTypeSign' ,
120
- ) }
121
- />
122
- </ main >
117
+ { Content }
123
118
< DappFooter
124
119
cancelText = { t ( 'cancel' ) }
125
120
confirmText = { t ( 'sign' ) }
0 commit comments