Compare commits
6 Commits
master
...
feature/pc
Author | SHA1 | Date |
---|---|---|
john | 20c5eaf47d | |
john | 6a819b6412 | |
john | daf5634a10 | |
john | 5e4d6e6521 | |
john | a58b225544 | |
john | c1a8cfd6d6 |
|
@ -1,6 +1,12 @@
|
||||||
VITE_BASE_URL=/
|
###
|
||||||
VITE_BASE_API_URL=/dev
|
# @LastEditors: John
|
||||||
|
# @Date: 2024-06-26 15:04:10
|
||||||
|
# @LastEditTime: 2024-07-01 15:13:11
|
||||||
|
# @Author: John
|
||||||
|
###
|
||||||
|
VITE_BASE_URL=https://www.nodeai.world
|
||||||
|
VITE_BASE_API_URL=https://www.nodeai.world/api
|
||||||
VITE_PARTICIPATE_CHAIN_ID=56
|
VITE_PARTICIPATE_CHAIN_ID=56
|
||||||
VITE_PURCHASED_CONTRACT_ADDRESS=
|
VITE_PURCHASED_CONTRACT_ADDRESS=0x17c38AaF564716A3D9dD4EBE7Fb5db2D43c6A834
|
||||||
VITE_NETWORK_USDT_ADDRESS=
|
VITE_NETWORK_USDT_ADDRESS=0x55d398326f99059fF775485246999027B3197955
|
||||||
VITE_CHECK_TRANSACTION_DETAILS_URL=https://bscscan.com/
|
VITE_CHECK_TRANSACTION_DETAILS_URL=https://bscscan.com/
|
Binary file not shown.
|
@ -0,0 +1,100 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFuTCCBKGgAwIBAgIRAM0x4XaWUXTydUUUUxaKx6swDQYJKoZIhvcNAQELBQAw
|
||||||
|
gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
||||||
|
BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE
|
||||||
|
AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
|
||||||
|
QTAeFw0yNDA2MjgwMDAwMDBaFw0yNDA5MjYyMzU5NTlaMBcxFTATBgNVBAMTDG5v
|
||||||
|
ZGVhaS53b3JsZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ699oW5
|
||||||
|
ui84v8H0mCdkfvLMT8oNOuHok1swS9qVPATsG+nunCFNJ4MWIkjWjRdYHIAMKkSh
|
||||||
|
hwVnXrTnAQBSnijODJEm4XvTlC7iX3GqMoFZzH4HO635bKQUKQ4IS/W4iBTgVNP/
|
||||||
|
jPV9q+uiHdGYw32IdAcvMBybJZK6hu6hHCPzavb/OlaLnP5QmVDhkyuGTkXPnZNn
|
||||||
|
Q3S5BtKX4nYTDa+7xk+641xjkUjQPMXnBCkv0lLrBE1UxYW2ydtoIBk0G4y6PkLN
|
||||||
|
0HFDSDU2HRkq9HCl3YcKykwePbOdOUrIxlVaIz5SvXX+1uKMlSl3zSFrK2ML4R6A
|
||||||
|
MyEtd2NolWvwVusCAwEAAaOCAoUwggKBMB8GA1UdIwQYMBaAFI2MXsRUrYrhd+mb
|
||||||
|
+ZsF4bgBjWHhMB0GA1UdDgQWBBQt2UCT9yi00+7Qbr/oqhwkYPjjRjAOBgNVHQ8B
|
||||||
|
Af8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB
|
||||||
|
BQUHAwIwSQYDVR0gBEIwQDA0BgsrBgEEAbIxAQICBzAlMCMGCCsGAQUFBwIBFhdo
|
||||||
|
dHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBAgEwgYQGCCsGAQUFBwEBBHgw
|
||||||
|
djBPBggrBgEFBQcwAoZDaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNB
|
||||||
|
RG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNydDAjBggrBgEFBQcwAYYX
|
||||||
|
aHR0cDovL29jc3Auc2VjdGlnby5jb20wKQYDVR0RBCIwIIIMbm9kZWFpLndvcmxk
|
||||||
|
ghB3d3cubm9kZWFpLndvcmxkMIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDvAHUAdv+I
|
||||||
|
Pwq2+5VRwmHM9Ye6NLSkzbsp3GhCCp/mZ0xaOnQAAAGQXkQx7gAABAMARjBEAiAv
|
||||||
|
rU66TNkQIw0xeWnoVyki3czMgJqHhfcG5lFaFDHA6wIgbxtFc6uJ8ihs/uZNgOoZ
|
||||||
|
22/smxhg0Wdn85rSr/WYcVUAdgA/F0tP1yJHWJQdZRyEvg0S7ZA3fx+FauvBvyiF
|
||||||
|
7PhkbgAAAZBeRDGHAAAEAwBHMEUCIHcG7OuFdpyy8dxRRw0YdO9AopeQhr07FOLo
|
||||||
|
3iZZhZzvAiEAxjpBbU1mqMTKa4M5kCmrVwsPbzSBxWErPh14O8FB0ZIwDQYJKoZI
|
||||||
|
hvcNAQELBQADggEBADdlHwQL8rHTaoMbYEy5HwyWSgts02h6evh0sK37XCQt1ZGR
|
||||||
|
mH/Y8VBOipCKmjATrUagM70x7cD9qOANVSjeqa68i2rplSisKIAJrHbJ2vp0ef6j
|
||||||
|
ZkdwOoWRQMZ/8xc9TMfnxQ/AlPPlXL39Z77k1uhTGUgLdng7z2QPYJB6/X/+UkE+
|
||||||
|
r2ADKfvCeSe9Y/5lZFi+QknGNxukwvkoeZJDzFPz8LZrRsX0Ke3HfEnx21kFsOnH
|
||||||
|
w3ybLJruUwb5XySkgiHgr2ZGZe101g9zEVQhgCbHp+b7FpTNCBHTAZZmaVFCQ1s9
|
||||||
|
HY3AZ+OU0GYeApMkXgjxVLuDuxyAAjkeAQRfYuY=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
|
||||||
|
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
|
||||||
|
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
|
||||||
|
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
|
||||||
|
MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
|
||||||
|
BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
|
||||||
|
ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
|
||||||
|
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
||||||
|
AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
|
||||||
|
TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
|
||||||
|
eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
|
||||||
|
oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
|
||||||
|
Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
|
||||||
|
uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
|
||||||
|
BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
|
||||||
|
+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
|
||||||
|
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
|
||||||
|
CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
|
||||||
|
LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
|
||||||
|
BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
|
||||||
|
bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
|
||||||
|
L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
|
||||||
|
ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
|
||||||
|
7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
|
||||||
|
H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
|
||||||
|
RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
|
||||||
|
xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
|
||||||
|
sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
|
||||||
|
l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
|
||||||
|
6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
|
||||||
|
LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
|
||||||
|
yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
|
||||||
|
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7
|
||||||
|
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
|
||||||
|
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
|
||||||
|
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
|
||||||
|
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
|
||||||
|
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
|
||||||
|
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0
|
||||||
|
aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sI
|
||||||
|
s9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnG
|
||||||
|
vDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQ
|
||||||
|
Ijy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfb
|
||||||
|
IWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0
|
||||||
|
tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97E
|
||||||
|
xwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNV
|
||||||
|
icQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5
|
||||||
|
D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJ
|
||||||
|
WBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ
|
||||||
|
5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzG
|
||||||
|
KAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSg
|
||||||
|
EQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rID
|
||||||
|
ZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAG
|
||||||
|
BgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29t
|
||||||
|
L0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggr
|
||||||
|
BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
|
||||||
|
A4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+
|
||||||
|
rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+
|
||||||
|
/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA
|
||||||
|
CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F
|
||||||
|
zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA
|
||||||
|
vGp4z7h/jnZymQyd/teRCBaho1+V
|
||||||
|
-----END CERTIFICATE-----
|
|
@ -0,0 +1,28 @@
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClZYi6pLHxz6G9
|
||||||
|
MSxUpeD44ADWJQ37QsA+fSZLURUkN7Vq8o7dafbgxLTveUcbrWhXlaU92+rQ7Z2Z
|
||||||
|
svBQ8NcmnQOSFuTzNMfvrGK7nr9PxwLdAvQmdkKZvCeMdVrZFKK5BMX0i3cvmbEp
|
||||||
|
td6mhs5BaJW5aNSZH9/qfCBLRcBm5dTNlKJB8e2m4b6Ib7aQ29ZtbD77F+tfXy2W
|
||||||
|
+eH4p2EtbkaSd2qv6CGn79rQsA/16LjA5GnLhFiYej37RKgEWNGBGbkmYoJznFVy
|
||||||
|
JUrZJCTcKLnJQJObzzcto2t93unOXYP4Tpyru0eQpDOqNwx31oNdM9lVZ3vfE4xc
|
||||||
|
aJ1vOOV3AgMBAAECggEAMKNlrIFvRM2K4jCaOUBYosd454CZFnkgQKAcCU0MWwy4
|
||||||
|
4Hz5D1qwe5PNI5k2FIkPpKYApGrOKGegD4lkC2Fv286TtLvf0zeDzlMS69q4ptS+
|
||||||
|
3lCWjNL9Lel7dd4y+6CKY79oGUyEHa7kPwBZO/5rnCeN1CrkTi1l8zZSZuBZvshB
|
||||||
|
mh1wRXD4gAtl+kpqhWyiTbZPDnd98ngaO8QTyKthAqugjnbI+BZgD7nYQQ2NM6ia
|
||||||
|
+eeLFls6k6/IFWHwcanZ1+aD8lBtRdBHgfcw4wCN/tJxdeqyZnq+Ptegz84Vj4em
|
||||||
|
FCpiRlA6DM0WpI+GkRcUDTaU1UAF5WSOtC9BnSpa2QKBgQDSBkI1V86Ix4L8ZofY
|
||||||
|
BTfotTSuJPoLkxMXoEXb86H+Er9db6TnsAhUTyhD7mnbF8XF76txEZs3ytvhXHq0
|
||||||
|
g10Ls+8jlNsqXW1ar4TeVHcDJNXLMl3L2gM7nZ0Dw7ET1AxR/L2+w9LjMA3E6q2H
|
||||||
|
P9238pzjDjOBv8lRjGJMTFBvKQKBgQDJmlaEpzpJ0jbqR0C3YdRZcQmkazTXiwXl
|
||||||
|
Ee+tdsvBdDd3IcgcpBwGrPaISy5CnO6VnaFkB28Hsvl0SDV1+60fdaOELSmmahKd
|
||||||
|
nYmSeO2YUQtYXy/6V/l3yST0VlL76byrAGNfa75HlDlgyRyz8oMfquzMGzYIs539
|
||||||
|
/gt1z+9jnwKBgQCgJnGaJ4iwOCKjwLNZgDEv2+191WhuJwpp+6cJn/Aow7b00stW
|
||||||
|
eJ8BWxMDKevCS5Bd7PI4WAqaMrAUWuaee4UaBW0XHs04suFOQ4T33EScOxxjw9ZO
|
||||||
|
OcI5VWiDlFeVHR7/7c/qhXxsDRqSy7ji50p0mCYV5aBVEh+7dWcHczHqcQKBgHOc
|
||||||
|
lYcHG28gJSve5qcDbDJKl5v5etksuZmu2oLggGKVUgV4kviRyByv7cUlUAcVVeDo
|
||||||
|
/5eMh8ijg1iC3F2nkZVb8gSnnZ34cGqA4FbmEGLr/xSTqcDn2IEwEYgpRPeACBkM
|
||||||
|
ZPBgqkMEJo9xZYtwRG/RpnA6HpeI4c65dDsAnqjDAoGAQta9vNa9KH8fpEK3DCVV
|
||||||
|
JSOi0HNw6jgwi1KVN3uD3g1t9KTMKugjKn+NT1wNW/aovYLkEe1VtlDvPzmen/5Y
|
||||||
|
scmamazk1+s9dbRDfPXfqL1xN2tX7EpMkfiCCpqD38013eHddC6JXpUuOkmrANfc
|
||||||
|
S5y9cEj8j6Waya5kNuQqSVs=
|
||||||
|
-----END PRIVATE KEY-----
|
|
@ -0,0 +1,27 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIEpDCCA4ygAwIBAgIUIiGxxZFFYK/IksW5bUol8GS6ak8wDQYJKoZIhvcNAQEL
|
||||||
|
BQAwgYsxCzAJBgNVBAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMTQw
|
||||||
|
MgYDVQQLEytDbG91ZEZsYXJlIE9yaWdpbiBTU0wgQ2VydGlmaWNhdGUgQXV0aG9y
|
||||||
|
aXR5MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlh
|
||||||
|
MB4XDTI0MDYzMDE1MzUwMFoXDTM5MDYyNzE1MzUwMFowYjEZMBcGA1UEChMQQ2xv
|
||||||
|
dWRGbGFyZSwgSW5jLjEdMBsGA1UECxMUQ2xvdWRGbGFyZSBPcmlnaW4gQ0ExJjAk
|
||||||
|
BgNVBAMTHUNsb3VkRmxhcmUgT3JpZ2luIENlcnRpZmljYXRlMIIBIjANBgkqhkiG
|
||||||
|
9w0BAQEFAAOCAQ8AMIIBCgKCAQEApWWIuqSx8c+hvTEsVKXg+OAA1iUN+0LAPn0m
|
||||||
|
S1EVJDe1avKO3Wn24MS073lHG61oV5WlPdvq0O2dmbLwUPDXJp0Dkhbk8zTH76xi
|
||||||
|
u56/T8cC3QL0JnZCmbwnjHVa2RSiuQTF9It3L5mxKbXepobOQWiVuWjUmR/f6nwg
|
||||||
|
S0XAZuXUzZSiQfHtpuG+iG+2kNvWbWw++xfrX18tlvnh+KdhLW5Gkndqr+ghp+/a
|
||||||
|
0LAP9ei4wORpy4RYmHo9+0SoBFjRgRm5JmKCc5xVciVK2SQk3Ci5yUCTm883LaNr
|
||||||
|
fd7pzl2D+E6cq7tHkKQzqjcMd9aDXTPZVWd73xOMXGidbzjldwIDAQABo4IBJjCC
|
||||||
|
ASIwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD
|
||||||
|
ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQVW93wA7aT2uzpVH9qaHLNcgM1mDAf
|
||||||
|
BgNVHSMEGDAWgBQk6FNXXXw0QIep65TbuuEWePwppDBABggrBgEFBQcBAQQ0MDIw
|
||||||
|
MAYIKwYBBQUHMAGGJGh0dHA6Ly9vY3NwLmNsb3VkZmxhcmUuY29tL29yaWdpbl9j
|
||||||
|
YTAnBgNVHREEIDAegg4qLm5vZGVhaS53b3JsZIIMbm9kZWFpLndvcmxkMDgGA1Ud
|
||||||
|
HwQxMC8wLaAroCmGJ2h0dHA6Ly9jcmwuY2xvdWRmbGFyZS5jb20vb3JpZ2luX2Nh
|
||||||
|
LmNybDANBgkqhkiG9w0BAQsFAAOCAQEAGISJxOYxuAAXapVJxU5vP2rt61xH1vC8
|
||||||
|
UEUSD7u3WUoULJIZt3pHyfUI6twxHlXttlFWEq3aogrpuGlv76OCXILNy5B4Xkx8
|
||||||
|
OR47xvO5EClDdVJb9a5hET6iJn9UXR9UrSiuzZAE0HEOK1t3KEJOFh0/39sDqwTn
|
||||||
|
pJ49DjiVA7TvvJgUljjnumf40I1F6apuZbdnW03VHr3WsBkPE/wv+ZEBxwRTZaLB
|
||||||
|
1BakIMguI8tnSSReAf4O+oOwIAgz0OwT18d/xc4O8hhkitdfUnON03KZLEK26J1r
|
||||||
|
KQ+8PPhMBKVjsPTM9li8vAWSq8Cc3GxoNnvOeV/u1NXnxfD+X6vBwA==
|
||||||
|
-----END CERTIFICATE-----
|
|
@ -0,0 +1,59 @@
|
||||||
|
server {
|
||||||
|
server_name nodeai.world www.nodeai.world;
|
||||||
|
client_max_body_size 50m;
|
||||||
|
listen *:80;
|
||||||
|
listen *:443 ssl;
|
||||||
|
#ssl on;
|
||||||
|
|
||||||
|
# 静态文件夹和域名对应
|
||||||
|
root /data/nginx/nodeai.world;
|
||||||
|
index index.html index.htm;
|
||||||
|
|
||||||
|
# 日志文件名和域名对应
|
||||||
|
access_log /data/nginx/logs/nodeai.world.access.log;
|
||||||
|
error_log /data/nginx/logs/nodeai.world.error.log;
|
||||||
|
|
||||||
|
ssl_certificate cert/nodeai.worid.pem;
|
||||||
|
ssl_certificate_key cert/nodeai.worid.key;
|
||||||
|
|
||||||
|
location /upload {
|
||||||
|
root /data/nginx/;
|
||||||
|
index index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://127.17.0.1:8102;
|
||||||
|
proxy_headers_hash_max_size 51200;
|
||||||
|
proxy_headers_hash_bucket_size 6400;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
|
||||||
|
proxy_buffering off;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/api {
|
||||||
|
proxy_pass http://127.17.0.1:8102/api;
|
||||||
|
proxy_headers_hash_max_size 51200;
|
||||||
|
proxy_headers_hash_bucket_size 6400;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
|
||||||
|
proxy_buffering off;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
location /zip {
|
||||||
|
alias /data/nginx/zip/;#此处定义映射文件位置
|
||||||
|
allow all;
|
||||||
|
autoindex on;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-17 18:25:10
|
* @Date: 2024-06-17 18:25:10
|
||||||
* @LastEditTime: 2024-06-19 16:14:06
|
* @LastEditTime: 2024-06-28 17:46:23
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
export default {
|
export default {
|
||||||
|
@ -11,7 +11,7 @@ export default {
|
||||||
rootValue: 37.5,
|
rootValue: 37.5,
|
||||||
propList: ["*"],
|
propList: ["*"],
|
||||||
exclude: (e) => {
|
exclude: (e) => {
|
||||||
if (/.*-m\.css$/.test(e) || /.module\.css$/.test(e)) {
|
if (/.*-m\.css$/.test(e) || /.*-m.module\.css$/.test(e)) {
|
||||||
// console.log(e);
|
// console.log(e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="46" height="46" viewBox="0 0 46 46"><g><g><g><rect x="0" y="0" width="46" height="46" rx="23" fill="#2DFCFC" fill-opacity="1"/></g><g><ellipse cx="15.29602861404419" cy="18.62433671951294" rx="5.9895710945129395" ry="5.9895710945129395" fill="#000000" fill-opacity="1"/></g><g><path d="M28.716520703125,12.63720703125L14.313720703125,33.363107031249996L22.288390703125,33.363107031249996L36.693520703125,12.63720703125L28.716520703125,12.63720703125Z" fill="#000000" fill-opacity="1"/></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="46" height="46" viewBox="0 0 46 46"><g><g><g><rect x="0" y="0" width="46" height="46" rx="23" fill="#EA6D28" fill-opacity="1"/></g><g><ellipse cx="15.29602861404419" cy="18.62433671951294" rx="5.9895710945129395" ry="5.9895710945129395" fill="#000000" fill-opacity="1"/></g><g><path d="M28.716520703125,12.63720703125L14.313720703125,33.363107031249996L22.288390703125,33.363107031249996L36.693520703125,12.63720703125L28.716520703125,12.63720703125Z" fill="#000000" fill-opacity="1"/></g></g></g></svg>
|
Before Width: | Height: | Size: 619 B After Width: | Height: | Size: 619 B |
|
@ -3,7 +3,7 @@ html,
|
||||||
#root {
|
#root {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: url("./assets/home_bg.png");
|
background: #fafafb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
|
|
38
src/App.tsx
38
src/App.tsx
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-17 17:20:03
|
* @Date: 2024-06-17 17:20:03
|
||||||
* @LastEditTime: 2024-06-26 16:00:00
|
* @LastEditTime: 2024-07-01 16:41:42
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import { Route, Routes } from "react-router-dom";
|
import { Route, Routes } from "react-router-dom";
|
||||||
|
@ -16,7 +16,7 @@ import InvitationList from "./pages/InvitationList";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import useUserStore from "./store/User";
|
import useUserStore from "./store/User";
|
||||||
import { getUrlQueryParam } from "./utils";
|
import { getUrlParameterByName, isMobile } from "./utils";
|
||||||
import { UrlQueryParamsKey } from "./constants";
|
import { UrlQueryParamsKey } from "./constants";
|
||||||
import { signAndLogin } from "./utils/wallet";
|
import { signAndLogin } from "./utils/wallet";
|
||||||
import { useAccount } from "wagmi";
|
import { useAccount } from "wagmi";
|
||||||
|
@ -26,7 +26,9 @@ function App() {
|
||||||
const { address } = useAccount();
|
const { address } = useAccount();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
i18n.changeLanguage(currantLang);
|
i18n.changeLanguage(currantLang);
|
||||||
UpdateInviteCode(getUrlQueryParam(UrlQueryParamsKey.INVITE_CODE) || "");
|
UpdateInviteCode(
|
||||||
|
getUrlParameterByName(UrlQueryParamsKey.INVITE_CODE) || ""
|
||||||
|
);
|
||||||
return () => {};
|
return () => {};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
@ -45,12 +47,30 @@ function App() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<RouterLogProvider>
|
<RouterLogProvider>
|
||||||
<Header />
|
{isMobile ? (
|
||||||
<Routes>
|
<>
|
||||||
<Route path="/" element={<Home />} />
|
<Header.Mobile />
|
||||||
<Route path="/mint" element={<Mint />} />
|
<Routes>
|
||||||
<Route path="/invitationlist" element={<InvitationList />}></Route>
|
<>
|
||||||
</Routes>
|
<Route path="/" element={<Home.Mobile />} />
|
||||||
|
<Route path="/mint" element={<Mint />} />
|
||||||
|
<Route
|
||||||
|
path="/invitationlist"
|
||||||
|
element={<InvitationList />}
|
||||||
|
></Route>
|
||||||
|
</>
|
||||||
|
</Routes>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Header.Desktop />
|
||||||
|
<Routes>
|
||||||
|
<>
|
||||||
|
<Route path="/" element={<Home.Desktop />} />
|
||||||
|
</>
|
||||||
|
</Routes>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</RouterLogProvider>
|
</RouterLogProvider>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="46" height="46" viewBox="0 0 46 46"><g><g><g><rect x="0" y="0" width="46" height="46" rx="23" fill="#2DFCFC" fill-opacity="1"/></g><g><ellipse cx="15.29602861404419" cy="18.62433671951294" rx="5.9895710945129395" ry="5.9895710945129395" fill="#000000" fill-opacity="1"/></g><g><path d="M28.716520703125,12.63720703125L14.313720703125,33.363107031249996L22.288390703125,33.363107031249996L36.693520703125,12.63720703125L28.716520703125,12.63720703125Z" fill="#000000" fill-opacity="1"/></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="46" height="46" viewBox="0 0 46 46"><g><g><g><rect x="0" y="0" width="46" height="46" rx="23" fill="#EA6D28" fill-opacity="1"/></g><g><ellipse cx="15.29602861404419" cy="18.62433671951294" rx="5.9895710945129395" ry="5.9895710945129395" fill="#000000" fill-opacity="1"/></g><g><path d="M28.716520703125,12.63720703125L14.313720703125,33.363107031249996L22.288390703125,33.363107031249996L36.693520703125,12.63720703125L28.716520703125,12.63720703125Z" fill="#000000" fill-opacity="1"/></g></g></g></svg>
|
Before Width: | Height: | Size: 619 B After Width: | Height: | Size: 619 B |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 325 KiB After Width: | Height: | Size: 322 KiB |
|
@ -1,17 +1,17 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-18 15:19:21
|
* @Date: 2024-06-18 15:19:21
|
||||||
* @LastEditTime: 2024-06-18 18:49:40
|
* @LastEditTime: 2024-07-01 14:10:45
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
.header {
|
.header {
|
||||||
background-color: #101010;
|
background-color: #fafafb;
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
.header_top {
|
.header_top {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
border-bottom: 0.25px solid #333333;
|
border-bottom: 1px solid #d8d8d8;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
|
|
||||||
.header_logo {
|
.header_logo {
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-18 15:16:31
|
* @Date: 2024-06-18 15:16:31
|
||||||
* @LastEditTime: 2024-06-27 15:29:00
|
* @LastEditTime: 2024-07-01 15:19:02
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import Picker, {
|
import Picker, {
|
||||||
|
@ -11,7 +11,7 @@ import Picker, {
|
||||||
import { useContext, useEffect, useMemo, useState } from "react";
|
import { useContext, useEffect, useMemo, useState } from "react";
|
||||||
import IconFont from "./iconfont";
|
import IconFont from "./iconfont";
|
||||||
import logo from "@/assets/logo.svg";
|
import logo from "@/assets/logo.svg";
|
||||||
import classes from "./Header.module.css";
|
import classes from "./Header-m.module.css";
|
||||||
import { useLocation, useNavigate, useNavigation } from "react-router-dom";
|
import { useLocation, useNavigate, useNavigation } from "react-router-dom";
|
||||||
import { RouterLogContext } from "@/context/RouterContext";
|
import { RouterLogContext } from "@/context/RouterContext";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
@ -27,7 +27,7 @@ const langColums: Action[] = [
|
||||||
{ text: "日本語", key: Lang.jp },
|
{ text: "日本語", key: Lang.jp },
|
||||||
{ text: "DEUTSCH", key: Lang.de },
|
{ text: "DEUTSCH", key: Lang.de },
|
||||||
];
|
];
|
||||||
export default function () {
|
function Mobile() {
|
||||||
const { UpdateLang } = useUserStore();
|
const { UpdateLang } = useUserStore();
|
||||||
|
|
||||||
const route = useContext(RouterLogContext);
|
const route = useContext(RouterLogContext);
|
||||||
|
@ -70,7 +70,7 @@ export default function () {
|
||||||
<IconFont
|
<IconFont
|
||||||
className={classes.header_nav_icon}
|
className={classes.header_nav_icon}
|
||||||
name="icon_arrow_left"
|
name="icon_arrow_left"
|
||||||
color={"#fff"}
|
color={"#000000"}
|
||||||
/>
|
/>
|
||||||
<span>{navTitle}</span>
|
<span>{navTitle}</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -79,3 +79,12 @@ export default function () {
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Desktop() {
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
Mobile,
|
||||||
|
Desktop,
|
||||||
|
};
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-19 10:49:42
|
* @Date: 2024-06-19 10:49:42
|
||||||
* @LastEditTime: 2024-06-19 10:52:32
|
* @LastEditTime: 2024-06-28 14:05:45
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import classes from "./RecordsItem.module.css";
|
import classes from "./RecordsItem-m.module.css";
|
||||||
export default function RecordsItem({
|
export default function RecordsItem({
|
||||||
itemList,
|
itemList,
|
||||||
}: {
|
}: {
|
||||||
|
|
|
@ -61,7 +61,7 @@ createWeb3Modal({
|
||||||
wagmiConfig: config,
|
wagmiConfig: config,
|
||||||
projectId,
|
projectId,
|
||||||
themeVariables: {
|
themeVariables: {
|
||||||
"--w3m-accent": "#2dfcfc",
|
"--w3m-accent": "#EA6D28",
|
||||||
},
|
},
|
||||||
featuredWalletIds: [
|
featuredWalletIds: [
|
||||||
...(window.ethereum
|
...(window.ethereum
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
"总收益= 已领取 + 待领取": "Total Revenue = Claimed + Pending",
|
"总收益= 已领取 + 待领取": "Total Revenue = Claimed + Pending",
|
||||||
"邀请": "Invite",
|
"邀请": "Invite",
|
||||||
"邀请链接": "Invite Link",
|
"邀请链接": "Invite Link",
|
||||||
"Invite your friends to become YOTTA nodes and you will get a 20% rebate.": "Invite your friends to become YOTTA nodes and you will get a 20% rebate.",
|
"Invite your friends to become YOTTA nodes and you will get a 10% rebate.": "Invite your friends to become YOTTA nodes and you will get a 10% rebate.",
|
||||||
"数据披露": "Data Disclosure",
|
"数据披露": "Data Disclosure",
|
||||||
"资金池": "Fund Pool",
|
"资金池": "Fund Pool",
|
||||||
"社长席位": "Leader Seats",
|
"社长席位": "Leader Seats",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-17 17:20:03
|
* @Date: 2024-06-17 17:20:03
|
||||||
* @LastEditTime: 2024-06-20 11:43:14
|
* @LastEditTime: 2024-07-01 16:46:07
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import "@/i18n/init.ts";
|
import "@/i18n/init.ts";
|
||||||
|
@ -15,9 +15,9 @@ import EventBusProvider from "./context/EventBusContext.tsx";
|
||||||
import { WalletProvider } from "./components/WalletProvider.tsx";
|
import { WalletProvider } from "./components/WalletProvider.tsx";
|
||||||
import flexible from "./utils/flexible.ts";
|
import flexible from "./utils/flexible.ts";
|
||||||
import VConsole from "vconsole";
|
import VConsole from "vconsole";
|
||||||
import { getUrlQueryParam } from "./utils/index.ts";
|
import { getUrlParameterByName } from "./utils/index.ts";
|
||||||
|
|
||||||
if (getUrlQueryParam("vconsole") === "1") {
|
if (getUrlParameterByName("vconsole") === "1") {
|
||||||
new VConsole();
|
new VConsole();
|
||||||
}
|
}
|
||||||
flexible(window, document);
|
flexible(window, document);
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* @LastEditors: John
|
||||||
|
* @Date: 2024-06-28 14:09:55
|
||||||
|
* @LastEditTime: 2024-06-28 14:14:29
|
||||||
|
* @Author: John
|
||||||
|
*/
|
||||||
|
import useUserStore from "@/store/User";
|
||||||
|
import { useWeb3Modal } from "@web3modal/wagmi/react";
|
||||||
|
import { useEffect, useMemo, useRef, useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useAccount } from "wagmi";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import { Dialog } from "antd-mobile";
|
||||||
|
import {
|
||||||
|
api_get_homepage_user_data,
|
||||||
|
api_query_user_invitation_code,
|
||||||
|
} from "@/server/api";
|
||||||
|
import { UserHomeData } from "@/server/module";
|
||||||
|
import { UrlQueryParamsKey } from "@/constants";
|
||||||
|
import usePollingCheckBuyStatus from "@/hook/usePollingCheckBuyStatus";
|
||||||
|
import { ToastHandler } from "antd-mobile/es/components/toast";
|
||||||
|
import { PullStatus } from "antd-mobile/es/components/pull-to-refresh";
|
||||||
|
export default function () {
|
||||||
|
const { Token, UpdateToken } = useUserStore();
|
||||||
|
const { open } = useWeb3Modal();
|
||||||
|
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { address } = useAccount();
|
||||||
|
|
||||||
|
const [tabIndex, setTabIndex] = useState(0);
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const [userData, setUserData] = useState<UserHomeData>();
|
||||||
|
const [inviteCode, setInviteCode] = useState("");
|
||||||
|
|
||||||
|
const userInviteLink = useMemo(
|
||||||
|
() =>
|
||||||
|
`${location.origin}/#/?${UrlQueryParamsKey.INVITE_CODE}=${inviteCode}`,
|
||||||
|
[inviteCode]
|
||||||
|
);
|
||||||
|
const receiveLoadingToast = useRef<ToastHandler>();
|
||||||
|
const {
|
||||||
|
transcationStatus,
|
||||||
|
startPollingCheckBuyStatus,
|
||||||
|
stopPollingCheckBuyStatus,
|
||||||
|
} = usePollingCheckBuyStatus("NORMAL");
|
||||||
|
|
||||||
|
const statusRecord: Record<PullStatus, string> = {
|
||||||
|
pulling: "Pull down to refresh",
|
||||||
|
canRelease: "Release to refresh immediately",
|
||||||
|
refreshing: "Loading...",
|
||||||
|
complete: "Refresh complete",
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (Token) {
|
||||||
|
getHomeData();
|
||||||
|
getInviteCode();
|
||||||
|
}
|
||||||
|
return () => {};
|
||||||
|
}, [Token]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (transcationStatus == "success") {
|
||||||
|
receiveLoadingToast.current?.close();
|
||||||
|
stopPollingCheckBuyStatus();
|
||||||
|
Dialog.alert({
|
||||||
|
content: `${t("领取成功,前往钱包查看")}`,
|
||||||
|
confirmText: "OK",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {};
|
||||||
|
}, [transcationStatus]);
|
||||||
|
|
||||||
|
async function getHomeData() {
|
||||||
|
const { data } = await api_get_homepage_user_data().send({});
|
||||||
|
setUserData(data?.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getInviteCode() {
|
||||||
|
const { data } = await api_query_user_invitation_code().send({});
|
||||||
|
setInviteCode(data?.data.invitationCode || "");
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log("user token:", Token);
|
||||||
|
|
||||||
|
return () => {};
|
||||||
|
}, [Token]);
|
||||||
|
return {
|
||||||
|
getHomeData,
|
||||||
|
statusRecord,
|
||||||
|
Token,
|
||||||
|
address,
|
||||||
|
setUserData,
|
||||||
|
userData,
|
||||||
|
tabIndex,
|
||||||
|
t,
|
||||||
|
setTabIndex,
|
||||||
|
navigate,
|
||||||
|
userInviteLink,
|
||||||
|
open,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
import usePagination from "@/hook/usePagination";
|
||||||
|
import { api_recommended_list } from "@/server/api";
|
||||||
|
import { RecommendedListItem } from "@/server/module";
|
||||||
|
import { Empty, InfiniteScroll } from "antd-mobile";
|
||||||
|
import DataTable, { TableColumn } from "react-data-table-component";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
|
export default function () {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const columns: TableColumn<RecommendedListItem>[] = [
|
||||||
|
{
|
||||||
|
name: t("地址"),
|
||||||
|
selector: (row) => row.walletAddress,
|
||||||
|
grow: 9,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Node",
|
||||||
|
selector: (row) => row.nodeNumber,
|
||||||
|
grow: 1,
|
||||||
|
// @ts-ignore
|
||||||
|
right: "true",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const { list, hasMore, loadMore } = usePagination<RecommendedListItem>({
|
||||||
|
service({ pageNum, pageSize }) {
|
||||||
|
return new Promise(async (reslove) => {
|
||||||
|
const { data } = await api_recommended_list().send({
|
||||||
|
queryParams: { pageNum, pageSize },
|
||||||
|
});
|
||||||
|
reslove(data?.data.records || []);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
columns,
|
||||||
|
list,
|
||||||
|
loadMore,
|
||||||
|
hasMore,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,118 @@
|
||||||
|
import { cn, filterAddressBeforeZero, filterAmountBeforeZero } from "@/utils";
|
||||||
|
import classes from "./Mint-m.module.css";
|
||||||
|
import nft_bg from "@/assets/nft_bg.svg";
|
||||||
|
import Button from "antd-mobile/es/components/button";
|
||||||
|
import Space from "antd-mobile/es/components/space";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useEffect, useMemo, useRef, useState } from "react";
|
||||||
|
import {
|
||||||
|
api_get_homepage_user_data,
|
||||||
|
api_get_nft_configuration_data,
|
||||||
|
api_node_order,
|
||||||
|
api_users_cancel_orders,
|
||||||
|
} from "@/server/api";
|
||||||
|
import {
|
||||||
|
NftConfigurationData,
|
||||||
|
NftOrder,
|
||||||
|
NodeOrder,
|
||||||
|
UserHomeData,
|
||||||
|
} from "@/server/module";
|
||||||
|
import {
|
||||||
|
authorizedU,
|
||||||
|
getApproveUsdt,
|
||||||
|
getBalance,
|
||||||
|
payByContract,
|
||||||
|
} from "@/contract/utils";
|
||||||
|
import { Dialog, Modal, Stepper, Toast } from "antd-mobile";
|
||||||
|
import useUserStore from "@/store/User";
|
||||||
|
import usePollingCheckBuyStatus from "@/hook/usePollingCheckBuyStatus";
|
||||||
|
import { ToastHandler } from "antd-mobile/es/components/toast";
|
||||||
|
import { BaseError } from "wagmi";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import { toWei } from "web3-utils";
|
||||||
|
|
||||||
|
export default function () {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { Token } = useUserStore();
|
||||||
|
const [nodeConfig, setNodeConfig] = useState<UserHomeData>();
|
||||||
|
const [approveUsdt, setApproveUsdt] = useState<bigint>(0n);
|
||||||
|
const [balance, setBalance] = useState<bigint>(0n);
|
||||||
|
const orderInfo = useRef<NodeOrder>();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const [num, setNum] = useState(1);
|
||||||
|
|
||||||
|
const buyLoadingToast = useRef<ToastHandler>();
|
||||||
|
const approveLoadingToast = useRef<ToastHandler>();
|
||||||
|
const {
|
||||||
|
transcationStatus,
|
||||||
|
startPollingCheckBuyStatus,
|
||||||
|
stopPollingCheckBuyStatus,
|
||||||
|
} = usePollingCheckBuyStatus("NORMAL");
|
||||||
|
|
||||||
|
const costNum = useMemo(
|
||||||
|
() =>
|
||||||
|
BigInt(
|
||||||
|
toWei(`${parseFloat(`${nodeConfig?.nodePrice || "0"}`) * num}`, "ether")
|
||||||
|
),
|
||||||
|
[nodeConfig?.nodePrice, num]
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
updateNodeConfig();
|
||||||
|
|
||||||
|
return () => {};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
(async () => {
|
||||||
|
Toast.show({ icon: "loading", content: t("正在获取已授权金额") });
|
||||||
|
setBalance(await getBalance());
|
||||||
|
setApproveUsdt(await getApproveUsdt());
|
||||||
|
Toast.clear();
|
||||||
|
})();
|
||||||
|
|
||||||
|
return () => {};
|
||||||
|
}, [Token]);
|
||||||
|
|
||||||
|
async function updateNodeConfig() {
|
||||||
|
const { data } = await api_get_homepage_user_data().send({});
|
||||||
|
setNodeConfig(data?.data);
|
||||||
|
}
|
||||||
|
useEffect(() => {
|
||||||
|
if (transcationStatus == "success") {
|
||||||
|
buyLoadingToast.current?.close();
|
||||||
|
stopPollingCheckBuyStatus();
|
||||||
|
Dialog.alert({
|
||||||
|
content: `${t(
|
||||||
|
"Buy successful. Please return to the homepage to view."
|
||||||
|
)}`,
|
||||||
|
confirmText: "OK",
|
||||||
|
onConfirm() {
|
||||||
|
navigate("/");
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {};
|
||||||
|
}, [transcationStatus]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return {
|
||||||
|
nodeConfig,
|
||||||
|
num,
|
||||||
|
setNum,
|
||||||
|
approveUsdt,
|
||||||
|
t,
|
||||||
|
balance,
|
||||||
|
approveLoadingToast,
|
||||||
|
costNum,
|
||||||
|
setApproveUsdt,
|
||||||
|
buyLoadingToast,
|
||||||
|
orderInfo,
|
||||||
|
updateNodeConfig,
|
||||||
|
startPollingCheckBuyStatus,
|
||||||
|
};
|
||||||
|
}
|
|
@ -14,10 +14,8 @@
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
||||||
background: #171719;
|
background: #ffffff;
|
||||||
|
box-shadow: 0px 2px 8px 0px rgba(99, 99, 99, 0.2);
|
||||||
box-shadow: 0px 4px 10px 0px rgba(45, 252, 252, 0.3),
|
|
||||||
inset 0px 0px 8px 0px #2dfcfc;
|
|
||||||
|
|
||||||
padding: 14px 15px;
|
padding: 14px 15px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
@ -57,7 +55,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -117,10 +115,9 @@
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
||||||
background: #2dfcfc;
|
background: #ea6d28;
|
||||||
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
border: 1px solid;
|
|
||||||
|
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
|
|
||||||
|
@ -153,7 +150,7 @@
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
||||||
background: #212123;
|
background: #eeeeef;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -173,7 +170,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
|
|
||||||
|
@ -193,7 +190,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
@ -210,7 +207,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
@ -245,7 +242,7 @@
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
||||||
background: #2dfcfc;
|
background: #ea6d28;
|
||||||
|
|
||||||
color: #101010;
|
color: #101010;
|
||||||
}
|
}
|
||||||
|
@ -260,7 +257,8 @@
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
||||||
background: #171719;
|
background: #ffffff;
|
||||||
|
box-shadow: 0px 2px 8px 0px rgba(99, 99, 99, 0.2);
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
.nftToken_content_nft {
|
.nftToken_content_nft {
|
||||||
/* 自动布局 */
|
/* 自动布局 */
|
||||||
|
@ -286,7 +284,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -303,7 +301,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #2dfcfc;
|
color: #ea6d28;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
|
|
||||||
|
@ -335,7 +333,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
@ -536,7 +534,7 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
background: #2dfcfc;
|
background: #ea6d28;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
@ -574,7 +572,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
@ -600,7 +598,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -625,7 +623,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -641,7 +639,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #2dfcfc;
|
color: #ea6d28;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
|
|
||||||
|
@ -657,7 +655,8 @@
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
||||||
background: #171719;
|
background: #ffffff;
|
||||||
|
box-shadow: 0px 2px 8px 0px rgba(99, 99, 99, 0.2);
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -680,7 +679,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #333333;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -697,7 +696,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #eaeaea;
|
color: #666666;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
@ -720,7 +719,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
|
|
|
@ -1,314 +1,288 @@
|
||||||
import classes from "./Home.module.css";
|
/*
|
||||||
import useUserStore from "@/store/User";
|
* @LastEditors: John
|
||||||
|
* @Date: 2024-06-26 15:04:10
|
||||||
|
* @LastEditTime: 2024-07-01 17:35:37
|
||||||
|
* @Author: John
|
||||||
|
*/
|
||||||
|
import classes from "./Home-m.module.css";
|
||||||
import { cn, copyText, getLevelName, shortenString } from "@/utils";
|
import { cn, copyText, getLevelName, shortenString } from "@/utils";
|
||||||
import { useWeb3Modal } from "@web3modal/wagmi/react";
|
|
||||||
import { useEffect, useMemo, useRef, useState } from "react";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import logo from "@/assets/logo.svg";
|
import logo from "@/assets/logo.svg";
|
||||||
import nftBg from "@/assets/nft_bg.svg";
|
import nftBg from "@/assets/nft_bg.svg";
|
||||||
import usdtBg from "@/assets/usdt_bg.svg";
|
|
||||||
import IconFont from "@/components/iconfont";
|
import IconFont from "@/components/iconfont";
|
||||||
import { BaseError, useAccount } from "wagmi";
|
import { PullToRefresh } from "antd-mobile";
|
||||||
import { config } from "@/components/WalletProvider";
|
|
||||||
import { createSearchParams, useNavigate } from "react-router-dom";
|
|
||||||
import { Button, Dialog, Empty, PullToRefresh, Toast } from "antd-mobile";
|
|
||||||
import { loginOut } from "@/utils/wallet";
|
import { loginOut } from "@/utils/wallet";
|
||||||
import {
|
import useHome from "./Feature/useHome";
|
||||||
api_claim_income,
|
import useMint from "./Feature/useMint";
|
||||||
api_get_homepage_user_data,
|
import useInvitationList from "./Feature/useInvitationList";
|
||||||
api_query_user_invitation_code,
|
function Mobile() {
|
||||||
} from "@/server/api";
|
|
||||||
import { UserHomeData } from "@/server/module";
|
|
||||||
import { UrlQueryParamsKey } from "@/constants";
|
|
||||||
import usePollingCheckBuyStatus from "@/hook/usePollingCheckBuyStatus";
|
|
||||||
import { ToastHandler } from "antd-mobile/es/components/toast";
|
|
||||||
import { disconnect, getAccount } from "@wagmi/core";
|
|
||||||
import { PullStatus } from "antd-mobile/es/components/pull-to-refresh";
|
|
||||||
export default function () {
|
|
||||||
const { Token, UpdateToken } = useUserStore();
|
|
||||||
const { open } = useWeb3Modal();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const { address } = useAccount();
|
|
||||||
|
|
||||||
const [tabIndex, setTabIndex] = useState(0);
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const [userData, setUserData] = useState<UserHomeData>();
|
|
||||||
const [inviteCode, setInviteCode] = useState("");
|
|
||||||
|
|
||||||
const userInviteLink = useMemo(
|
|
||||||
() =>
|
|
||||||
`${location.origin}/#/?${UrlQueryParamsKey.INVITE_CODE}=${inviteCode}`,
|
|
||||||
[inviteCode]
|
|
||||||
);
|
|
||||||
const receiveLoadingToast = useRef<ToastHandler>();
|
|
||||||
const {
|
const {
|
||||||
transcationStatus,
|
getHomeData,
|
||||||
startPollingCheckBuyStatus,
|
statusRecord,
|
||||||
stopPollingCheckBuyStatus,
|
Token,
|
||||||
} = usePollingCheckBuyStatus("NORMAL");
|
address,
|
||||||
|
setUserData,
|
||||||
const statusRecord: Record<PullStatus, string> = {
|
userData,
|
||||||
pulling: "Pull down to refresh",
|
tabIndex,
|
||||||
canRelease: "Release to refresh immediately",
|
t,
|
||||||
refreshing: "Loading...",
|
setTabIndex,
|
||||||
complete: "Refresh complete",
|
navigate,
|
||||||
};
|
userInviteLink,
|
||||||
|
open,
|
||||||
useEffect(() => {
|
} = useHome();
|
||||||
if (Token) {
|
|
||||||
getHomeData();
|
|
||||||
getInviteCode();
|
|
||||||
}
|
|
||||||
return () => {};
|
|
||||||
}, [Token]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (transcationStatus == "success") {
|
|
||||||
receiveLoadingToast.current?.close();
|
|
||||||
stopPollingCheckBuyStatus();
|
|
||||||
Dialog.alert({
|
|
||||||
content: `${t("领取成功,前往钱包查看")}`,
|
|
||||||
confirmText: "OK",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return () => {};
|
|
||||||
}, [transcationStatus]);
|
|
||||||
|
|
||||||
async function getHomeData() {
|
|
||||||
const { data } = await api_get_homepage_user_data().send({});
|
|
||||||
setUserData(data?.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getInviteCode() {
|
|
||||||
const { data } = await api_query_user_invitation_code().send({});
|
|
||||||
setInviteCode(data?.data.invitationCode || "");
|
|
||||||
}
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
console.log("user token:", Token);
|
|
||||||
|
|
||||||
return () => {};
|
|
||||||
}, [Token]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<PullToRefresh
|
||||||
<PullToRefresh
|
onRefresh={async () => {
|
||||||
onRefresh={async () => {
|
await getHomeData();
|
||||||
await getHomeData();
|
}}
|
||||||
}}
|
renderText={(status) => {
|
||||||
renderText={(status) => {
|
return <div>{statusRecord[status]}</div>;
|
||||||
return <div>{statusRecord[status]}</div>;
|
}}
|
||||||
}}
|
disabled={!Token}
|
||||||
disabled={!Token}
|
>
|
||||||
>
|
<div className={cn(classes.Home, classes.container)}>
|
||||||
<div className={cn(classes.Home, classes.container)}>
|
<div className={classes.userinfo}>
|
||||||
<div className={classes.userinfo}>
|
<div className={classes.userinfo_top}>
|
||||||
<div className={classes.userinfo_top}>
|
<img className={classes.userinfo_top_left} src={logo} alt="" />
|
||||||
<img className={classes.userinfo_top_left} src={logo} alt="" />
|
|
||||||
|
|
||||||
{address ? (
|
{address ? (
|
||||||
<div className={classes.userinfo_top_right}>
|
<div className={classes.userinfo_top_right}>
|
||||||
<div className={classes.userinfo_top_right_wallet}>
|
<div className={classes.userinfo_top_right_wallet}>
|
||||||
<span>{shortenString(address, 6, 4)}</span>
|
<span>{shortenString(address, 6, 4)}</span>
|
||||||
<IconFont
|
<IconFont
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
loginOut();
|
loginOut();
|
||||||
setUserData(undefined);
|
setUserData(undefined);
|
||||||
}}
|
|
||||||
name="tuichu"
|
|
||||||
className={classes.userinfo_top_right_wallet_disconnect}
|
|
||||||
color={"#fff"}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className={classes.userinfo_top_right_btns}>
|
|
||||||
{userData && (
|
|
||||||
<>
|
|
||||||
<div className={classes.userinfo_top_right_btns_item}>
|
|
||||||
<span>{getLevelName(userData.level)}</span>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<div
|
|
||||||
className={classes.userinfo_top_right_connect}
|
|
||||||
onClick={() => {
|
|
||||||
open();
|
|
||||||
}}
|
}}
|
||||||
>
|
name="tuichu"
|
||||||
<span>{t("链接钱包")}</span>
|
className={classes.userinfo_top_right_wallet_disconnect}
|
||||||
</div>
|
color={"#000000"}
|
||||||
</>
|
/>
|
||||||
)}
|
</div>
|
||||||
</div>
|
<div className={classes.userinfo_top_right_btns}>
|
||||||
<ul className={classes.userinfo_data}>
|
{userData && (
|
||||||
<li>
|
|
||||||
<span className={classes.userinfo_data_num}>
|
|
||||||
{userData?.directPushNode || 0}
|
|
||||||
</span>
|
|
||||||
<span className={classes.userinfo_data_des}>
|
|
||||||
{t("Direct Node")}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<span className={classes.userinfo_data_num}>
|
|
||||||
{userData?.teamNode || 0}
|
|
||||||
</span>
|
|
||||||
<span className={classes.userinfo_data_des}>
|
|
||||||
{t("Team Node")}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<span className={classes.userinfo_data_num}>
|
|
||||||
{userData?.revenueUsdt || 0}
|
|
||||||
<p>USDT</p>
|
|
||||||
</span>
|
|
||||||
<span className={classes.userinfo_data_des}>
|
|
||||||
{t("Push income")}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className={classes.nftToken}>
|
|
||||||
<ul className={classes.nftToken_tab}>
|
|
||||||
<li
|
|
||||||
className={tabIndex == 0 ? classes.nftToken_tab_active : ""}
|
|
||||||
onClick={() => setTabIndex(0)}
|
|
||||||
>
|
|
||||||
NODE
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div className={classes.nftToken_content}>
|
|
||||||
{tabIndex == 0 && (
|
|
||||||
<>
|
|
||||||
{address ? (
|
|
||||||
<>
|
<>
|
||||||
{userData?.nodeNumber && userData?.nodeNumber > 0 ? (
|
<div className={classes.userinfo_top_right_btns_item}>
|
||||||
<div className={classes.nftToken_content_nft}>
|
<span>{getLevelName(userData.level)}</span>
|
||||||
<div className={classes.nftToken_content_nft_top}>
|
</div>
|
||||||
<span>You own {userData.nodeNumber} nodes</span>
|
</>
|
||||||
<span
|
)}
|
||||||
onClick={() => {
|
</div>
|
||||||
navigate("/mint");
|
</div>
|
||||||
}}
|
) : (
|
||||||
>
|
<>
|
||||||
{t("Buy Node")}
|
<div
|
||||||
<IconFont
|
className={classes.userinfo_top_right_connect}
|
||||||
name="chevronsrightshuangyoujiantou"
|
onClick={() => {
|
||||||
color={"#2DFCFC"}
|
open();
|
||||||
/>
|
}}
|
||||||
</span>
|
>
|
||||||
</div>
|
<span>{t("链接钱包")}</span>
|
||||||
<img
|
</div>
|
||||||
className={classes.nftToken_content_nft_img}
|
</>
|
||||||
src={nftBg}
|
)}
|
||||||
alt=""
|
</div>
|
||||||
/>
|
<ul className={classes.userinfo_data}>
|
||||||
<span className={classes.nftToken_content_nft_des}>
|
<li>
|
||||||
{t("Start mining after node subscription ends.")}
|
<span className={classes.userinfo_data_num}>
|
||||||
</span>
|
{userData?.directPushNode || 0}
|
||||||
</div>
|
</span>
|
||||||
) : (
|
<span className={classes.userinfo_data_des}>
|
||||||
<div className={classes.nftToken_content_nft_mint}>
|
{t("Direct Node")}
|
||||||
<div
|
</span>
|
||||||
className={classes.nftToken_content_nft_mint_btn}
|
</li>
|
||||||
|
<li>
|
||||||
|
<span className={classes.userinfo_data_num}>
|
||||||
|
{userData?.teamNode || 0}
|
||||||
|
</span>
|
||||||
|
<span className={classes.userinfo_data_des}>
|
||||||
|
{t("Team Node")}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span className={classes.userinfo_data_num}>
|
||||||
|
{userData?.revenueUsdt || 0}
|
||||||
|
<p>USDT</p>
|
||||||
|
</span>
|
||||||
|
<span className={classes.userinfo_data_des}>
|
||||||
|
{t("Push income")}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={classes.nftToken}>
|
||||||
|
<ul className={classes.nftToken_tab}>
|
||||||
|
<li
|
||||||
|
className={tabIndex == 0 ? classes.nftToken_tab_active : ""}
|
||||||
|
onClick={() => setTabIndex(0)}
|
||||||
|
>
|
||||||
|
NODE
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div className={classes.nftToken_content}>
|
||||||
|
{tabIndex == 0 && (
|
||||||
|
<>
|
||||||
|
{address ? (
|
||||||
|
<>
|
||||||
|
{userData?.nodeNumber && userData?.nodeNumber > 0 ? (
|
||||||
|
<div className={classes.nftToken_content_nft}>
|
||||||
|
<div className={classes.nftToken_content_nft_top}>
|
||||||
|
<span>You own {userData.nodeNumber} nodes</span>
|
||||||
|
<span
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigate("/mint");
|
navigate("/mint");
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span>{t("Buy Node")}</span>
|
{t("Buy Node")}
|
||||||
<IconFont
|
<IconFont
|
||||||
className={
|
|
||||||
classes.nftToken_content_nft_mint_btn_icon
|
|
||||||
}
|
|
||||||
name="chevronsrightshuangyoujiantou"
|
name="chevronsrightshuangyoujiantou"
|
||||||
color={"#101010"}
|
color={"#EA6D28"}
|
||||||
/>
|
/>
|
||||||
</div>
|
</span>
|
||||||
<span>{t("Buy Edge AI Node.")}</span>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
<img
|
||||||
</>
|
className={classes.nftToken_content_nft_img}
|
||||||
) : (
|
src={nftBg}
|
||||||
<>
|
alt=""
|
||||||
<div className={classes.nftToken_content_userDisconnect}>
|
/>
|
||||||
<span>
|
<span className={classes.nftToken_content_nft_des}>
|
||||||
{t(
|
{t("Start mining after node subscription ends.")}
|
||||||
"The wallet is not linked and cannot show you the Node."
|
|
||||||
)}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className={classes.invite}>
|
|
||||||
<div className={classes.invite_top}>
|
|
||||||
<span>{t("邀请")}</span>
|
|
||||||
{address && (
|
|
||||||
<span
|
|
||||||
onClick={() => {
|
|
||||||
navigate("/invitationlist");
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{t("邀请列表")}{" "}
|
|
||||||
<IconFont
|
|
||||||
name="chevronsrightshuangyoujiantou"
|
|
||||||
color={"#2DFCFC"}
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className={classes.invite_content}>
|
|
||||||
<span>{t("邀请链接")}</span>
|
|
||||||
<div className={classes.invite_content_link}>
|
|
||||||
{address ? (
|
|
||||||
<>
|
|
||||||
{userData?.nodeNumber && userData?.nodeNumber > 0 ? (
|
|
||||||
<>
|
|
||||||
<span>{shortenString(userInviteLink, 15, 15)}</span>
|
|
||||||
<IconFont
|
|
||||||
onClick={() => {
|
|
||||||
copyText(userInviteLink);
|
|
||||||
}}
|
|
||||||
className={classes.invite_content_icon}
|
|
||||||
name="fuzhi"
|
|
||||||
color={"#fff"}
|
|
||||||
/>{" "}
|
|
||||||
</>
|
|
||||||
) : (
|
) : (
|
||||||
<>
|
<div className={classes.nftToken_content_nft_mint}>
|
||||||
<span>
|
<div
|
||||||
{t("Buy Edge AI Node to get invitation link")}
|
className={classes.nftToken_content_nft_mint_btn}
|
||||||
</span>
|
onClick={() => {
|
||||||
</>
|
navigate("/mint");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<span>{t("Buy Node")}</span>
|
||||||
|
<IconFont
|
||||||
|
className={
|
||||||
|
classes.nftToken_content_nft_mint_btn_icon
|
||||||
|
}
|
||||||
|
name="chevronsrightshuangyoujiantou"
|
||||||
|
color={"#101010"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<span>{t("Buy Edge AI Node.")}</span>
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span>{t("Link wallet to get invitation link")}</span>
|
<div className={classes.nftToken_content_userDisconnect}>
|
||||||
|
<span>
|
||||||
|
{t(
|
||||||
|
"The wallet is not linked and cannot show you the Node."
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</>
|
||||||
|
)}
|
||||||
<span>
|
|
||||||
{t(
|
|
||||||
"Invite your friends to become YOTTA nodes and you will get a 20% rebate."
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</PullToRefresh>
|
|
||||||
</>
|
<div className={classes.invite}>
|
||||||
|
<div className={classes.invite_top}>
|
||||||
|
<span>{t("邀请")}</span>
|
||||||
|
{address && (
|
||||||
|
<span
|
||||||
|
onClick={() => {
|
||||||
|
navigate("/invitationlist");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{t("邀请列表")}{" "}
|
||||||
|
<IconFont
|
||||||
|
name="chevronsrightshuangyoujiantou"
|
||||||
|
color={"#EA6D28"}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={classes.invite_content}>
|
||||||
|
<span>{t("邀请链接")}</span>
|
||||||
|
<div className={classes.invite_content_link}>
|
||||||
|
{address ? (
|
||||||
|
<>
|
||||||
|
{userData?.nodeNumber && userData?.nodeNumber > 0 ? (
|
||||||
|
<>
|
||||||
|
<span>{shortenString(userInviteLink, 15, 15)}</span>
|
||||||
|
<IconFont
|
||||||
|
onClick={() => {
|
||||||
|
copyText(userInviteLink);
|
||||||
|
}}
|
||||||
|
className={classes.invite_content_icon}
|
||||||
|
name="fuzhi"
|
||||||
|
color={"#101010"}
|
||||||
|
/>{" "}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<span>
|
||||||
|
{t("Buy Edge AI Node to get invitation link")}
|
||||||
|
</span>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<span>{t("Link wallet to get invitation link")}</span>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span>
|
||||||
|
{t(
|
||||||
|
"Invite your friends to become YOTTA nodes and you will get a 10% rebate."
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</PullToRefresh>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Desktop() {
|
||||||
|
const {
|
||||||
|
getHomeData,
|
||||||
|
statusRecord,
|
||||||
|
Token,
|
||||||
|
address,
|
||||||
|
setUserData,
|
||||||
|
userData,
|
||||||
|
tabIndex,
|
||||||
|
t,
|
||||||
|
setTabIndex,
|
||||||
|
navigate,
|
||||||
|
userInviteLink,
|
||||||
|
} = useHome();
|
||||||
|
const {
|
||||||
|
nodeConfig,
|
||||||
|
num,
|
||||||
|
setNum,
|
||||||
|
approveUsdt,
|
||||||
|
balance,
|
||||||
|
approveLoadingToast,
|
||||||
|
costNum,
|
||||||
|
setApproveUsdt,
|
||||||
|
buyLoadingToast,
|
||||||
|
orderInfo,
|
||||||
|
updateNodeConfig,
|
||||||
|
startPollingCheckBuyStatus,
|
||||||
|
} = useMint();
|
||||||
|
const { columns, list, loadMore, hasMore } = useInvitationList();
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
Mobile,
|
||||||
|
Desktop,
|
||||||
|
};
|
||||||
|
|
|
@ -4,40 +4,12 @@
|
||||||
* @LastEditTime: 2024-06-27 15:33:01
|
* @LastEditTime: 2024-06-27 15:33:01
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import usePagination from "@/hook/usePagination";
|
|
||||||
import { api_recommended_list } from "@/server/api";
|
|
||||||
import { RecommendedListItem } from "@/server/module";
|
|
||||||
import { Empty, InfiniteScroll } from "antd-mobile";
|
import { Empty, InfiniteScroll } from "antd-mobile";
|
||||||
import DataTable, { TableColumn } from "react-data-table-component";
|
import DataTable from "react-data-table-component";
|
||||||
import { useTranslation } from "react-i18next";
|
import useInvitationList from "./Feature/useInvitationList";
|
||||||
|
|
||||||
export default function () {
|
export default function () {
|
||||||
const { t } = useTranslation();
|
const { columns, list, loadMore, hasMore } = useInvitationList();
|
||||||
const columns: TableColumn<RecommendedListItem>[] = [
|
|
||||||
{
|
|
||||||
name: t("地址"),
|
|
||||||
selector: (row) => row.walletAddress,
|
|
||||||
grow: 9,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Node",
|
|
||||||
selector: (row) => row.nodeNumber,
|
|
||||||
grow: 1,
|
|
||||||
// @ts-ignore
|
|
||||||
right: "true",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const { list, hasMore, loadMore } = usePagination<RecommendedListItem>({
|
|
||||||
service({ pageNum, pageSize }) {
|
|
||||||
return new Promise(async (reslove) => {
|
|
||||||
const { data } = await api_recommended_list().send({
|
|
||||||
queryParams: { pageNum, pageSize },
|
|
||||||
});
|
|
||||||
reslove(data?.data.records || []);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
height: 190px;
|
height: 190px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
background: #171719;
|
background: #ffffff;
|
||||||
box-shadow: 0px 3px 6px 0px rgba(0, 0, 0, 0.16),
|
box-shadow: 0px 3px 6px 0px rgba(0, 0, 0, 0.16),
|
||||||
0px 3px 6px 0px rgba(0, 0, 0, 0.23);
|
0px 3px 6px 0px rgba(0, 0, 0, 0.23);
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
@ -95,7 +95,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #9e9e9e;
|
color: #333333;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
@ -215,7 +215,7 @@
|
||||||
padding: 11px 40px;
|
padding: 11px 40px;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
|
|
||||||
background: #2dfcfc;
|
background: #ea6d28;
|
||||||
|
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
|
|
|
@ -1,110 +1,36 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-18 15:28:03
|
* @Date: 2024-06-18 15:28:03
|
||||||
* @LastEditTime: 2024-06-27 17:17:09
|
* @LastEditTime: 2024-06-28 14:33:02
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import { cn, filterAddressBeforeZero, filterAmountBeforeZero } from "@/utils";
|
import { cn, filterAddressBeforeZero, filterAmountBeforeZero } from "@/utils";
|
||||||
import classes from "./Mint.module.css";
|
import classes from "./Mint-m.module.css";
|
||||||
import nft_bg from "@/assets/nft_bg.svg";
|
import nft_bg from "@/assets/nft_bg.svg";
|
||||||
import Button from "antd-mobile/es/components/button";
|
import Button from "antd-mobile/es/components/button";
|
||||||
import Space from "antd-mobile/es/components/space";
|
import Space from "antd-mobile/es/components/space";
|
||||||
import { useTranslation } from "react-i18next";
|
import { api_node_order } from "@/server/api";
|
||||||
import { useEffect, useMemo, useRef, useState } from "react";
|
import { authorizedU, getApproveUsdt, payByContract } from "@/contract/utils";
|
||||||
import {
|
import { Stepper, Toast } from "antd-mobile";
|
||||||
api_get_homepage_user_data,
|
|
||||||
api_get_nft_configuration_data,
|
|
||||||
api_node_order,
|
|
||||||
api_users_cancel_orders,
|
|
||||||
} from "@/server/api";
|
|
||||||
import {
|
|
||||||
NftConfigurationData,
|
|
||||||
NftOrder,
|
|
||||||
NodeOrder,
|
|
||||||
UserHomeData,
|
|
||||||
} from "@/server/module";
|
|
||||||
import {
|
|
||||||
authorizedU,
|
|
||||||
getApproveUsdt,
|
|
||||||
getBalance,
|
|
||||||
payByContract,
|
|
||||||
} from "@/contract/utils";
|
|
||||||
import { Dialog, Modal, Stepper, Toast } from "antd-mobile";
|
|
||||||
import useUserStore from "@/store/User";
|
|
||||||
import usePollingCheckBuyStatus from "@/hook/usePollingCheckBuyStatus";
|
|
||||||
import { ToastHandler } from "antd-mobile/es/components/toast";
|
|
||||||
import { BaseError } from "wagmi";
|
import { BaseError } from "wagmi";
|
||||||
import { useNavigate } from "react-router-dom";
|
|
||||||
import { toWei } from "web3-utils";
|
import { toWei } from "web3-utils";
|
||||||
|
import useMint from "./Feature/useMint";
|
||||||
export default function () {
|
export default function () {
|
||||||
const { t } = useTranslation();
|
|
||||||
const { Token } = useUserStore();
|
|
||||||
const [nodeConfig, setNodeConfig] = useState<UserHomeData>();
|
|
||||||
const [approveUsdt, setApproveUsdt] = useState<bigint>(0n);
|
|
||||||
const [balance, setBalance] = useState<bigint>(0n);
|
|
||||||
const orderInfo = useRef<NodeOrder>();
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const [num, setNum] = useState(1);
|
|
||||||
|
|
||||||
const buyLoadingToast = useRef<ToastHandler>();
|
|
||||||
const approveLoadingToast = useRef<ToastHandler>();
|
|
||||||
const {
|
const {
|
||||||
transcationStatus,
|
nodeConfig,
|
||||||
|
num,
|
||||||
|
setNum,
|
||||||
|
approveUsdt,
|
||||||
|
t,
|
||||||
|
balance,
|
||||||
|
approveLoadingToast,
|
||||||
|
costNum,
|
||||||
|
setApproveUsdt,
|
||||||
|
buyLoadingToast,
|
||||||
|
orderInfo,
|
||||||
|
updateNodeConfig,
|
||||||
startPollingCheckBuyStatus,
|
startPollingCheckBuyStatus,
|
||||||
stopPollingCheckBuyStatus,
|
} = useMint();
|
||||||
} = usePollingCheckBuyStatus("NORMAL");
|
|
||||||
|
|
||||||
const costNum = useMemo(
|
|
||||||
() =>
|
|
||||||
BigInt(
|
|
||||||
toWei(`${parseFloat(`${nodeConfig?.nodePrice || "0"}`) * num}`, "ether")
|
|
||||||
),
|
|
||||||
[nodeConfig?.nodePrice, num]
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
updateNodeConfig();
|
|
||||||
|
|
||||||
return () => {};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
(async () => {
|
|
||||||
Toast.show({ icon: "loading", content: t("正在获取已授权金额") });
|
|
||||||
setBalance(await getBalance());
|
|
||||||
setApproveUsdt(await getApproveUsdt());
|
|
||||||
Toast.clear();
|
|
||||||
})();
|
|
||||||
|
|
||||||
return () => {};
|
|
||||||
}, [Token]);
|
|
||||||
|
|
||||||
async function updateNodeConfig() {
|
|
||||||
const { data } = await api_get_homepage_user_data().send({});
|
|
||||||
setNodeConfig(data?.data);
|
|
||||||
}
|
|
||||||
useEffect(() => {
|
|
||||||
if (transcationStatus == "success") {
|
|
||||||
buyLoadingToast.current?.close();
|
|
||||||
stopPollingCheckBuyStatus();
|
|
||||||
Dialog.alert({
|
|
||||||
content: `${t(
|
|
||||||
"Buy successful. Please return to the homepage to view."
|
|
||||||
)}`,
|
|
||||||
confirmText: "OK",
|
|
||||||
onConfirm() {
|
|
||||||
navigate("/");
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return () => {};
|
|
||||||
}, [transcationStatus]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
return () => {};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className={cn(classes.Mint, classes.container)}>
|
<div className={cn(classes.Mint, classes.container)}>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-18 10:28:21
|
* @Date: 2024-06-18 10:28:21
|
||||||
* @LastEditTime: 2024-06-27 09:52:45
|
* @LastEditTime: 2024-07-01 11:55:38
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import { GET, POST } from "./client";
|
import { GET, POST } from "./client";
|
||||||
|
@ -54,7 +54,7 @@ export function api_signUp() {
|
||||||
chainType: 2;
|
chainType: 2;
|
||||||
},
|
},
|
||||||
any
|
any
|
||||||
>({ url: "/api/account/signUp", requiresToken: false });
|
>({ url: "/api/account/signUp", requiresToken: false, catchErr: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取钱包签名串
|
// 获取钱包签名串
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-18 10:09:21
|
* @Date: 2024-06-18 10:09:21
|
||||||
* @LastEditTime: 2024-06-21 14:47:26
|
* @LastEditTime: 2024-07-01 11:38:43
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import { Client } from "@hyper-fetch/core";
|
import { Client } from "@hyper-fetch/core";
|
||||||
|
@ -17,9 +17,11 @@ import i18next from "i18next";
|
||||||
function initClient({
|
function initClient({
|
||||||
requiresToken,
|
requiresToken,
|
||||||
requiresAddress,
|
requiresAddress,
|
||||||
|
catchErr,
|
||||||
}: {
|
}: {
|
||||||
requiresToken: boolean;
|
requiresToken: boolean;
|
||||||
requiresAddress: boolean;
|
requiresAddress: boolean;
|
||||||
|
catchErr: boolean;
|
||||||
}) {
|
}) {
|
||||||
return new Client({ url: import.meta.env.VITE_BASE_API_URL })
|
return new Client({ url: import.meta.env.VITE_BASE_API_URL })
|
||||||
.onAuth(async (req) => {
|
.onAuth(async (req) => {
|
||||||
|
@ -59,6 +61,7 @@ function initClient({
|
||||||
const resData: BASE_RESPONSE = res.data;
|
const resData: BASE_RESPONSE = res.data;
|
||||||
if (resData.code !== 200 && resData.code !== 0) {
|
if (resData.code !== 200 && resData.code !== 0) {
|
||||||
if (resData.msg) Toast.show({ content: resData.msg, icon: "fail" });
|
if (resData.msg) Toast.show({ content: resData.msg, icon: "fail" });
|
||||||
|
if (catchErr) return res;
|
||||||
throw new Error(resData.msg || "client on response error");
|
throw new Error(resData.msg || "client on response error");
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
@ -69,12 +72,14 @@ export const POST = <P = any, R = any, QueryParams = any>({
|
||||||
url,
|
url,
|
||||||
requiresToken = true,
|
requiresToken = true,
|
||||||
requiresAddress = true,
|
requiresAddress = true,
|
||||||
|
catchErr = false,
|
||||||
}: {
|
}: {
|
||||||
url: string;
|
url: string;
|
||||||
requiresToken?: boolean;
|
requiresToken?: boolean;
|
||||||
requiresAddress?: boolean;
|
requiresAddress?: boolean;
|
||||||
|
catchErr?: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
return initClient({ requiresToken, requiresAddress }).createRequest<
|
return initClient({ requiresToken, requiresAddress, catchErr }).createRequest<
|
||||||
BASE_RESPONSE<R>,
|
BASE_RESPONSE<R>,
|
||||||
P,
|
P,
|
||||||
any,
|
any,
|
||||||
|
@ -89,12 +94,14 @@ export const GET = <P = any, R = any>({
|
||||||
url,
|
url,
|
||||||
requiresToken = true,
|
requiresToken = true,
|
||||||
requiresAddress = true,
|
requiresAddress = true,
|
||||||
|
catchErr = false,
|
||||||
}: {
|
}: {
|
||||||
url: string;
|
url: string;
|
||||||
requiresToken?: boolean;
|
requiresToken?: boolean;
|
||||||
requiresAddress?: boolean;
|
requiresAddress?: boolean;
|
||||||
|
catchErr?: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
return initClient({ requiresToken, requiresAddress }).createRequest<
|
return initClient({ requiresToken, requiresAddress, catchErr }).createRequest<
|
||||||
BASE_RESPONSE<R>,
|
BASE_RESPONSE<R>,
|
||||||
any,
|
any,
|
||||||
any,
|
any,
|
||||||
|
|
|
@ -1,14 +1,350 @@
|
||||||
.adm-tabs {
|
@media only screen and (max-width: 1024px) {
|
||||||
.adm-tabs-header {
|
.adm-tabs {
|
||||||
border-bottom: 0.25px solid #333333;
|
.adm-tabs-header {
|
||||||
|
border-bottom: 0.25px solid #333333;
|
||||||
|
|
||||||
.adm-tabs-tab-line {
|
.adm-tabs-tab-line {
|
||||||
background-color: #2dfcfc;
|
background-color: #ea6d28;
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-tabs-tab {
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: normal;
|
||||||
|
letter-spacing: 0em;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
font-feature-settings: "kern" on;
|
||||||
|
color: #666666;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
&.adm-tabs-tab-active {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.adm-tabs-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.adm-tabs-tab {
|
.adm-capsule-tabs {
|
||||||
|
.adm-capsule-tabs-header {
|
||||||
|
padding: 0px 15px;
|
||||||
|
border-bottom: none;
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
.adm-scroll-mask {
|
||||||
|
opacity: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-capsule-tabs-tab-list {
|
||||||
|
gap: 8px;
|
||||||
|
.adm-capsule-tabs-tab-wrapper {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.adm-capsule-tabs-tab {
|
||||||
|
/* 自动布局子元素 */
|
||||||
|
height: 25px;
|
||||||
|
border-radius: 8px;
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #ea6d28;
|
||||||
|
|
||||||
|
z-index: 1;
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
/* 自动布局子元素 */
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 25px;
|
||||||
|
letter-spacing: 0em;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
font-feature-settings: "kern" on;
|
||||||
|
color: #ffffff;
|
||||||
|
|
||||||
|
z-index: 0;
|
||||||
|
|
||||||
|
padding: 0 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-capsule-tabs-tab-active {
|
||||||
|
/* 自动布局子元素 */
|
||||||
|
height: 25px;
|
||||||
|
border-radius: 8px;
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
background: #ea6d28;
|
||||||
|
|
||||||
|
z-index: 0;
|
||||||
|
|
||||||
|
/* 自动布局子元素 */
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 25px;
|
||||||
|
letter-spacing: 0em;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
font-feature-settings: "kern" on;
|
||||||
|
color: #ffffff;
|
||||||
|
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* picker */
|
||||||
|
.adm-picker-popup {
|
||||||
|
.adm-picker-header {
|
||||||
|
border-bottom: 1px solid #404040;
|
||||||
|
.adm-picker-header-title {
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 17px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
font-feature-settings: "kern" on;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.adm-picker-header-button {
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 17px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
font-feature-settings: "kern" on;
|
||||||
|
color: #1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.adm-popup-body {
|
||||||
|
background-color: #000000;
|
||||||
|
.adm-picker {
|
||||||
|
/* height: 280px; */
|
||||||
|
.adm-picker-body {
|
||||||
|
.adm-picker-view {
|
||||||
|
background-color: #000000;
|
||||||
|
.adm-picker-view-column {
|
||||||
|
.adm-picker-view-column-wheel {
|
||||||
|
.adm-picker-view-column-item {
|
||||||
|
/* height: 34px; */
|
||||||
|
.adm-picker-view-column-item-label {
|
||||||
|
/* font-family: Space Grotesk;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 34px;
|
||||||
|
text-align: center;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto; */
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.adm-picker-view-mask {
|
||||||
|
.adm-picker-view-mask-top,
|
||||||
|
.adm-picker-view-mask-bottom {
|
||||||
|
background-color: #000000;
|
||||||
|
}
|
||||||
|
.adm-picker-view-mask-middle {
|
||||||
|
/* height: 34px; */
|
||||||
|
border-top: 1px solid #404040;
|
||||||
|
border-bottom: 1px solid #404040;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* toast */
|
||||||
|
.adm-toast-main {
|
||||||
|
min-width: 170px !important;
|
||||||
|
min-height: 40px !important;
|
||||||
|
max-width: 320px !important;
|
||||||
|
max-height: max-content !important;
|
||||||
|
border-radius: 10px !important;
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
/* 自动布局 */
|
||||||
|
padding: 11px 20px !important;
|
||||||
|
|
||||||
|
/* background: rgba(252, 135, 43, 0.5) !important; */
|
||||||
|
|
||||||
|
box-sizing: border-box !important;
|
||||||
|
border: 1px solid #ea6d28 !important;
|
||||||
|
|
||||||
|
/* backdrop-filter: blur(10px); */
|
||||||
|
|
||||||
|
.adm-auto-center-content {
|
||||||
|
/* 自动布局子元素 */
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: normal;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
color: #ffffff;
|
||||||
|
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-popover-menu {
|
||||||
|
.adm-popover-arrow {
|
||||||
|
color: rgba(42, 42, 42, 0.6) !important;
|
||||||
|
}
|
||||||
|
.adm-popover-inner {
|
||||||
|
background: rgba(42, 42, 42, 0.6);
|
||||||
|
|
||||||
|
box-sizing: border-box;
|
||||||
|
border-image: radial-gradient(
|
||||||
|
103% 103% at 50% 50%,
|
||||||
|
#a41914 0%,
|
||||||
|
rgba(164, 25, 20, 0) 100%
|
||||||
|
);
|
||||||
|
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
|
||||||
|
.adm-popover-menu-item {
|
||||||
|
padding: 0 10px;
|
||||||
|
background-color: transparent !important;
|
||||||
|
&::after {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-popover-menu-item-text {
|
||||||
|
/* 自动布局子元素 */
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: normal;
|
||||||
|
text-transform: capitalize;
|
||||||
|
letter-spacing: 0em;
|
||||||
|
|
||||||
|
color: #ffffff;
|
||||||
|
|
||||||
|
z-index: 0;
|
||||||
|
padding: 10px 0;
|
||||||
|
border-top: 1px solid #3d3d3d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adm-stepper */
|
||||||
|
.adm-stepper {
|
||||||
|
width: calc(100%) !important;
|
||||||
|
height: 42px;
|
||||||
|
border-radius: 5px !important;
|
||||||
|
opacity: 1;
|
||||||
|
background: rgba(204, 184, 214, 0.2);
|
||||||
|
box-sizing: border-box !important;
|
||||||
|
border: 1px solid #ea6d28 !important;
|
||||||
|
.adm-button {
|
||||||
|
width: 42px;
|
||||||
|
height: 42px;
|
||||||
|
border-radius: 5px;
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
background: #ea6d28;
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 23px;
|
||||||
|
height: 23px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-stepper-middle {
|
||||||
|
.adm-stepper-input {
|
||||||
|
height: 44px;
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
.adm-input-element {
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: normal;
|
||||||
|
letter-spacing: 0em;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
font-feature-settings: "kern" on;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-dialog {
|
||||||
|
.adm-center-popup-body {
|
||||||
|
box-sizing: border-box !important;
|
||||||
|
border: 1px solid #ea6d28 !important;
|
||||||
|
border-radius: 10px !important;
|
||||||
|
background-color: transparent !important;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
.adm-dialog-content {
|
||||||
|
.adm-auto-center-content {
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
font-family: Space Grotesk;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: normal;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
|
||||||
|
font-variation-settings: "opsz" auto;
|
||||||
|
color: #ffffff;
|
||||||
|
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.adm-dialog-footer {
|
||||||
|
.adm-dialog-action-row {
|
||||||
|
border-top: 1px solid #ea6d28 !important;
|
||||||
|
|
||||||
|
.adm-dialog-button {
|
||||||
|
span {
|
||||||
|
color: #ea6d28;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adm-pull-to-refresh */
|
||||||
|
.adm-pull-to-refresh {
|
||||||
|
.adm-pull-to-refresh-head-content {
|
||||||
|
/* 自动布局子元素 */
|
||||||
font-family: Space Grotesk;
|
font-family: Space Grotesk;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
@ -17,343 +353,9 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #666666;
|
color: #9e9e9e;
|
||||||
padding-bottom: 4px;
|
|
||||||
&.adm-tabs-tab-active {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.adm-tabs-content {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-capsule-tabs {
|
z-index: 0;
|
||||||
.adm-capsule-tabs-header {
|
|
||||||
padding: 0px 15px;
|
|
||||||
border-bottom: none;
|
|
||||||
margin-top: 20px;
|
|
||||||
|
|
||||||
.adm-scroll-mask {
|
|
||||||
opacity: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-capsule-tabs-tab-list {
|
|
||||||
gap: 8px;
|
|
||||||
.adm-capsule-tabs-tab-wrapper {
|
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
.adm-capsule-tabs-tab {
|
|
||||||
/* 自动布局子元素 */
|
|
||||||
height: 25px;
|
|
||||||
border-radius: 8px;
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
box-sizing: border-box;
|
|
||||||
border: 1px solid #2dfcfc;
|
|
||||||
|
|
||||||
z-index: 1;
|
|
||||||
background-color: transparent;
|
|
||||||
|
|
||||||
/* 自动布局子元素 */
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 10px;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: 25px;
|
|
||||||
letter-spacing: 0em;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
font-feature-settings: "kern" on;
|
|
||||||
color: #ffffff;
|
|
||||||
|
|
||||||
z-index: 0;
|
|
||||||
|
|
||||||
padding: 0 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-capsule-tabs-tab-active {
|
|
||||||
/* 自动布局子元素 */
|
|
||||||
height: 25px;
|
|
||||||
border-radius: 8px;
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
background: #2dfcfc;
|
|
||||||
|
|
||||||
z-index: 0;
|
|
||||||
|
|
||||||
/* 自动布局子元素 */
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 10px;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: 25px;
|
|
||||||
letter-spacing: 0em;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
font-feature-settings: "kern" on;
|
|
||||||
color: #ffffff;
|
|
||||||
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* picker */
|
|
||||||
.adm-picker-popup {
|
|
||||||
.adm-picker-header {
|
|
||||||
border-bottom: 1px solid #404040;
|
|
||||||
.adm-picker-header-title {
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 17px;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 24px;
|
|
||||||
letter-spacing: 0px;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
font-feature-settings: "kern" on;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
.adm-picker-header-button {
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 17px;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: 24px;
|
|
||||||
letter-spacing: 0px;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
font-feature-settings: "kern" on;
|
|
||||||
color: #1890ff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.adm-popup-body {
|
|
||||||
background-color: #000000;
|
|
||||||
.adm-picker {
|
|
||||||
/* height: 280px; */
|
|
||||||
.adm-picker-body {
|
|
||||||
.adm-picker-view {
|
|
||||||
background-color: #000000;
|
|
||||||
.adm-picker-view-column {
|
|
||||||
.adm-picker-view-column-wheel {
|
|
||||||
.adm-picker-view-column-item {
|
|
||||||
/* height: 34px; */
|
|
||||||
.adm-picker-view-column-item-label {
|
|
||||||
/* font-family: Space Grotesk;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: 34px;
|
|
||||||
text-align: center;
|
|
||||||
letter-spacing: 0px;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto; */
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.adm-picker-view-mask {
|
|
||||||
.adm-picker-view-mask-top,
|
|
||||||
.adm-picker-view-mask-bottom {
|
|
||||||
background-color: #000000;
|
|
||||||
}
|
|
||||||
.adm-picker-view-mask-middle {
|
|
||||||
/* height: 34px; */
|
|
||||||
border-top: 1px solid #404040;
|
|
||||||
border-bottom: 1px solid #404040;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* toast */
|
|
||||||
.adm-toast-main {
|
|
||||||
min-width: 170px !important;
|
|
||||||
min-height: 40px !important;
|
|
||||||
max-width: 320px !important;
|
|
||||||
max-height: max-content !important;
|
|
||||||
border-radius: 10px !important;
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
/* 自动布局 */
|
|
||||||
padding: 11px 20px !important;
|
|
||||||
|
|
||||||
/* background: rgba(252, 135, 43, 0.5) !important; */
|
|
||||||
|
|
||||||
box-sizing: border-box !important;
|
|
||||||
border: 1px solid #2dfcfc !important;
|
|
||||||
|
|
||||||
/* backdrop-filter: blur(10px); */
|
|
||||||
|
|
||||||
.adm-auto-center-content {
|
|
||||||
/* 自动布局子元素 */
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: normal;
|
|
||||||
letter-spacing: 0px;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
color: #ffffff;
|
|
||||||
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-popover-menu {
|
|
||||||
.adm-popover-arrow {
|
|
||||||
color: rgba(42, 42, 42, 0.6) !important;
|
|
||||||
}
|
|
||||||
.adm-popover-inner {
|
|
||||||
background: rgba(42, 42, 42, 0.6);
|
|
||||||
|
|
||||||
box-sizing: border-box;
|
|
||||||
border-image: radial-gradient(
|
|
||||||
103% 103% at 50% 50%,
|
|
||||||
#a41914 0%,
|
|
||||||
rgba(164, 25, 20, 0) 100%
|
|
||||||
);
|
|
||||||
|
|
||||||
backdrop-filter: blur(10px);
|
|
||||||
|
|
||||||
.adm-popover-menu-item {
|
|
||||||
padding: 0 10px;
|
|
||||||
background-color: transparent !important;
|
|
||||||
&::after {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-popover-menu-item-text {
|
|
||||||
/* 自动布局子元素 */
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: normal;
|
|
||||||
text-transform: capitalize;
|
|
||||||
letter-spacing: 0em;
|
|
||||||
|
|
||||||
color: #ffffff;
|
|
||||||
|
|
||||||
z-index: 0;
|
|
||||||
padding: 10px 0;
|
|
||||||
border-top: 1px solid #3d3d3d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* adm-stepper */
|
|
||||||
.adm-stepper {
|
|
||||||
width: calc(100%) !important;
|
|
||||||
height: 42px;
|
|
||||||
border-radius: 5px !important;
|
|
||||||
opacity: 1;
|
|
||||||
background: rgba(37, 33, 39, 0.2);
|
|
||||||
box-sizing: border-box !important;
|
|
||||||
border: 1px solid #2dfcfc !important;
|
|
||||||
.adm-button {
|
|
||||||
width: 42px;
|
|
||||||
height: 42px;
|
|
||||||
border-radius: 5px;
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
background: #2dfcfc;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
width: 23px;
|
|
||||||
height: 23px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-stepper-middle {
|
|
||||||
.adm-stepper-input {
|
|
||||||
height: 44px;
|
|
||||||
background-color: transparent;
|
|
||||||
|
|
||||||
.adm-input-element {
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 22px;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: normal;
|
|
||||||
letter-spacing: 0em;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
font-feature-settings: "kern" on;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-dialog {
|
|
||||||
.adm-center-popup-body {
|
|
||||||
box-sizing: border-box !important;
|
|
||||||
border: 1px solid #2dfcfc !important;
|
|
||||||
border-radius: 10px !important;
|
|
||||||
background-color: transparent !important;
|
|
||||||
backdrop-filter: blur(10px);
|
|
||||||
.adm-dialog-content {
|
|
||||||
.adm-auto-center-content {
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: normal;
|
|
||||||
letter-spacing: 0px;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
color: #ffffff;
|
|
||||||
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.adm-dialog-footer {
|
|
||||||
.adm-dialog-action-row {
|
|
||||||
border-top: 1px solid #2dfcfc !important;
|
|
||||||
|
|
||||||
.adm-dialog-button {
|
|
||||||
span {
|
|
||||||
color: #2dfcfc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* adm-pull-to-refresh */
|
|
||||||
.adm-pull-to-refresh {
|
|
||||||
.adm-pull-to-refresh-head-content {
|
|
||||||
/* 自动布局子元素 */
|
|
||||||
font-family: Space Grotesk;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: normal;
|
|
||||||
letter-spacing: 0em;
|
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
|
||||||
font-feature-settings: "kern" on;
|
|
||||||
color: #9e9e9e;
|
|
||||||
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
height: 16px !important;
|
height: 16px !important;
|
||||||
min-height: 16px !important;
|
min-height: 16px !important;
|
||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
|
border-bottom: none;
|
||||||
|
|
||||||
.rdt_TableCol {
|
.rdt_TableCol {
|
||||||
div {
|
div {
|
||||||
|
@ -24,7 +25,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #eaeaea;
|
color: #333333;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +38,8 @@
|
||||||
height: 18px !important;
|
height: 18px !important;
|
||||||
min-height: 18px !important;
|
min-height: 18px !important;
|
||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
|
border-bottom: none;
|
||||||
|
|
||||||
.rdt_TableCell {
|
.rdt_TableCell {
|
||||||
div {
|
div {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
@ -49,7 +52,7 @@
|
||||||
|
|
||||||
font-variation-settings: "opsz" auto;
|
font-variation-settings: "opsz" auto;
|
||||||
font-feature-settings: "kern" on;
|
font-feature-settings: "kern" on;
|
||||||
color: #ffffff;
|
color: #000000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-17 18:19:27
|
* @Date: 2024-06-17 18:19:27
|
||||||
* @LastEditTime: 2024-06-27 11:40:59
|
* @LastEditTime: 2024-07-01 16:49:14
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import { type ClassValue, clsx } from "clsx";
|
import { type ClassValue, clsx } from "clsx";
|
||||||
|
@ -121,3 +121,14 @@ export function filterAmountBeforeZero(arr: bigint[]) {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getUrlParameterByName(name: string, url?: string) {
|
||||||
|
if (!url) url = window.location.href;
|
||||||
|
name = name.replace(/[\[\]]/g, "\\$&");
|
||||||
|
let regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
|
||||||
|
results = regex.exec(url);
|
||||||
|
if (!results) return null;
|
||||||
|
if (!results[2]) return "";
|
||||||
|
console.log("url params:", results);
|
||||||
|
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
||||||
|
}
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
/*
|
/*
|
||||||
* @LastEditors: John
|
* @LastEditors: John
|
||||||
* @Date: 2024-06-19 15:55:07
|
* @Date: 2024-06-19 15:55:07
|
||||||
* @LastEditTime: 2024-06-27 15:09:45
|
* @LastEditTime: 2024-07-01 16:44:04
|
||||||
* @Author: John
|
* @Author: John
|
||||||
*/
|
*/
|
||||||
import { config } from "@/components/WalletProvider";
|
import { config } from "@/components/WalletProvider";
|
||||||
import {
|
import {
|
||||||
api_binding_invitation_relationship,
|
|
||||||
api_check_account_registration,
|
api_check_account_registration,
|
||||||
api_get_wallet_signature_string,
|
api_get_wallet_signature_string,
|
||||||
api_login,
|
api_login,
|
||||||
api_query_whether_the_user_is_binding_relationship,
|
|
||||||
api_signUp,
|
api_signUp,
|
||||||
} from "@/server/api";
|
} from "@/server/api";
|
||||||
import useUserStore from "@/store/User";
|
import useUserStore from "@/store/User";
|
||||||
|
@ -24,7 +22,7 @@ import {
|
||||||
} from "@wagmi/core";
|
} from "@wagmi/core";
|
||||||
import Toast from "antd-mobile/es/components/toast";
|
import Toast from "antd-mobile/es/components/toast";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { getUrlQueryParam } from ".";
|
import { getUrlParameterByName } from ".";
|
||||||
import { UrlQueryParamsKey } from "@/constants";
|
import { UrlQueryParamsKey } from "@/constants";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,7 +128,8 @@ export async function signAndLogin(address?: `0x${string}`): Promise<void> {
|
||||||
loadingToast.close();
|
loadingToast.close();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const inviteCode = getUrlQueryParam(UrlQueryParamsKey.INVITE_CODE);
|
const inviteCode = getUrlParameterByName(UrlQueryParamsKey.INVITE_CODE);
|
||||||
|
console.log("inviteCode:", inviteCode);
|
||||||
if (!inviteCode) {
|
if (!inviteCode) {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
icon: "fail",
|
icon: "fail",
|
||||||
|
@ -139,7 +138,7 @@ export async function signAndLogin(address?: `0x${string}`): Promise<void> {
|
||||||
return loginOut();
|
return loginOut();
|
||||||
}
|
}
|
||||||
// 注册
|
// 注册
|
||||||
await api_signUp().send({
|
const { data } = await api_signUp().send({
|
||||||
data: {
|
data: {
|
||||||
account: address,
|
account: address,
|
||||||
publicKey,
|
publicKey,
|
||||||
|
@ -147,7 +146,11 @@ export async function signAndLogin(address?: `0x${string}`): Promise<void> {
|
||||||
chainType: 2,
|
chainType: 2,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
await signAndLogin(address);
|
if (data?.code == 0) {
|
||||||
|
await signAndLogin(address);
|
||||||
|
} else {
|
||||||
|
return loginOut();
|
||||||
|
}
|
||||||
reslove();
|
reslove();
|
||||||
loadingToast.close();
|
loadingToast.close();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue