Compare commits
15 Commits
v0.9.1
...
hot_fix_0427
| Author | SHA1 | Date | |
|---|---|---|---|
| 06933451c5 | |||
| d17d212c24 | |||
| 51a2accd9f | |||
| 96ea7481bc | |||
| de9c45a944 | |||
| 9e885d8b2f | |||
| 74c3a3a08c | |||
| 0a19854602 | |||
| 67263da0f1 | |||
| 95879e33d4 | |||
| 0c059e8a28 | |||
| 485059f60e | |||
| 143bc84ac3 | |||
| 06856e5caa | |||
| b9bde0f95b |
@@ -10,6 +10,7 @@ on:
|
|||||||
- "v*"
|
- "v*"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
DOCKERHUB_NAMESPACE: gmwallet
|
||||||
IMAGE_NAME: epusdt
|
IMAGE_NAME: epusdt
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +30,12 @@ jobs:
|
|||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v5
|
||||||
with:
|
with:
|
||||||
images: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}
|
images: ${{ env.DOCKERHUB_NAMESPACE }}/${{ env.IMAGE_NAME }}
|
||||||
tags: |
|
tags: |
|
||||||
type=raw,value=alpine
|
type=raw,value=alpine
|
||||||
type=raw,value=latest,enable={{is_default_branch}}
|
type=raw,value=latest
|
||||||
type=ref,event=branch,suffix=-alpine
|
type=ref,event=branch,suffix=-alpine
|
||||||
type=ref,event=tag,suffix=-alpine
|
type=ref,event=tag
|
||||||
type=sha,prefix=sha-,suffix=-alpine
|
type=sha,prefix=sha-,suffix=-alpine
|
||||||
|
|
||||||
- name: Login To Docker Hub
|
- name: Login To Docker Hub
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
epusdt:
|
epusdt:
|
||||||
image: gmwallet/epusdt:alpine
|
image: gmwallet/epusdt:latest
|
||||||
restart: always
|
restart: always
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func InitApp() {
|
|||||||
log.Init()
|
log.Init()
|
||||||
dao.Init()
|
dao.Init()
|
||||||
// Wire settings-table lookups into the config package so
|
// Wire settings-table lookups into the config package so
|
||||||
// GetRateApiUrl / GetUsdtRate prefer DB-backed overrides.
|
// GetRateApiUrl / GetUsdtRate can consult admin-configured values.
|
||||||
config.SettingsGetString = func(key string) string {
|
config.SettingsGetString = func(key string) string {
|
||||||
return data.GetSettingString(key, "")
|
return data.GetSettingString(key, "")
|
||||||
}
|
}
|
||||||
@@ -36,9 +36,6 @@ func InitApp() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// config.Init() computes RateApiUrl before SettingsGetString is
|
|
||||||
// installed, so refresh the cache once DB-backed settings are available.
|
|
||||||
config.RateApiUrl = config.GetRateApiUrl()
|
|
||||||
// Seed admin account and JWT secret so the management console is
|
// Seed admin account and JWT secret so the management console is
|
||||||
// immediately usable on a fresh install. Both are idempotent.
|
// immediately usable on a fresh install. Both are idempotent.
|
||||||
_, isNew, err := data.EnsureDefaultAdmin()
|
_, isNew, err := data.EnsureDefaultAdmin()
|
||||||
|
|||||||
+104
-17
@@ -3,6 +3,7 @@ package config
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
@@ -34,8 +35,6 @@ var (
|
|||||||
TgBotToken string
|
TgBotToken string
|
||||||
TgProxy string
|
TgProxy string
|
||||||
TgManage int64
|
TgManage int64
|
||||||
UsdtRate float64
|
|
||||||
RateApiUrl string
|
|
||||||
BuildVersion = "0.0.0-dev"
|
BuildVersion = "0.0.0-dev"
|
||||||
BuildCommit = "none"
|
BuildCommit = "none"
|
||||||
BuildDate = "unknown"
|
BuildDate = "unknown"
|
||||||
@@ -64,6 +63,9 @@ func Init() {
|
|||||||
LogLevel = normalizeLogLevel(viper.GetString("log_level"))
|
LogLevel = normalizeLogLevel(viper.GetString("log_level"))
|
||||||
StaticPath = normalizeStaticURLPath(viper.GetString("static_path"))
|
StaticPath = normalizeStaticURLPath(viper.GetString("static_path"))
|
||||||
StaticFilePath = filepath.Join(configRootPath, strings.TrimPrefix(StaticPath, "/"))
|
StaticFilePath = filepath.Join(configRootPath, strings.TrimPrefix(StaticPath, "/"))
|
||||||
|
if err = ensureConfiguredStaticFiles(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
RuntimePath = resolvePathFromBase(configRootPath, viper.GetString("runtime_root_path"), filepath.Join(configRootPath, "runtime"))
|
RuntimePath = resolvePathFromBase(configRootPath, viper.GetString("runtime_root_path"), filepath.Join(configRootPath, "runtime"))
|
||||||
LogSavePath = resolvePathFromBase(RuntimePath, viper.GetString("log_save_path"), filepath.Join(RuntimePath, "logs"))
|
LogSavePath = resolvePathFromBase(RuntimePath, viper.GetString("log_save_path"), filepath.Join(RuntimePath, "logs"))
|
||||||
mustMkdir(RuntimePath)
|
mustMkdir(RuntimePath)
|
||||||
@@ -76,8 +78,6 @@ func Init() {
|
|||||||
TgBotToken = viper.GetString("tg_bot_token")
|
TgBotToken = viper.GetString("tg_bot_token")
|
||||||
TgProxy = viper.GetString("tg_proxy")
|
TgProxy = viper.GetString("tg_proxy")
|
||||||
TgManage = viper.GetInt64("tg_manage")
|
TgManage = viper.GetInt64("tg_manage")
|
||||||
|
|
||||||
RateApiUrl = GetRateApiUrl()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mustMkdir(path string) {
|
func mustMkdir(path string) {
|
||||||
@@ -86,6 +86,93 @@ func mustMkdir(path string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ensureConfiguredStaticFiles() error {
|
||||||
|
if strings.TrimSpace(StaticFilePath) == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
exePath, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
exePath, err = filepath.EvalSymlinks(exePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
srcDir := filepath.Join(filepath.Dir(exePath), "static")
|
||||||
|
srcInfo, err := os.Stat(srcDir)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !srcInfo.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
srcAbs, err := filepath.Abs(srcDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dstAbs, err := filepath.Abs(StaticFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if srcAbs == dstAbs {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return copyMissingStaticFiles(srcAbs, dstAbs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyMissingStaticFiles(srcDir, dstDir string) error {
|
||||||
|
return filepath.WalkDir(srcDir, func(path string, d os.DirEntry, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rel, err := filepath.Rel(srcDir, path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dstPath := filepath.Join(dstDir, rel)
|
||||||
|
if d.IsDir() {
|
||||||
|
return os.MkdirAll(dstPath, 0o755)
|
||||||
|
}
|
||||||
|
if _, err = os.Stat(dstPath); err == nil {
|
||||||
|
return nil
|
||||||
|
} else if !errors.Is(err, os.ErrNotExist) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = os.MkdirAll(filepath.Dir(dstPath), 0o755); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return copyFile(path, dstPath)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyFile(srcPath, dstPath string) error {
|
||||||
|
in, err := os.Open(srcPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer in.Close()
|
||||||
|
|
||||||
|
out, err := os.OpenFile(dstPath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0o644)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, os.ErrExist) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = io.Copy(out, in); err != nil {
|
||||||
|
_ = out.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return out.Close()
|
||||||
|
}
|
||||||
|
|
||||||
func normalizeLogLevel(level string) string {
|
func normalizeLogLevel(level string) string {
|
||||||
switch strings.ToLower(strings.TrimSpace(level)) {
|
switch strings.ToLower(strings.TrimSpace(level)) {
|
||||||
case "debug", "info", "warn", "error":
|
case "debug", "info", "warn", "error":
|
||||||
@@ -275,13 +362,14 @@ func GetRateForCoin(coin string, base string) float64 {
|
|||||||
if usdtRate > 0 {
|
if usdtRate > 0 {
|
||||||
return 1 / usdtRate
|
return 1 / usdtRate
|
||||||
}
|
}
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return getRateForCoinFromAPI(coin, base)
|
||||||
|
}
|
||||||
|
|
||||||
baseURL := RateApiUrl
|
func getRateForCoinFromAPI(coin string, base string) float64 {
|
||||||
if baseURL == "" {
|
baseURL := GetRateApiUrl()
|
||||||
baseURL = GetRateApiUrl()
|
|
||||||
}
|
|
||||||
if baseURL == "" {
|
if baseURL == "" {
|
||||||
log.Printf("rate api url is empty")
|
log.Printf("rate api url is empty")
|
||||||
return 0.0
|
return 0.0
|
||||||
@@ -313,19 +401,18 @@ func GetRateForCoin(coin string, base string) float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetUsdtRate() float64 {
|
func GetUsdtRate() float64 {
|
||||||
// Prefer the DB-backed override (admin-configurable). Fall back to
|
// Only the admin setting can force the USDT/CNY rate. When the
|
||||||
// the legacy .env var, then the hardcoded 6.4 default.
|
// setting is unset, zero, or negative, fall back to the rate API.
|
||||||
if forced := settingsForcedUsdtRate(); forced > 0 {
|
if forced := settingsForcedUsdtRate(); forced > 0 {
|
||||||
return forced
|
return forced
|
||||||
}
|
}
|
||||||
forcedUsdtRate := viper.GetFloat64("forced_usdt_rate")
|
|
||||||
if forcedUsdtRate > 0 {
|
apiRate := getRateForCoinFromAPI("usdt", "cny")
|
||||||
return forcedUsdtRate
|
if apiRate > 0 {
|
||||||
|
return 1 / apiRate
|
||||||
}
|
}
|
||||||
if UsdtRate <= 0 {
|
log.Printf("usdt/cny rate unavailable: rate.forced_usdt_rate <= 0 and rate api returned no data")
|
||||||
return 6.4
|
return 0
|
||||||
}
|
|
||||||
return UsdtRate
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetOrderExpirationTime() int {
|
func GetOrderExpirationTime() int {
|
||||||
|
|||||||
@@ -1,11 +1,52 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/util/http_client"
|
||||||
|
"github.com/go-resty/resty/v2"
|
||||||
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func installSettingsGetter(t *testing.T, values map[string]string) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
oldGetter := SettingsGetString
|
||||||
|
SettingsGetString = func(key string) string {
|
||||||
|
return values[key]
|
||||||
|
}
|
||||||
|
t.Cleanup(func() {
|
||||||
|
SettingsGetString = oldGetter
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type roundTripFunc func(*http.Request) (*http.Response, error)
|
||||||
|
|
||||||
|
func (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||||
|
return f(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func installMockHTTPClient(t *testing.T, handler roundTripFunc) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
oldFactory := http_client.ClientFactory
|
||||||
|
http_client.ClientFactory = func() *resty.Client {
|
||||||
|
client := resty.NewWithClient(&http.Client{Transport: handler})
|
||||||
|
client.SetTimeout(10 * time.Second)
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
t.Cleanup(func() {
|
||||||
|
http_client.ClientFactory = oldFactory
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestNormalizeConfiguredPathUsesExplicitFile(t *testing.T) {
|
func TestNormalizeConfiguredPathUsesExplicitFile(t *testing.T) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
@@ -135,3 +176,181 @@ func TestResolveConfigFilePathPrefersExplicitOverEnv(t *testing.T) {
|
|||||||
t.Fatalf("config path = %s, want %s", got, flagPath)
|
t.Fatalf("config path = %s, want %s", got, flagPath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCopyMissingStaticFilesCopiesAssetsWithoutOverwriting(t *testing.T) {
|
||||||
|
root := t.TempDir()
|
||||||
|
src := filepath.Join(root, "app-static")
|
||||||
|
dst := filepath.Join(root, "data-static")
|
||||||
|
|
||||||
|
if err := os.MkdirAll(filepath.Join(src, "images"), 0o755); err != nil {
|
||||||
|
t.Fatalf("mkdir source: %v", err)
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(filepath.Join(src, "index.html"), []byte("source-index"), 0o644); err != nil {
|
||||||
|
t.Fatalf("write source index: %v", err)
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(filepath.Join(src, "payment.js"), []byte("source-payment"), 0o644); err != nil {
|
||||||
|
t.Fatalf("write source payment: %v", err)
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(filepath.Join(src, "images", "logo.png"), []byte("source-logo"), 0o644); err != nil {
|
||||||
|
t.Fatalf("write source logo: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.MkdirAll(dst, 0o755); err != nil {
|
||||||
|
t.Fatalf("mkdir destination: %v", err)
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(filepath.Join(dst, "index.html"), []byte("custom-index"), 0o644); err != nil {
|
||||||
|
t.Fatalf("write existing destination index: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := copyMissingStaticFiles(src, dst); err != nil {
|
||||||
|
t.Fatalf("copy missing static files: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
index, err := os.ReadFile(filepath.Join(dst, "index.html"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("read destination index: %v", err)
|
||||||
|
}
|
||||||
|
if string(index) != "custom-index" {
|
||||||
|
t.Fatalf("existing index was overwritten: %q", string(index))
|
||||||
|
}
|
||||||
|
|
||||||
|
payment, err := os.ReadFile(filepath.Join(dst, "payment.js"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("read copied payment: %v", err)
|
||||||
|
}
|
||||||
|
if string(payment) != "source-payment" {
|
||||||
|
t.Fatalf("payment.js = %q, want source-payment", string(payment))
|
||||||
|
}
|
||||||
|
|
||||||
|
logo, err := os.ReadFile(filepath.Join(dst, "images", "logo.png"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("read copied nested asset: %v", err)
|
||||||
|
}
|
||||||
|
if string(logo) != "source-logo" {
|
||||||
|
t.Fatalf("logo.png = %q, want source-logo", string(logo))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetUsdtRatePrefersPositiveAdminOverride(t *testing.T) {
|
||||||
|
viper.Reset()
|
||||||
|
t.Cleanup(viper.Reset)
|
||||||
|
t.Setenv("API_RATE_URL", "")
|
||||||
|
|
||||||
|
apiCalled := false
|
||||||
|
installMockHTTPClient(t, func(r *http.Request) (*http.Response, error) {
|
||||||
|
apiCalled = true
|
||||||
|
return &http.Response{
|
||||||
|
StatusCode: http.StatusInternalServerError,
|
||||||
|
Status: http.StatusText(http.StatusInternalServerError),
|
||||||
|
Header: make(http.Header),
|
||||||
|
Body: io.NopCloser(strings.NewReader("")),
|
||||||
|
Request: r,
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
installSettingsGetter(t, map[string]string{
|
||||||
|
"rate.forced_usdt_rate": "7.25",
|
||||||
|
"rate.api_url": "https://rate.example.test",
|
||||||
|
})
|
||||||
|
|
||||||
|
got := GetUsdtRate()
|
||||||
|
if got != 7.25 {
|
||||||
|
t.Fatalf("GetUsdtRate() = %v, want 7.25", got)
|
||||||
|
}
|
||||||
|
if apiCalled {
|
||||||
|
t.Fatalf("rate API should not be called when rate.forced_usdt_rate > 0")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetUsdtRateUsesAPIWhenAdminOverrideIsNotPositive(t *testing.T) {
|
||||||
|
viper.Reset()
|
||||||
|
t.Cleanup(viper.Reset)
|
||||||
|
t.Setenv("API_RATE_URL", "")
|
||||||
|
|
||||||
|
installMockHTTPClient(t, func(r *http.Request) (*http.Response, error) {
|
||||||
|
if r.URL.Path != "/cny.json" {
|
||||||
|
t.Fatalf("rate api path = %s, want /cny.json", r.URL.Path)
|
||||||
|
}
|
||||||
|
return &http.Response{
|
||||||
|
StatusCode: http.StatusOK,
|
||||||
|
Status: "200 OK",
|
||||||
|
Header: http.Header{"Content-Type": []string{"application/json"}},
|
||||||
|
Body: io.NopCloser(strings.NewReader(`{"cny":{"usdt":0.14635}}`)),
|
||||||
|
Request: r,
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
installSettingsGetter(t, map[string]string{
|
||||||
|
"rate.forced_usdt_rate": "-1",
|
||||||
|
"rate.api_url": "https://rate.example.test",
|
||||||
|
})
|
||||||
|
|
||||||
|
got := GetUsdtRate()
|
||||||
|
want := 1 / 0.14635
|
||||||
|
if math.Abs(got-want) > 1e-9 {
|
||||||
|
t.Fatalf("GetUsdtRate() = %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
rate := GetRateForCoin("usdt", "cny")
|
||||||
|
if math.Abs(rate-0.14635) > 1e-9 {
|
||||||
|
t.Fatalf("GetRateForCoin(usdt, cny) = %v, want 0.14635", rate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetUsdtRateReturnsZeroWhenAPIUnavailableWithoutAdminOverride(t *testing.T) {
|
||||||
|
viper.Reset()
|
||||||
|
t.Cleanup(viper.Reset)
|
||||||
|
t.Setenv("API_RATE_URL", "")
|
||||||
|
|
||||||
|
installMockHTTPClient(t, func(r *http.Request) (*http.Response, error) {
|
||||||
|
return &http.Response{
|
||||||
|
StatusCode: http.StatusBadGateway,
|
||||||
|
Status: "502 Bad Gateway",
|
||||||
|
Header: make(http.Header),
|
||||||
|
Body: io.NopCloser(strings.NewReader("")),
|
||||||
|
Request: r,
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
installSettingsGetter(t, map[string]string{
|
||||||
|
"rate.forced_usdt_rate": "0",
|
||||||
|
"rate.api_url": "https://rate.example.test",
|
||||||
|
})
|
||||||
|
|
||||||
|
if got := GetUsdtRate(); got != 0 {
|
||||||
|
t.Fatalf("GetUsdtRate() = %v, want 0", got)
|
||||||
|
}
|
||||||
|
if got := GetRateForCoin("usdt", "cny"); got != 0 {
|
||||||
|
t.Fatalf("GetRateForCoin(usdt, cny) = %v, want 0", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetRateForCoinCallsRateAPIOnceForUsdtCnyFailure(t *testing.T) {
|
||||||
|
viper.Reset()
|
||||||
|
t.Cleanup(viper.Reset)
|
||||||
|
t.Setenv("API_RATE_URL", "")
|
||||||
|
|
||||||
|
callCount := 0
|
||||||
|
installMockHTTPClient(t, func(r *http.Request) (*http.Response, error) {
|
||||||
|
callCount++
|
||||||
|
return &http.Response{
|
||||||
|
StatusCode: http.StatusBadGateway,
|
||||||
|
Status: "502 Bad Gateway",
|
||||||
|
Header: make(http.Header),
|
||||||
|
Body: io.NopCloser(strings.NewReader("")),
|
||||||
|
Request: r,
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
installSettingsGetter(t, map[string]string{
|
||||||
|
"rate.forced_usdt_rate": "0",
|
||||||
|
"rate.api_url": "https://rate.example.test",
|
||||||
|
})
|
||||||
|
|
||||||
|
if got := GetRateForCoin("usdt", "cny"); got != 0 {
|
||||||
|
t.Fatalf("GetRateForCoin(usdt, cny) = %v, want 0", got)
|
||||||
|
}
|
||||||
|
if callCount != 1 {
|
||||||
|
t.Fatalf("rate api call count = %d, want 1", callCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ package config
|
|||||||
// create a cycle via `model/dao -> config`.
|
// create a cycle via `model/dao -> config`.
|
||||||
//
|
//
|
||||||
// If unset (e.g. during early startup or tests) the getters return the
|
// If unset (e.g. during early startup or tests) the getters return the
|
||||||
// zero string / 0 and callers fall through to the .env / default path.
|
// zero string / 0 and callers apply their own fallback behavior.
|
||||||
|
|
||||||
// SettingsGetString is installed by bootstrap.Init with a closure that
|
// SettingsGetString is installed by bootstrap.Init with a closure that
|
||||||
// reads from the settings table. Runtime-only.
|
// reads from the settings table. Runtime-only.
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ import (
|
|||||||
// Supported groups and keys:
|
// Supported groups and keys:
|
||||||
//
|
//
|
||||||
// - group=rate:
|
// - group=rate:
|
||||||
// rate.forced_usdt_rate (float) — override USDT exchange rate (0 = use api)
|
// rate.forced_usdt_rate (float) — override USDT/CNY when > 0; <= 0 uses rate.api_url
|
||||||
// rate.api_url (string) — external rate API URL
|
// rate.api_url (string) — external rate API URL used when rate.forced_usdt_rate <= 0
|
||||||
// rate.adjust_percent (float) — rate adjustment percentage
|
// rate.adjust_percent (float) — rate adjustment percentage
|
||||||
// rate.okx_c2c_enabled (bool) — use OKX C2C rate feed
|
// rate.okx_c2c_enabled (bool) — use OKX C2C rate feed
|
||||||
//
|
//
|
||||||
@@ -73,7 +73,7 @@ func (c *BaseAdminController) ListSettings(ctx echo.Context) error {
|
|||||||
// @Description Batch insert/update settings. Returns per-key status.
|
// @Description Batch insert/update settings. Returns per-key status.
|
||||||
// @Description Supported groups: brand, rate, system, epay.
|
// @Description Supported groups: brand, rate, system, epay.
|
||||||
// @Description epay group keys: epay.default_token (e.g. "usdt"), epay.default_currency (e.g. "cny"), epay.default_network (e.g. "tron").
|
// @Description epay group keys: epay.default_token (e.g. "usdt"), epay.default_currency (e.g. "cny"), epay.default_network (e.g. "tron").
|
||||||
// @Description rate group keys: rate.forced_usdt_rate, rate.api_url, rate.adjust_percent, rate.okx_c2c_enabled.
|
// @Description rate group keys: rate.forced_usdt_rate (>0 overrides USDT/CNY; <=0 uses rate.api_url), rate.api_url, rate.adjust_percent, rate.okx_c2c_enabled.
|
||||||
// @Description brand group keys: brand.site_name, brand.logo_url, brand.page_title, brand.pay_success_text, brand.support_url.
|
// @Description brand group keys: brand.site_name, brand.logo_url, brand.page_title, brand.pay_success_text, brand.support_url.
|
||||||
// @Description system group keys: system.order_expiration_time.
|
// @Description system group keys: system.order_expiration_time.
|
||||||
// @Tags Admin Settings
|
// @Tags Admin Settings
|
||||||
|
|||||||
+55
-31
@@ -79,6 +79,60 @@ type installHandler struct {
|
|||||||
done chan struct{}
|
done chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func installRootRedirectMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
|
||||||
|
return func(c echo.Context) error {
|
||||||
|
if c.Request().Method == http.MethodGet && c.Request().URL.Path == "/" {
|
||||||
|
return c.Redirect(http.StatusFound, "/install")
|
||||||
|
}
|
||||||
|
return next(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveInstallWWWRoot() string {
|
||||||
|
// Resolve www/ relative to the executable so SPA routes work regardless
|
||||||
|
// of the working directory. main.go extracts www/ next to the binary.
|
||||||
|
wwwRoot := "./www"
|
||||||
|
if exePath, err := os.Executable(); err == nil {
|
||||||
|
if exePath, err = filepath.EvalSymlinks(exePath); err == nil {
|
||||||
|
wwwRoot = filepath.Join(filepath.Dir(exePath), "www")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wwwRoot
|
||||||
|
}
|
||||||
|
|
||||||
|
func newInstallServer(envFilePath, wwwRoot string) (*echo.Echo, *installHandler) {
|
||||||
|
h := &installHandler{
|
||||||
|
envFilePath: envFilePath,
|
||||||
|
done: make(chan struct{}),
|
||||||
|
}
|
||||||
|
|
||||||
|
e := echo.New()
|
||||||
|
e.HideBanner = true
|
||||||
|
e.HidePort = true
|
||||||
|
|
||||||
|
// api routes for the install frontend
|
||||||
|
api := e.Group("/api")
|
||||||
|
|
||||||
|
api.GET("/install/defaults", h.GetDefaults)
|
||||||
|
api.POST("/install", h.Submit)
|
||||||
|
|
||||||
|
// Redirect browser visits on root to /install so first-run users land
|
||||||
|
// on the wizard directly. This must run before the static middleware,
|
||||||
|
// otherwise "/" is intercepted by the SPA index.html fallback.
|
||||||
|
e.Use(installRootRedirectMiddleware)
|
||||||
|
|
||||||
|
e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
|
||||||
|
Skipper: func(c echo.Context) bool {
|
||||||
|
return luluHttp.ShouldSkipSPAFallback(c.Request().URL.Path)
|
||||||
|
},
|
||||||
|
HTML5: true,
|
||||||
|
Index: "index.html",
|
||||||
|
Root: wwwRoot,
|
||||||
|
}))
|
||||||
|
|
||||||
|
return e, h
|
||||||
|
}
|
||||||
|
|
||||||
// GetDefaults returns default values for the install form.
|
// GetDefaults returns default values for the install form.
|
||||||
//
|
//
|
||||||
// @Summary Install — get default values
|
// @Summary Install — get default values
|
||||||
@@ -172,37 +226,7 @@ func RunInstallServer(listenAddr, envFilePath string) {
|
|||||||
listenAddr = DefaultInstallAddr
|
listenAddr = DefaultInstallAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
h := &installHandler{
|
e, h := newInstallServer(envFilePath, resolveInstallWWWRoot())
|
||||||
envFilePath: envFilePath,
|
|
||||||
done: make(chan struct{}),
|
|
||||||
}
|
|
||||||
|
|
||||||
e := echo.New()
|
|
||||||
e.HideBanner = true
|
|
||||||
e.HidePort = true
|
|
||||||
|
|
||||||
// api routes for the install frontend
|
|
||||||
api := e.Group("/api")
|
|
||||||
|
|
||||||
api.GET("/install/defaults", h.GetDefaults)
|
|
||||||
api.POST("/install", h.Submit)
|
|
||||||
|
|
||||||
// Resolve www/ relative to the executable so SPA routes work regardless
|
|
||||||
// of the working directory. main.go extracts www/ next to the binary.
|
|
||||||
wwwRoot := "./www"
|
|
||||||
if exePath, err := os.Executable(); err == nil {
|
|
||||||
if exePath, err = filepath.EvalSymlinks(exePath); err == nil {
|
|
||||||
wwwRoot = filepath.Join(filepath.Dir(exePath), "www")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
|
|
||||||
Skipper: func(c echo.Context) bool {
|
|
||||||
return luluHttp.ShouldSkipSPAFallback(c.Request().URL.Path)
|
|
||||||
},
|
|
||||||
HTML5: true,
|
|
||||||
Index: "index.html",
|
|
||||||
Root: wwwRoot,
|
|
||||||
}))
|
|
||||||
|
|
||||||
// Build a human-readable URL for the console hint.
|
// Build a human-readable URL for the console hint.
|
||||||
installHost := listenAddr
|
installHost := listenAddr
|
||||||
|
|||||||
@@ -95,6 +95,55 @@ func TestInstallAPIDefaults(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInstallServerRootRedirectsToInstall(t *testing.T) {
|
||||||
|
dir := t.TempDir()
|
||||||
|
wwwRoot := filepath.Join(dir, "www")
|
||||||
|
if err := os.MkdirAll(wwwRoot, 0o755); err != nil {
|
||||||
|
t.Fatalf("mkdir www root: %v", err)
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(filepath.Join(wwwRoot, "index.html"), []byte("install-ui"), 0o644); err != nil {
|
||||||
|
t.Fatalf("write index.html: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
e, _ := newInstallServer(filepath.Join(dir, ".env"), wwwRoot)
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusFound {
|
||||||
|
t.Fatalf("status = %d, want 302; body: %s", rec.Code, rec.Body.String())
|
||||||
|
}
|
||||||
|
if got := rec.Header().Get("Location"); got != "/install" {
|
||||||
|
t.Fatalf("Location = %q, want /install", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInstallServerServesSPAOnInstallRoute(t *testing.T) {
|
||||||
|
dir := t.TempDir()
|
||||||
|
wwwRoot := filepath.Join(dir, "www")
|
||||||
|
if err := os.MkdirAll(wwwRoot, 0o755); err != nil {
|
||||||
|
t.Fatalf("mkdir www root: %v", err)
|
||||||
|
}
|
||||||
|
const wantBody = "install-ui"
|
||||||
|
if err := os.WriteFile(filepath.Join(wwwRoot, "index.html"), []byte(wantBody), 0o644); err != nil {
|
||||||
|
t.Fatalf("write index.html: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
e, _ := newInstallServer(filepath.Join(dir, ".env"), wwwRoot)
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "/install", nil)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("status = %d, want 200; body: %s", rec.Code, rec.Body.String())
|
||||||
|
}
|
||||||
|
if body := rec.Body.String(); body != wantBody {
|
||||||
|
t.Fatalf("body = %q, want %q", body, wantBody)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestInstallAPISubmit(t *testing.T) {
|
func TestInstallAPISubmit(t *testing.T) {
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
envPath := filepath.Join(dir, ".env")
|
envPath := filepath.Join(dir, ".env")
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ func SetupTestDatabases(t testing.TB) func() {
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
viper.Reset()
|
viper.Reset()
|
||||||
viper.Set("forced_usdt_rate", 1.0)
|
|
||||||
viper.Set("app_uri", "https://example.com")
|
viper.Set("app_uri", "https://example.com")
|
||||||
viper.Set("order_expiration_time", 10)
|
viper.Set("order_expiration_time", 10)
|
||||||
viper.Set("order_notice_max_retry", 2)
|
viper.Set("order_notice_max_retry", 2)
|
||||||
@@ -31,7 +30,6 @@ func SetupTestDatabases(t testing.TB) func() {
|
|||||||
config.HTTPAccessLog = false
|
config.HTTPAccessLog = false
|
||||||
config.SQLDebug = false
|
config.SQLDebug = false
|
||||||
config.LogLevel = "error"
|
config.LogLevel = "error"
|
||||||
config.UsdtRate = 0
|
|
||||||
appLog.Sugar = zap.NewNop().Sugar()
|
appLog.Sugar = zap.NewNop().Sugar()
|
||||||
|
|
||||||
mainDB := mustOpenSQLite(t, filepath.Join(t.TempDir(), "main.db"))
|
mainDB := mustOpenSQLite(t, filepath.Join(t.TempDir(), "main.db"))
|
||||||
@@ -52,6 +50,16 @@ func SetupTestDatabases(t testing.TB) func() {
|
|||||||
|
|
||||||
dao.Mdb = mainDB
|
dao.Mdb = mainDB
|
||||||
dao.RuntimeDB = runtimeDB
|
dao.RuntimeDB = runtimeDB
|
||||||
|
config.SettingsGetString = func(key string) string {
|
||||||
|
if dao.Mdb == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
var row mdb.Setting
|
||||||
|
if err := dao.Mdb.Where("`key` = ?", key).Take(&row).Error; err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return row.Value
|
||||||
|
}
|
||||||
|
|
||||||
// Seed all standard chains as enabled so IsChainEnabled checks pass.
|
// Seed all standard chains as enabled so IsChainEnabled checks pass.
|
||||||
for _, network := range []string{
|
for _, network := range []string{
|
||||||
@@ -74,12 +82,21 @@ func SetupTestDatabases(t testing.TB) func() {
|
|||||||
Pid: "1001", SecretKey: "test-token",
|
Pid: "1001", SecretKey: "test-token",
|
||||||
Status: mdb.ApiKeyStatusEnable,
|
Status: mdb.ApiKeyStatusEnable,
|
||||||
})
|
})
|
||||||
|
if err := dao.Mdb.Create(&mdb.Setting{
|
||||||
|
Group: "rate",
|
||||||
|
Key: "rate.forced_usdt_rate",
|
||||||
|
Value: "1.0",
|
||||||
|
Type: "string",
|
||||||
|
}).Error; err != nil {
|
||||||
|
t.Fatalf("seed rate.forced_usdt_rate: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
return func() {
|
return func() {
|
||||||
closeDB(t, runtimeDB)
|
closeDB(t, runtimeDB)
|
||||||
closeDB(t, mainDB)
|
closeDB(t, mainDB)
|
||||||
dao.Mdb = nil
|
dao.Mdb = nil
|
||||||
dao.RuntimeDB = nil
|
dao.RuntimeDB = nil
|
||||||
|
config.SettingsGetString = nil
|
||||||
viper.Reset()
|
viper.Reset()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,12 @@ package service
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/GMWalletApp/epusdt/internal/testutil"
|
"github.com/GMWalletApp/epusdt/internal/testutil"
|
||||||
"github.com/GMWalletApp/epusdt/model/dao"
|
"github.com/GMWalletApp/epusdt/model/dao"
|
||||||
@@ -12,6 +15,8 @@ import (
|
|||||||
"github.com/GMWalletApp/epusdt/model/mdb"
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
"github.com/GMWalletApp/epusdt/model/request"
|
"github.com/GMWalletApp/epusdt/model/request"
|
||||||
"github.com/GMWalletApp/epusdt/util/constant"
|
"github.com/GMWalletApp/epusdt/util/constant"
|
||||||
|
"github.com/GMWalletApp/epusdt/util/http_client"
|
||||||
|
"github.com/go-resty/resty/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newCreateTransactionRequest(orderID string, amount float64) *request.CreateTransactionRequest {
|
func newCreateTransactionRequest(orderID string, amount float64) *request.CreateTransactionRequest {
|
||||||
@@ -25,6 +30,26 @@ func newCreateTransactionRequest(orderID string, amount float64) *request.Create
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type roundTripFunc func(*http.Request) (*http.Response, error)
|
||||||
|
|
||||||
|
func (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||||
|
return f(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func installMockHTTPClient(t *testing.T, handler roundTripFunc) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
oldFactory := http_client.ClientFactory
|
||||||
|
http_client.ClientFactory = func() *resty.Client {
|
||||||
|
client := resty.NewWithClient(&http.Client{Transport: handler})
|
||||||
|
client.SetTimeout(10 * time.Second)
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
t.Cleanup(func() {
|
||||||
|
http_client.ClientFactory = oldFactory
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateTransactionAssignsIncrementedAmountsAndLocks(t *testing.T) {
|
func TestCreateTransactionAssignsIncrementedAmountsAndLocks(t *testing.T) {
|
||||||
cleanup := testutil.SetupTestDatabases(t)
|
cleanup := testutil.SetupTestDatabases(t)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
@@ -72,6 +97,59 @@ func TestCreateTransactionAssignsIncrementedAmountsAndLocks(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCreateTransactionUsesRateAPIWhenForcedSettingIsNotPositive(t *testing.T) {
|
||||||
|
cleanup := testutil.SetupTestDatabases(t)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
installMockHTTPClient(t, func(r *http.Request) (*http.Response, error) {
|
||||||
|
if r.URL.Path != "/cny.json" {
|
||||||
|
t.Fatalf("rate api path = %s, want /cny.json", r.URL.Path)
|
||||||
|
}
|
||||||
|
return &http.Response{
|
||||||
|
StatusCode: http.StatusOK,
|
||||||
|
Status: "200 OK",
|
||||||
|
Header: http.Header{"Content-Type": []string{"application/json"}},
|
||||||
|
Body: io.NopCloser(strings.NewReader(`{"cny":{"usdt":0.14635}}`)),
|
||||||
|
Request: r,
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err := data.SetSetting("rate", "rate.forced_usdt_rate", "0", "string"); err != nil {
|
||||||
|
t.Fatalf("set rate.forced_usdt_rate: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting("rate", "rate.api_url", "https://rate.example.test", "string"); err != nil {
|
||||||
|
t.Fatalf("set rate.api_url: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := data.AddWalletAddress("wallet_1"); err != nil {
|
||||||
|
t.Fatalf("add wallet: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := CreateTransaction(newCreateTransactionRequest("order_api_rate_1", 10), nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("create transaction: %v", err)
|
||||||
|
}
|
||||||
|
if got := fmt.Sprintf("%.2f", resp.ActualAmount); got != "1.46" {
|
||||||
|
t.Fatalf("actual amount = %s, want 1.46", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateTransactionFailsWhenRateAPIUnavailableAndForcedSettingIsNotPositive(t *testing.T) {
|
||||||
|
cleanup := testutil.SetupTestDatabases(t)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
if err := data.SetSetting("rate", "rate.forced_usdt_rate", "0", "string"); err != nil {
|
||||||
|
t.Fatalf("set rate.forced_usdt_rate: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting("rate", "rate.api_url", "", "string"); err != nil {
|
||||||
|
t.Fatalf("clear rate.api_url: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := CreateTransaction(newCreateTransactionRequest("order_missing_rate_1", 10), nil)
|
||||||
|
if err != constant.RateAmountErr {
|
||||||
|
t.Fatalf("create transaction error = %v, want %v", err, constant.RateAmountErr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateTransactionNormalizesEvmReceiveAddressToLowercase(t *testing.T) {
|
func TestCreateTransactionNormalizesEvmReceiveAddressToLowercase(t *testing.T) {
|
||||||
cleanup := testutil.SetupTestDatabases(t)
|
cleanup := testutil.SetupTestDatabases(t)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|||||||
+164
-309
@@ -1,32 +1,22 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
"net/http"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
|
|
||||||
tron "github.com/GMWalletApp/epusdt/crypto"
|
|
||||||
"github.com/GMWalletApp/epusdt/model/data"
|
"github.com/GMWalletApp/epusdt/model/data"
|
||||||
"github.com/GMWalletApp/epusdt/model/mdb"
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
"github.com/GMWalletApp/epusdt/model/request"
|
"github.com/GMWalletApp/epusdt/model/request"
|
||||||
"github.com/GMWalletApp/epusdt/notify"
|
"github.com/GMWalletApp/epusdt/notify"
|
||||||
"github.com/GMWalletApp/epusdt/util/constant"
|
"github.com/GMWalletApp/epusdt/util/constant"
|
||||||
"github.com/GMWalletApp/epusdt/util/http_client"
|
|
||||||
"github.com/GMWalletApp/epusdt/util/log"
|
"github.com/GMWalletApp/epusdt/util/log"
|
||||||
"github.com/GMWalletApp/epusdt/util/math"
|
"github.com/GMWalletApp/epusdt/util/math"
|
||||||
"github.com/dromara/carbon/v2"
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/gookit/goutil/stdutil"
|
|
||||||
"github.com/shopspring/decimal"
|
"github.com/shopspring/decimal"
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// resolveTronNode returns (baseURL, apiKey) for the TRON HTTP RPC node.
|
|
||||||
// It reads the first healthy (or any enabled) row from the rpc_nodes table.
|
|
||||||
func resolveTronNode() (string, string, error) {
|
func resolveTronNode() (string, string, error) {
|
||||||
node, err := data.SelectRpcNode(mdb.NetworkTron, mdb.RpcNodeTypeHttp)
|
node, err := data.SelectRpcNode(mdb.NetworkTron, mdb.RpcNodeTypeHttp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -42,296 +32,128 @@ func resolveTronNode() (string, string, error) {
|
|||||||
return rpcURL, node.ApiKey, nil
|
return rpcURL, node.ApiKey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Trc20CallBack(address string, wg *sync.WaitGroup) {
|
func ResolveTronNode() (string, string, error) {
|
||||||
defer wg.Done()
|
return resolveTronNode()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TryProcessTronTRC20Transfer(toAddr string, rawValue *big.Int, txHash string, blockTsMs int64) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
log.Sugar.Error(err)
|
log.Sugar.Errorf("[TRC20][%s] TryProcessTronTRC20Transfer panic: %v", toAddr, err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var innerWg sync.WaitGroup
|
addr := strings.TrimSpace(toAddr)
|
||||||
innerWg.Add(2)
|
if addr == "" || rawValue == nil || rawValue.Sign() <= 0 {
|
||||||
go checkTrxTransfers(address, &innerWg)
|
return
|
||||||
go checkTrc20Transfers(address, &innerWg)
|
}
|
||||||
innerWg.Wait()
|
|
||||||
|
decimalQuant := decimal.NewFromBigInt(rawValue, 0)
|
||||||
|
amount := math.MustParsePrecFloat64(decimalQuant.Div(decimal.NewFromInt(1_000_000)).InexactFloat64(), 2)
|
||||||
|
if amount <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
tradeID, err := data.GetTradeIdByWalletAddressAndAmountAndToken(mdb.NetworkTron, addr, "USDT", amount)
|
||||||
|
if err != nil {
|
||||||
|
log.Sugar.Warnf("[TRC20][%s] lock lookup: %v", addr, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if tradeID == "" {
|
||||||
|
log.Sugar.Debugf("[TRC20][%s] skip unmatched tx hash=%s amount=%.2f", addr, txHash, amount)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
order, err := data.GetOrderInfoByTradeId(tradeID)
|
||||||
|
if err != nil {
|
||||||
|
log.Sugar.Warnf("[TRC20][%s] load order: %v", addr, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if blockTsMs > 0 && blockTsMs < order.CreatedAt.TimestampMilli() {
|
||||||
|
log.Sugar.Warnf("[TRC20][%s] skip tx %s because block time %d is before order create time %d", addr, txHash, blockTsMs, order.CreatedAt.TimestampMilli())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
req := &request.OrderProcessingRequest{
|
||||||
|
ReceiveAddress: addr,
|
||||||
|
Token: "USDT",
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
TradeId: tradeID,
|
||||||
|
Amount: amount,
|
||||||
|
BlockTransactionId: txHash,
|
||||||
|
}
|
||||||
|
err = OrderProcessing(req)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, constant.OrderBlockAlreadyProcess) || errors.Is(err, constant.OrderStatusConflict) {
|
||||||
|
log.Sugar.Infof("[TRC20][%s] skip resolved transfer trade_id=%s hash=%s err=%v", addr, tradeID, txHash, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Sugar.Errorf("[TRC20][%s] OrderProcessing trade_id=%s hash=%s: %v", addr, tradeID, txHash, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sendPaymentNotification(order)
|
||||||
|
log.Sugar.Infof("[TRC20][%s] payment processed trade_id=%s hash=%s", addr, tradeID, txHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkTrxTransfers(address string, wg *sync.WaitGroup) {
|
func TryProcessTronTRXTransfer(toAddr string, rawSun int64, txHash string, blockTsMs int64) {
|
||||||
defer wg.Done()
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
log.Sugar.Errorf("[TRX][%s] TryProcessTronTRXTransfer panic: %v", toAddr, err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// Native TRX is gated by a chain_tokens row with empty
|
addr := strings.TrimSpace(toAddr)
|
||||||
// contract_address and symbol=TRX. Admin can disable this row to
|
if addr == "" || rawSun <= 0 {
|
||||||
// stop scanning native transfers without touching the chain toggle.
|
return
|
||||||
trxCfg, err := data.GetEnabledChainTokenBySymbol(mdb.NetworkTron, "TRX")
|
}
|
||||||
|
|
||||||
|
decimalQuant := decimal.NewFromInt(rawSun)
|
||||||
|
amount := math.MustParsePrecFloat64(decimalQuant.Div(decimal.NewFromInt(1_000_000)).InexactFloat64(), 2)
|
||||||
|
if amount <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
tradeID, err := data.GetTradeIdByWalletAddressAndAmountAndToken(mdb.NetworkTron, addr, "TRX", amount)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Sugar.Errorf("[TRX][%s] load chain_tokens err=%v", address, err)
|
log.Sugar.Warnf("[TRX][%s] lock lookup: %v", addr, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if trxCfg == nil || trxCfg.ID == 0 {
|
if tradeID == "" {
|
||||||
log.Sugar.Debugf("[TRX][%s] native TRX disabled in chain_tokens, skipping", address)
|
log.Sugar.Debugf("[TRX][%s] skip unmatched tx hash=%s amount=%.2f", addr, txHash, amount)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
trxDecimals := trxCfg.Decimals
|
|
||||||
if trxDecimals <= 0 {
|
|
||||||
trxDecimals = 6
|
|
||||||
}
|
|
||||||
|
|
||||||
client := http_client.GetHttpClient()
|
order, err := data.GetOrderInfoByTradeId(tradeID)
|
||||||
startTime := carbon.Now().AddHours(-24).TimestampMilli()
|
|
||||||
endTime := carbon.Now().TimestampMilli()
|
|
||||||
tronBaseURL, tronAPIKey, err := resolveTronNode()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Sugar.Errorf("[TRX][%s] resolve rpc_nodes err=%v", address, err)
|
log.Sugar.Warnf("[TRX][%s] load order: %v", addr, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if blockTsMs > 0 && blockTsMs < order.CreatedAt.TimestampMilli() {
|
||||||
|
log.Sugar.Warnf("[TRX][%s] skip tx %s because block time %d is before order create time %d", addr, txHash, blockTsMs, order.CreatedAt.TimestampMilli())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
url := fmt.Sprintf("%s/v1/accounts/%s/transactions", tronBaseURL, address)
|
|
||||||
|
|
||||||
resp, err := client.R().SetQueryParams(map[string]string{
|
req := &request.OrderProcessingRequest{
|
||||||
"order_by": "block_timestamp,desc",
|
ReceiveAddress: addr,
|
||||||
"limit": "100",
|
Token: "TRX",
|
||||||
"only_to": "true",
|
Network: mdb.NetworkTron,
|
||||||
"min_timestamp": stdutil.ToString(startTime),
|
TradeId: tradeID,
|
||||||
"max_timestamp": stdutil.ToString(endTime),
|
Amount: amount,
|
||||||
}).SetHeader("TRON-PRO-API-KEY", tronAPIKey).Get(url)
|
BlockTransactionId: txHash,
|
||||||
|
}
|
||||||
|
err = OrderProcessing(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Sugar.Errorf("[TRX][%s] HTTP request failed: %v", address, err)
|
if errors.Is(err, constant.OrderBlockAlreadyProcess) || errors.Is(err, constant.OrderStatusConflict) {
|
||||||
return
|
log.Sugar.Infof("[TRX][%s] skip resolved transfer trade_id=%s hash=%s err=%v", addr, tradeID, txHash, err)
|
||||||
}
|
return
|
||||||
if resp.StatusCode() != http.StatusOK {
|
}
|
||||||
log.Sugar.Errorf("[TRX][%s] API returned status %d", address, resp.StatusCode())
|
log.Sugar.Errorf("[TRX][%s] OrderProcessing trade_id=%s hash=%s: %v", addr, tradeID, txHash, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
success := gjson.GetBytes(resp.Body(), "success").Bool()
|
sendPaymentNotification(order)
|
||||||
if !success {
|
log.Sugar.Infof("[TRX][%s] payment processed trade_id=%s hash=%s", addr, tradeID, txHash)
|
||||||
log.Sugar.Errorf("[TRX][%s] API response indicates failure", address)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
transfers := gjson.GetBytes(resp.Body(), "data").Array()
|
|
||||||
if len(transfers) == 0 {
|
|
||||||
log.Sugar.Debugf("[TRX][%s] no transfer records found", address)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Sugar.Debugf("[TRX][%s] fetched %d transfer records", address, len(transfers))
|
|
||||||
|
|
||||||
for i, transfer := range transfers {
|
|
||||||
if transfer.Get("raw_data.contract.0.type").String() != "TransferContract" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if transfer.Get("ret.0.contractRet").String() != "SUCCESS" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
toAddressHex := transfer.Get("raw_data.contract.0.parameter.value.to_address").String()
|
|
||||||
toBytes, err := hex.DecodeString(toAddressHex)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRX][%s] decode address failed on tx #%d: %v", address, i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if tron.EncodeCheck(toBytes) != address {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
rawAmount := transfer.Get("raw_data.contract.0.parameter.value.amount").String()
|
|
||||||
decimalQuant, err := decimal.NewFromString(rawAmount)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRX][%s] parse amount failed on tx #%d: %v", address, i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
amount := math.MustParsePrecFloat64(decimalQuant.Div(decimal.New(1, int32(trxDecimals))).InexactFloat64(), 2)
|
|
||||||
if trxCfg.MinAmount > 0 && amount < trxCfg.MinAmount {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if amount <= 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
txID := transfer.Get("txID").String()
|
|
||||||
tradeID, err := data.GetTradeIdByWalletAddressAndAmountAndToken(mdb.NetworkTron, address, strings.ToUpper(strings.TrimSpace(trxCfg.Symbol)), amount)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRX][%s] lookup trade_id failed hash=%s err=%v", address, txID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if tradeID == "" {
|
|
||||||
log.Sugar.Debugf("[TRX][%s] skip unmatched tx hash=%s amount=%.2f", address, txID, amount)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Sugar.Infof("[TRX][%s] matched trade_id=%s hash=%s amount=%.2f", address, tradeID, txID, amount)
|
|
||||||
|
|
||||||
order, err := data.GetOrderInfoByTradeId(tradeID)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRX][%s] get order failed trade_id=%s err=%v", address, tradeID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
blockTimestamp := transfer.Get("block_timestamp").Int()
|
|
||||||
createTime := order.CreatedAt.TimestampMilli()
|
|
||||||
if blockTimestamp < createTime {
|
|
||||||
log.Sugar.Warnf("[TRX][%s] skip tx %s because block time %d is before order create time %d", address, txID, blockTimestamp, createTime)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
req := &request.OrderProcessingRequest{
|
|
||||||
ReceiveAddress: address,
|
|
||||||
Token: strings.ToUpper(strings.TrimSpace(trxCfg.Symbol)),
|
|
||||||
Network: mdb.NetworkTron,
|
|
||||||
TradeId: tradeID,
|
|
||||||
Amount: amount,
|
|
||||||
BlockTransactionId: txID,
|
|
||||||
}
|
|
||||||
err = OrderProcessing(req)
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, constant.OrderBlockAlreadyProcess) || errors.Is(err, constant.OrderStatusConflict) {
|
|
||||||
log.Sugar.Infof("[TRX][%s] skip resolved transfer trade_id=%s hash=%s err=%v", address, tradeID, txID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Sugar.Errorf("[TRX][%s] order processing failed trade_id=%s hash=%s err=%v", address, tradeID, txID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
sendPaymentNotification(order)
|
|
||||||
log.Sugar.Infof("[TRX][%s] payment processed trade_id=%s hash=%s", address, tradeID, txID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkTrc20Transfers(address string, wg *sync.WaitGroup) {
|
|
||||||
defer wg.Done()
|
|
||||||
|
|
||||||
// Build contract -> token map for the TRON network. If nothing is
|
|
||||||
// configured, skip — preserves the previous behavior of only watching
|
|
||||||
// admin-approved tokens.
|
|
||||||
tokens, err := data.ListEnabledChainTokensByNetwork(mdb.NetworkTron)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] load chain_tokens err=%v", address, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(tokens) == 0 {
|
|
||||||
log.Sugar.Debugf("[TRC20][%s] no enabled chain_tokens, skipping", address)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
contractTokens := make(map[string]*mdb.ChainToken, len(tokens))
|
|
||||||
for i := range tokens {
|
|
||||||
c := strings.TrimSpace(tokens[i].ContractAddress)
|
|
||||||
if c == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
contractTokens[c] = &tokens[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
client := http_client.GetHttpClient()
|
|
||||||
startTime := carbon.Now().AddHours(-24).TimestampMilli()
|
|
||||||
endTime := carbon.Now().TimestampMilli()
|
|
||||||
tronBaseURL, tronAPIKey, err := resolveTronNode()
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] resolve rpc_nodes err=%v", address, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
url := fmt.Sprintf("%s/v1/accounts/%s/transactions/trc20", tronBaseURL, address)
|
|
||||||
|
|
||||||
resp, err := client.R().SetQueryParams(map[string]string{
|
|
||||||
"order_by": "block_timestamp,desc",
|
|
||||||
"limit": "100",
|
|
||||||
"only_to": "true",
|
|
||||||
"min_timestamp": stdutil.ToString(startTime),
|
|
||||||
"max_timestamp": stdutil.ToString(endTime),
|
|
||||||
}).SetHeader("TRON-PRO-API-KEY", tronAPIKey).Get(url)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] HTTP request failed: %v", address, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if resp.StatusCode() != http.StatusOK {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] API returned status %d", address, resp.StatusCode())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
success := gjson.GetBytes(resp.Body(), "success").Bool()
|
|
||||||
if !success {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] API response indicates failure", address)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
transfers := gjson.GetBytes(resp.Body(), "data").Array()
|
|
||||||
if len(transfers) == 0 {
|
|
||||||
log.Sugar.Debugf("[TRC20][%s] no transfer records found", address)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Sugar.Debugf("[TRC20][%s] fetched %d transfer records", address, len(transfers))
|
|
||||||
|
|
||||||
for i, transfer := range transfers {
|
|
||||||
contractAddr := transfer.Get("token_info.address").String()
|
|
||||||
cfg, ok := contractTokens[contractAddr]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if transfer.Get("to").String() != address {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
tokenSym := strings.ToUpper(strings.TrimSpace(cfg.Symbol))
|
|
||||||
|
|
||||||
valueStr := transfer.Get("value").String()
|
|
||||||
decimalQuant, err := decimal.NewFromString(valueStr)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] parse value failed on tx #%d: %v", address, i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
tokenDecimals := transfer.Get("token_info.decimals").Int()
|
|
||||||
if tokenDecimals <= 0 {
|
|
||||||
tokenDecimals = int64(cfg.Decimals)
|
|
||||||
}
|
|
||||||
amount := math.MustParsePrecFloat64(decimalQuant.Div(decimal.New(1, int32(tokenDecimals))).InexactFloat64(), 2)
|
|
||||||
if cfg.MinAmount > 0 && amount < cfg.MinAmount {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if amount <= 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
txID := transfer.Get("transaction_id").String()
|
|
||||||
tradeID, err := data.GetTradeIdByWalletAddressAndAmountAndToken(mdb.NetworkTron, address, tokenSym, amount)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] lookup trade_id failed hash=%s err=%v", address, txID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if tradeID == "" {
|
|
||||||
log.Sugar.Debugf("[TRC20][%s] skip unmatched %s tx hash=%s amount=%.2f", address, tokenSym, txID, amount)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Sugar.Infof("[TRC20][%s] matched %s trade_id=%s hash=%s amount=%.2f", address, tokenSym, tradeID, txID, amount)
|
|
||||||
|
|
||||||
order, err := data.GetOrderInfoByTradeId(tradeID)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] get order failed trade_id=%s err=%v", address, tradeID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
blockTimestamp := transfer.Get("block_timestamp").Int()
|
|
||||||
createTime := order.CreatedAt.TimestampMilli()
|
|
||||||
if blockTimestamp < createTime {
|
|
||||||
log.Sugar.Warnf("[TRC20][%s] skip tx %s because block time %d is before order create time %d", address, txID, blockTimestamp, createTime)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
req := &request.OrderProcessingRequest{
|
|
||||||
ReceiveAddress: address,
|
|
||||||
Token: tokenSym,
|
|
||||||
Network: mdb.NetworkTron,
|
|
||||||
TradeId: tradeID,
|
|
||||||
Amount: amount,
|
|
||||||
BlockTransactionId: txID,
|
|
||||||
}
|
|
||||||
err = OrderProcessing(req)
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, constant.OrderBlockAlreadyProcess) || errors.Is(err, constant.OrderStatusConflict) {
|
|
||||||
log.Sugar.Infof("[TRC20][%s] skip resolved transfer trade_id=%s hash=%s err=%v", address, tradeID, txID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Sugar.Errorf("[TRC20][%s] order processing failed trade_id=%s hash=%s err=%v", address, tradeID, txID, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
sendPaymentNotification(order)
|
|
||||||
log.Sugar.Infof("[TRC20][%s] payment processed trade_id=%s hash=%s", address, tradeID, txID)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func evmChainLogLabel(chainNetwork string) string {
|
func evmChainLogLabel(chainNetwork string) string {
|
||||||
@@ -349,9 +171,6 @@ func evmChainLogLabel(chainNetwork string) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TryProcessEvmERC20Transfer 处理各 EVM 链上代币的 Transfer 入账。
|
|
||||||
// 代币识别、符号和 decimals 全部从 chain_tokens 表动态查询 —
|
|
||||||
// 管理后台新增 token 即可立即生效,无需代码改动。
|
|
||||||
func TryProcessEvmERC20Transfer(chainNetwork string, contract common.Address, toAddr common.Address, rawValue *big.Int, txHash string, blockTsMs int64) {
|
func TryProcessEvmERC20Transfer(chainNetwork string, contract common.Address, toAddr common.Address, rawValue *big.Int, txHash string, blockTsMs int64) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
@@ -359,38 +178,67 @@ func TryProcessEvmERC20Transfer(chainNetwork string, contract common.Address, to
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
net := evmChainLogLabel(chainNetwork)
|
var usdt, usdc common.Address
|
||||||
token, err := data.GetEnabledChainTokenByContract(chainNetwork, contract.Hex())
|
var polygonUsdcE common.Address
|
||||||
if err != nil {
|
switch chainNetwork {
|
||||||
log.Sugar.Warnf("[%s-WS] chain_tokens lookup err=%v contract=%s", net, err, contract.Hex())
|
case mdb.NetworkEthereum:
|
||||||
|
usdt = common.HexToAddress("0xdAC17F958D2ee523a2206206994597C13D831ec7")
|
||||||
|
usdc = common.HexToAddress("0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48")
|
||||||
|
case mdb.NetworkBsc:
|
||||||
|
usdt = common.HexToAddress("0x55d398326f99059fF775485246999027B3197955")
|
||||||
|
usdc = common.HexToAddress("0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d")
|
||||||
|
case mdb.NetworkPolygon:
|
||||||
|
usdt = common.HexToAddress("0xc2132D05D31c914a87C6611C10748AEb04B58e8F")
|
||||||
|
usdc = common.HexToAddress("0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359")
|
||||||
|
polygonUsdcE = common.HexToAddress("0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174")
|
||||||
|
case mdb.NetworkPlasma:
|
||||||
|
// USDT0(官方),6 decimals;链上暂无与 ETH 同级的 Circle USDC 部署,仅匹配 USDT 订单
|
||||||
|
usdt = common.HexToAddress("0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb")
|
||||||
|
default:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if token == nil || token.ID == 0 {
|
|
||||||
log.Sugar.Debugf("[%s-WS] skip unconfigured contract %s", net, contract.Hex())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
tokenSym := strings.ToUpper(strings.TrimSpace(token.Symbol))
|
|
||||||
if tokenSym == "" {
|
|
||||||
log.Sugar.Warnf("[%s-WS] chain_token id=%d has empty symbol", net, token.ID)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
decimals := token.Decimals
|
|
||||||
if decimals <= 0 {
|
|
||||||
decimals = 6
|
|
||||||
}
|
|
||||||
|
|
||||||
|
var tokenSym string
|
||||||
|
switch {
|
||||||
|
case contract == usdt:
|
||||||
|
tokenSym = "USDT"
|
||||||
|
case contract == usdc || (polygonUsdcE != (common.Address{}) && contract == polygonUsdcE):
|
||||||
|
tokenSym = "USDC"
|
||||||
|
default:
|
||||||
|
net := evmChainLogLabel(chainNetwork)
|
||||||
|
log.Sugar.Warnf("[%s-WS] skip unsupported contract %s", net, contract.Hex())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
net := evmChainLogLabel(chainNetwork)
|
||||||
walletAddr := strings.ToLower(toAddr.Hex())
|
walletAddr := strings.ToLower(toAddr.Hex())
|
||||||
if rawValue == nil || rawValue.Sign() <= 0 {
|
if rawValue == nil || rawValue.Sign() <= 0 {
|
||||||
log.Sugar.Infof("[%s-%s][%s] skip non-positive or nil amount", net, tokenSym, walletAddr)
|
log.Sugar.Infof("[%s-%s][%s] skip non-positive or nil amount", net, tokenSym, walletAddr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
divisor := decimal.New(1, int32(decimals))
|
|
||||||
decimalQuant := decimal.NewFromBigInt(rawValue, 0)
|
chainTokens, err := data.ListChainTokens(chainNetwork)
|
||||||
amount := math.MustParsePrecFloat64(decimalQuant.Div(divisor).InexactFloat64(), 2)
|
if err != nil {
|
||||||
if token.MinAmount > 0 && amount < token.MinAmount {
|
log.Sugar.Warnf("[%s-%s] load chain tokens: %v", net, tokenSym, err)
|
||||||
log.Sugar.Debugf("[%s-%s][%s] skip amount %.2f below min_amount %.2f", net, tokenSym, walletAddr, amount, token.MinAmount)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
var tokenConfig *mdb.ChainToken
|
||||||
|
for _, t := range chainTokens {
|
||||||
|
if strings.EqualFold(t.Symbol, tokenSym) {
|
||||||
|
tokenConfig = &t
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if tokenConfig == nil || !tokenConfig.Enabled {
|
||||||
|
log.Sugar.Warnf("[%s-%s] token not enabled or configured in chain_tokens", net, tokenSym)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
pow := decimal.New(1, int32(tokenConfig.Decimals))
|
||||||
|
log.Sugar.Warnf("tokenConfig.Decimals %d pow %s", tokenConfig.Decimals, pow.String())
|
||||||
|
|
||||||
|
decimalQuant := decimal.NewFromBigInt(rawValue, 0)
|
||||||
|
amount := math.MustParsePrecFloat64(decimalQuant.Div(pow).InexactFloat64(), 2)
|
||||||
if amount <= 0 {
|
if amount <= 0 {
|
||||||
log.Sugar.Warnf("[%s-%s][%s] skip non-positive amount %.2f", net, tokenSym, walletAddr, amount)
|
log.Sugar.Warnf("[%s-%s][%s] skip non-positive amount %.2f", net, tokenSym, walletAddr, amount)
|
||||||
return
|
return
|
||||||
@@ -421,11 +269,6 @@ func TryProcessEvmERC20Transfer(chainNetwork string, contract common.Address, to
|
|||||||
log.Sugar.Warnf("[%s-%s][%s] skip trade_id=%s token mismatch order=%s", net, tokenSym, walletAddr, tradeID, order.Token)
|
log.Sugar.Warnf("[%s-%s][%s] skip trade_id=%s token mismatch order=%s", net, tokenSym, walletAddr, tradeID, order.Token)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if blockTsMs > 0 && blockTsMs < order.CreatedAt.TimestampMilli() {
|
|
||||||
log.Sugar.Warnf("[%s-%s][%s] skip tx %s because block_time_ms=%d is before order created_ms=%d",
|
|
||||||
net, tokenSym, walletAddr, txHash, blockTsMs, order.CreatedAt.TimestampMilli())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
req := &request.OrderProcessingRequest{
|
req := &request.OrderProcessingRequest{
|
||||||
ReceiveAddress: walletAddr,
|
ReceiveAddress: walletAddr,
|
||||||
@@ -450,6 +293,18 @@ func TryProcessEvmERC20Transfer(chainNetwork string, contract common.Address, to
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sendPaymentNotification(order *mdb.Orders) {
|
func sendPaymentNotification(order *mdb.Orders) {
|
||||||
|
if order == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if strings.TrimSpace(order.TradeId) != "" {
|
||||||
|
latest, err := data.GetOrderInfoByTradeId(order.TradeId)
|
||||||
|
if err != nil {
|
||||||
|
log.Sugar.Warnf("[notify] reload order failed trade_id=%s err=%v", order.TradeId, err)
|
||||||
|
} else if latest != nil && latest.TradeId != "" {
|
||||||
|
order = latest
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
msg := fmt.Sprintf(
|
msg := fmt.Sprintf(
|
||||||
"🎉 <b>收款成功通知</b>\n\n"+
|
"🎉 <b>收款成功通知</b>\n\n"+
|
||||||
"💰 <b>金额信息</b>\n"+
|
"💰 <b>金额信息</b>\n"+
|
||||||
@@ -472,7 +327,7 @@ func sendPaymentNotification(order *mdb.Orders) {
|
|||||||
networkDisplay(order.Network),
|
networkDisplay(order.Network),
|
||||||
order.ReceiveAddress,
|
order.ReceiveAddress,
|
||||||
order.CreatedAt.ToDateTimeString(),
|
order.CreatedAt.ToDateTimeString(),
|
||||||
carbon.Now().ToDateTimeString(),
|
order.UpdatedAt.ToDateTimeString(),
|
||||||
)
|
)
|
||||||
notify.Dispatch(mdb.NotifyEventPaySuccess, msg)
|
notify.Dispatch(mdb.NotifyEventPaySuccess, msg)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/internal/testutil"
|
||||||
|
"github.com/GMWalletApp/epusdt/model/dao"
|
||||||
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
|
"github.com/GMWalletApp/epusdt/notify"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSendPaymentNotificationUsesLatestOrderUpdatedAt(t *testing.T) {
|
||||||
|
cleanup := testutil.SetupTestDatabases(t)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
const channelType = "test-pay-success-time"
|
||||||
|
got := make(chan string, 1)
|
||||||
|
notify.RegisterSender(channelType, func(config, text string) error {
|
||||||
|
got <- text
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err := dao.Mdb.Create(&mdb.NotificationChannel{
|
||||||
|
Type: channelType,
|
||||||
|
Name: "test",
|
||||||
|
Config: "{}",
|
||||||
|
Events: `{"pay_success":true}`,
|
||||||
|
Enabled: true,
|
||||||
|
}).Error; err != nil {
|
||||||
|
t.Fatalf("seed notification channel: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
order := &mdb.Orders{
|
||||||
|
TradeId: "T202604270001",
|
||||||
|
OrderId: "ORD202604270001",
|
||||||
|
Amount: 100,
|
||||||
|
Currency: "cny",
|
||||||
|
ActualAmount: 14.28,
|
||||||
|
Token: "USDT",
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
ReceiveAddress: "TTestAddress",
|
||||||
|
Status: mdb.StatusWaitPay,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(order).Error; err != nil {
|
||||||
|
t.Fatalf("seed order: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
const createdAt = "2026-04-27 09:00:00"
|
||||||
|
const staleUpdatedAt = "2026-04-27 09:01:00"
|
||||||
|
const paidAt = "2026-04-27 10:20:30"
|
||||||
|
if err := dao.Mdb.Exec("UPDATE orders SET created_at = ?, updated_at = ? WHERE trade_id = ?", createdAt, staleUpdatedAt, order.TradeId).Error; err != nil {
|
||||||
|
t.Fatalf("set initial timestamps: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var staleOrderModel mdb.Orders
|
||||||
|
if err := dao.Mdb.Where("trade_id = ?", order.TradeId).Take(&staleOrderModel).Error; err != nil {
|
||||||
|
t.Fatalf("load stale order: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := dao.Mdb.Exec("UPDATE orders SET status = ?, updated_at = ? WHERE trade_id = ?", mdb.StatusPaySuccess, paidAt, order.TradeId).Error; err != nil {
|
||||||
|
t.Fatalf("set paid timestamp: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sendPaymentNotification(&staleOrderModel)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case text := <-got:
|
||||||
|
if !strings.Contains(text, "支付时间:"+paidAt) {
|
||||||
|
t.Fatalf("notification payment time = %q, want %s", text, paidAt)
|
||||||
|
}
|
||||||
|
if strings.Contains(text, "支付时间:"+staleUpdatedAt) {
|
||||||
|
t.Fatalf("notification used stale payment time: %q", text)
|
||||||
|
}
|
||||||
|
case <-time.After(2 * time.Second):
|
||||||
|
t.Fatal("timed out waiting for notification")
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -22,7 +22,7 @@ import (
|
|||||||
|
|
||||||
// RegisterRoute 路由注册
|
// RegisterRoute 路由注册
|
||||||
func RegisterRoute(e *echo.Echo) {
|
func RegisterRoute(e *echo.Echo) {
|
||||||
e.Any("/", func(c echo.Context) error {
|
e.POST("/", func(c echo.Context) error {
|
||||||
return c.String(http.StatusOK, "hello epusdt, https://github.com/GMwalletApp/epusdt")
|
return c.String(http.StatusOK, "hello epusdt, https://github.com/GMwalletApp/epusdt")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/config"
|
||||||
"github.com/GMWalletApp/epusdt/model/dao"
|
"github.com/GMWalletApp/epusdt/model/dao"
|
||||||
"github.com/GMWalletApp/epusdt/model/data"
|
"github.com/GMWalletApp/epusdt/model/data"
|
||||||
"github.com/GMWalletApp/epusdt/model/mdb"
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
@@ -33,7 +34,6 @@ func setupTestEnv(t *testing.T) *echo.Echo {
|
|||||||
viper.Set("app_uri", "http://localhost:8080")
|
viper.Set("app_uri", "http://localhost:8080")
|
||||||
viper.Set("order_expiration_time", 10)
|
viper.Set("order_expiration_time", 10)
|
||||||
viper.Set("api_rate_url", "")
|
viper.Set("api_rate_url", "")
|
||||||
viper.Set("forced_usdt_rate", 7.0)
|
|
||||||
viper.Set("runtime_root_path", tmpDir)
|
viper.Set("runtime_root_path", tmpDir)
|
||||||
viper.Set("log_save_path", tmpDir)
|
viper.Set("log_save_path", tmpDir)
|
||||||
viper.Set("sqlite_database_filename", tmpDir+"/test.db")
|
viper.Set("sqlite_database_filename", tmpDir+"/test.db")
|
||||||
@@ -68,6 +68,15 @@ func setupTestEnv(t *testing.T) *echo.Echo {
|
|||||||
|
|
||||||
// reset the settings cache so stale entries from a prior test don't leak
|
// reset the settings cache so stale entries from a prior test don't leak
|
||||||
_ = data.ReloadSettings()
|
_ = data.ReloadSettings()
|
||||||
|
config.SettingsGetString = func(key string) string {
|
||||||
|
return data.GetSettingString(key, "")
|
||||||
|
}
|
||||||
|
t.Cleanup(func() {
|
||||||
|
config.SettingsGetString = nil
|
||||||
|
})
|
||||||
|
if err := data.SetSetting("rate", "rate.forced_usdt_rate", "7.0", "string"); err != nil {
|
||||||
|
t.Fatalf("seed rate.forced_usdt_rate: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// seed wallet addresses
|
// seed wallet addresses
|
||||||
dao.Mdb.Create(&mdb.WalletAddress{Network: mdb.NetworkTron, Address: "TTestTronAddress001", Status: mdb.TokenStatusEnable})
|
dao.Mdb.Create(&mdb.WalletAddress{Network: mdb.NetworkTron, Address: "TTestTronAddress001", Status: mdb.TokenStatusEnable})
|
||||||
@@ -158,6 +167,21 @@ func doFormPost(e *echo.Echo, path string, values url.Values) *httptest.Response
|
|||||||
return rec
|
return rec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRootPostRoute(t *testing.T) {
|
||||||
|
e := setupTestEnv(t)
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodPost, "/", nil)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("expected 200, got %d", rec.Code)
|
||||||
|
}
|
||||||
|
if body := rec.Body.String(); body != "hello epusdt, https://github.com/GMwalletApp/epusdt" {
|
||||||
|
t.Fatalf("unexpected body: %q", body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestCreateOrderGmpayV1Solana tests the gmpay route with solana network.
|
// TestCreateOrderGmpayV1Solana tests the gmpay route with solana network.
|
||||||
func TestCreateOrderGmpayV1Solana(t *testing.T) {
|
func TestCreateOrderGmpayV1Solana(t *testing.T) {
|
||||||
e := setupTestEnv(t)
|
e := setupTestEnv(t)
|
||||||
|
|||||||
+4
-8
@@ -13,24 +13,19 @@ func Start() {
|
|||||||
go StartBscWebSocketListener()
|
go StartBscWebSocketListener()
|
||||||
go StartPolygonWebSocketListener()
|
go StartPolygonWebSocketListener()
|
||||||
go StartPlasmaWebSocketListener()
|
go StartPlasmaWebSocketListener()
|
||||||
|
go StartTronBlockScannerListener()
|
||||||
|
|
||||||
c := cron.New()
|
c := cron.New()
|
||||||
// TRC20 polling
|
|
||||||
_, err := c.AddJob("@every 5s", ListenTrc20Job{})
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[task] Failed to add ListenTrc20Job: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Sugar.Info("[task] ListenTrc20Job scheduled successfully (@every 5s)")
|
|
||||||
// Solana polling
|
// Solana polling
|
||||||
_, err = c.AddJob("@every 5s", ListenSolJob{})
|
_, err := c.AddJob("@every 5s", ListenSolJob{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Sugar.Errorf("[task] Failed to add ListenSolJob: %v", err)
|
log.Sugar.Errorf("[task] Failed to add ListenSolJob: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Sugar.Info("[task] ListenSolJob scheduled successfully (@every 5s)")
|
log.Sugar.Info("[task] ListenSolJob scheduled successfully (@every 5s)")
|
||||||
|
|
||||||
// RPC node health checks
|
// RPC node health checks
|
||||||
_, err = c.AddJob("@every 30s", RpcHealthJob{})
|
_, err = c.AddJob("@every 30s", RpcHealthJob{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -38,6 +33,7 @@ func Start() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Sugar.Info("[task] RpcHealthJob scheduled successfully (@every 30s)")
|
log.Sugar.Info("[task] RpcHealthJob scheduled successfully (@every 30s)")
|
||||||
|
|
||||||
c.Start()
|
c.Start()
|
||||||
log.Sugar.Info("[task] Task scheduler started")
|
log.Sugar.Info("[task] Task scheduler started")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,378 @@
|
|||||||
|
package task
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math/big"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
tron "github.com/GMWalletApp/epusdt/crypto"
|
||||||
|
"github.com/GMWalletApp/epusdt/model/service"
|
||||||
|
"github.com/GMWalletApp/epusdt/util/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// USDT 合约地址 (TRC20 主网)
|
||||||
|
USDTContractHex = "41a614f803b6fd780986a42c78ec9c7f77e6ded13c" // Base58: TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
|
||||||
|
// transfer(address,uint256) 方法签名前4字节
|
||||||
|
TransferMethodID = "a9059cbb"
|
||||||
|
|
||||||
|
PollInterval = 3 * time.Second
|
||||||
|
RequestTimeout = 10 * time.Second
|
||||||
|
)
|
||||||
|
|
||||||
|
func HexToTronAddress(hexAddr string) (string, error) {
|
||||||
|
hexAddr = strings.TrimPrefix(hexAddr, "0x")
|
||||||
|
hexAddr = strings.TrimPrefix(hexAddr, "0X")
|
||||||
|
|
||||||
|
raw, err := hex.DecodeString(hexAddr)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保有 0x41 前缀(TRON 主网地址前缀)
|
||||||
|
if len(raw) == 20 {
|
||||||
|
raw = append([]byte{0x41}, raw...)
|
||||||
|
}
|
||||||
|
if len(raw) != 21 {
|
||||||
|
return "", fmt.Errorf("地址长度非法: %d bytes", len(raw))
|
||||||
|
}
|
||||||
|
|
||||||
|
return tron.EncodeCheck(raw), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type BlockHeader struct {
|
||||||
|
RawData struct {
|
||||||
|
Number int64 `json:"number"`
|
||||||
|
Timestamp int64 `json:"timestamp"`
|
||||||
|
WitnessAddress string `json:"witness_address"`
|
||||||
|
ParentHash string `json:"parentHash"`
|
||||||
|
Version int `json:"version"`
|
||||||
|
} `json:"raw_data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TriggerSmartContractValue struct {
|
||||||
|
OwnerAddress string `json:"owner_address"`
|
||||||
|
ContractAddress string `json:"contract_address"`
|
||||||
|
Data string `json:"data"`
|
||||||
|
CallValue int64 `json:"call_value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ContractParam struct {
|
||||||
|
TypeURL string `json:"type_url"`
|
||||||
|
Value json.RawMessage `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Transaction struct {
|
||||||
|
TxID string `json:"txID"`
|
||||||
|
RawData struct {
|
||||||
|
Contract []struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Parameter ContractParam `json:"parameter"`
|
||||||
|
} `json:"contract"`
|
||||||
|
Timestamp int64 `json:"timestamp"`
|
||||||
|
FeeLimit int64 `json:"fee_limit"`
|
||||||
|
} `json:"raw_data"`
|
||||||
|
Ret []struct {
|
||||||
|
ContractRet string `json:"contractRet"`
|
||||||
|
} `json:"ret"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Block struct {
|
||||||
|
BlockID string `json:"blockID"`
|
||||||
|
BlockHeader BlockHeader `json:"block_header"`
|
||||||
|
Transactions []Transaction `json:"transactions"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type USDTTransfer struct {
|
||||||
|
TxID string
|
||||||
|
From string
|
||||||
|
To string
|
||||||
|
Raw *big.Int // 原始数值(6 decimals)
|
||||||
|
Status string
|
||||||
|
}
|
||||||
|
|
||||||
|
type TRXTransfer struct {
|
||||||
|
TxID string
|
||||||
|
From string
|
||||||
|
To string
|
||||||
|
RawSun int64 // 单位: SUN
|
||||||
|
Status string
|
||||||
|
}
|
||||||
|
|
||||||
|
type TransferContractValue struct {
|
||||||
|
OwnerAddress string `json:"owner_address"`
|
||||||
|
ToAddress string `json:"to_address"`
|
||||||
|
Amount int64 `json:"amount"` // 单位: SUN
|
||||||
|
}
|
||||||
|
|
||||||
|
var httpClient = &http.Client{Timeout: RequestTimeout}
|
||||||
|
|
||||||
|
func doPost(url string, apiKey string, body interface{}) ([]byte, error) {
|
||||||
|
data, _ := json.Marshal(body)
|
||||||
|
req, err := http.NewRequest("POST", url, bytes.NewReader(data))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
if apiKey = strings.TrimSpace(apiKey); apiKey != "" {
|
||||||
|
req.Header.Set("TRON-PRO-API-KEY", apiKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := httpClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
b, _ := io.ReadAll(resp.Body)
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(b))
|
||||||
|
}
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetNowBlock(baseURL string, apiKey string) (*Block, error) {
|
||||||
|
b, err := doPost(baseURL+"/wallet/getnowblock", apiKey, map[string]interface{}{})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var block Block
|
||||||
|
return &block, json.Unmarshal(b, &block)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBlockByNum(baseURL string, apiKey string, num int64) (*Block, error) {
|
||||||
|
b, err := doPost(baseURL+"/wallet/getblockbynum", apiKey, map[string]interface{}{"num": num})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var block Block
|
||||||
|
return &block, json.Unmarshal(b, &block)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseUSDTTransfer(tx Transaction) *USDTTransfer {
|
||||||
|
if len(tx.RawData.Contract) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
c := tx.RawData.Contract[0]
|
||||||
|
if c.Type != "TriggerSmartContract" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var val TriggerSmartContractValue
|
||||||
|
if err := json.Unmarshal(c.Parameter.Value, &val); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否是 USDT 合约
|
||||||
|
contractHex := strings.ToLower(strings.TrimPrefix(val.ContractAddress, "0x"))
|
||||||
|
if contractHex != USDTContractHex {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析 data 字段
|
||||||
|
// 格式: [4字节方法ID][32字节 to 地址][32字节 amount]
|
||||||
|
data := strings.TrimPrefix(strings.ToLower(val.Data), "0x")
|
||||||
|
if len(data) < 8+64+64 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if data[:8] != TransferMethodID {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// to 地址:后 40 个十六进制字符(20 字节)
|
||||||
|
toHex := data[8+24 : 8+64] // 跳过前12字节填充,取后20字节
|
||||||
|
toAddr, err := HexToTronAddress(toHex)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// amount:后 32 字节大整数
|
||||||
|
amountHex := data[8+64 : 8+64+64]
|
||||||
|
amountBytes, err := hex.DecodeString(amountHex)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
amountBig := new(big.Int).SetBytes(amountBytes)
|
||||||
|
|
||||||
|
// from 地址
|
||||||
|
fromAddr, err := HexToTronAddress(val.OwnerAddress)
|
||||||
|
if err != nil {
|
||||||
|
fromAddr = val.OwnerAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
// 交易状态
|
||||||
|
status := "SUCCESS"
|
||||||
|
if len(tx.Ret) > 0 && tx.Ret[0].ContractRet != "" && tx.Ret[0].ContractRet != "SUCCESS" {
|
||||||
|
status = tx.Ret[0].ContractRet
|
||||||
|
}
|
||||||
|
|
||||||
|
return &USDTTransfer{
|
||||||
|
TxID: tx.TxID,
|
||||||
|
From: fromAddr,
|
||||||
|
To: toAddr,
|
||||||
|
Raw: amountBig,
|
||||||
|
Status: status,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseTRXTransfer(tx Transaction) *TRXTransfer {
|
||||||
|
if len(tx.RawData.Contract) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
c := tx.RawData.Contract[0]
|
||||||
|
if c.Type != "TransferContract" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var val TransferContractValue
|
||||||
|
if err := json.Unmarshal(c.Parameter.Value, &val); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if val.Amount <= 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
fromAddr, err := HexToTronAddress(val.OwnerAddress)
|
||||||
|
if err != nil {
|
||||||
|
fromAddr = val.OwnerAddress
|
||||||
|
}
|
||||||
|
toAddr, err := HexToTronAddress(val.ToAddress)
|
||||||
|
if err != nil {
|
||||||
|
toAddr = val.ToAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
status := "SUCCESS"
|
||||||
|
if len(tx.Ret) > 0 && tx.Ret[0].ContractRet != "" && tx.Ret[0].ContractRet != "SUCCESS" {
|
||||||
|
status = tx.Ret[0].ContractRet
|
||||||
|
}
|
||||||
|
|
||||||
|
return &TRXTransfer{
|
||||||
|
TxID: tx.TxID,
|
||||||
|
From: fromAddr,
|
||||||
|
To: toAddr,
|
||||||
|
RawSun: val.Amount,
|
||||||
|
Status: status,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func processBlock(block *Block) {
|
||||||
|
blockTsMs := block.BlockHeader.RawData.Timestamp
|
||||||
|
for _, tx := range block.Transactions {
|
||||||
|
if t := parseUSDTTransfer(tx); t != nil {
|
||||||
|
if t.Status != "SUCCESS" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
service.TryProcessTronTRC20Transfer(t.To, t.Raw, t.TxID, blockTsMs)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if t := parseTRXTransfer(tx); t != nil {
|
||||||
|
if t.Status != "SUCCESS" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
service.TryProcessTronTRXTransfer(t.To, t.RawSun, t.TxID, blockTsMs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Scanner struct {
|
||||||
|
baseURL string
|
||||||
|
apiKey string
|
||||||
|
lastBlock int64
|
||||||
|
// 统计
|
||||||
|
totalBlocks int64
|
||||||
|
totalUSDTTxs int64
|
||||||
|
totalTRXTxs int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewScanner() *Scanner {
|
||||||
|
return &Scanner{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Scanner) Init() error {
|
||||||
|
baseURL, apiKey, err := service.ResolveTronNode()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("resolve tron node: %w", err)
|
||||||
|
}
|
||||||
|
s.baseURL = baseURL
|
||||||
|
s.apiKey = apiKey
|
||||||
|
|
||||||
|
log.Sugar.Infof("[TRON-BLOCK] node=%s", s.baseURL)
|
||||||
|
block, err := GetNowBlock(s.baseURL, s.apiKey)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("获取初始块失败: %w", err)
|
||||||
|
}
|
||||||
|
s.lastBlock = block.BlockHeader.RawData.Number
|
||||||
|
log.Sugar.Infof("[TRON-BLOCK] start block=%d", s.lastBlock)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Scanner) Run() {
|
||||||
|
log.Sugar.Info("[TRON-BLOCK] start scanning (USDT TRC20 + TRX)")
|
||||||
|
ticker := time.NewTicker(PollInterval)
|
||||||
|
defer ticker.Stop()
|
||||||
|
|
||||||
|
statTicker := time.NewTicker(60 * time.Second)
|
||||||
|
defer statTicker.Stop()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-statTicker.C:
|
||||||
|
log.Sugar.Infof("[TRON-BLOCK] stats blocks=%d usdt=%d trx=%d", s.totalBlocks, s.totalUSDTTxs, s.totalTRXTxs)
|
||||||
|
case <-ticker.C:
|
||||||
|
s.poll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Scanner) poll() {
|
||||||
|
latest, err := GetNowBlock(s.baseURL, s.apiKey)
|
||||||
|
if err != nil {
|
||||||
|
log.Sugar.Warnf("[TRON-BLOCK] get latest block: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
latestNum := latest.BlockHeader.RawData.Number
|
||||||
|
if latestNum <= s.lastBlock {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for num := s.lastBlock + 1; num <= latestNum; num++ {
|
||||||
|
var block *Block
|
||||||
|
if num == latestNum {
|
||||||
|
block = latest
|
||||||
|
} else {
|
||||||
|
block, err = GetBlockByNum(s.baseURL, s.apiKey, num)
|
||||||
|
if err != nil {
|
||||||
|
log.Sugar.Warnf("[TRON-BLOCK] get block %d: %v", num, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
}
|
||||||
|
processBlock(block)
|
||||||
|
s.lastBlock = num
|
||||||
|
s.totalBlocks++
|
||||||
|
|
||||||
|
for _, tx := range block.Transactions {
|
||||||
|
if parseUSDTTransfer(tx) != nil {
|
||||||
|
s.totalUSDTTxs++
|
||||||
|
} else if parseTRXTransfer(tx) != nil {
|
||||||
|
s.totalTRXTxs++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func StartTronBlockScannerListener() {
|
||||||
|
scanner := NewScanner()
|
||||||
|
if err := scanner.Init(); err != nil {
|
||||||
|
log.Sugar.Errorf("[TRON-BLOCK] init: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
scanner.Run()
|
||||||
|
}
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
package task
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/GMWalletApp/epusdt/model/data"
|
|
||||||
"github.com/GMWalletApp/epusdt/model/mdb"
|
|
||||||
"github.com/GMWalletApp/epusdt/model/service"
|
|
||||||
"github.com/GMWalletApp/epusdt/util/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ListenTrc20Job struct{}
|
|
||||||
|
|
||||||
var gListenTrc20JobLock sync.Mutex
|
|
||||||
|
|
||||||
func (r ListenTrc20Job) Run() {
|
|
||||||
gListenTrc20JobLock.Lock()
|
|
||||||
defer gListenTrc20JobLock.Unlock()
|
|
||||||
log.Sugar.Debug("[ListenTrc20Job] Job triggered")
|
|
||||||
if !data.IsChainEnabled(mdb.NetworkTron) {
|
|
||||||
log.Sugar.Debug("[ListenTrc20Job] chain disabled, skipping")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
walletAddress, err := data.GetAvailableWalletAddressByNetwork(mdb.NetworkTron)
|
|
||||||
if err != nil {
|
|
||||||
log.Sugar.Errorf("[ListenTrc20Job] Failed to get wallet addresses: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(walletAddress) <= 0 {
|
|
||||||
log.Sugar.Debug("[ListenTrc20Job] No available wallet addresses")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Sugar.Infof("[ListenTrc20Job] Found %d wallet addresses to monitor", len(walletAddress))
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
for _, address := range walletAddress {
|
|
||||||
log.Sugar.Infof("[ListenTrc20Job] Listening to address: %s", address.Address)
|
|
||||||
|
|
||||||
wg.Add(1)
|
|
||||||
go service.Trc20CallBack(address.Address, &wg)
|
|
||||||
}
|
|
||||||
wg.Wait()
|
|
||||||
log.Sugar.Debug("[ListenTrc20Job] Job completed")
|
|
||||||
}
|
|
||||||
@@ -6,9 +6,12 @@ import (
|
|||||||
"github.com/go-resty/resty/v2"
|
"github.com/go-resty/resty/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ClientFactory is overridden in tests to stub outbound HTTP calls.
|
||||||
|
var ClientFactory = resty.New
|
||||||
|
|
||||||
// GetHttpClient 获取请求客户端
|
// GetHttpClient 获取请求客户端
|
||||||
func GetHttpClient(proxys ...string) *resty.Client {
|
func GetHttpClient(proxys ...string) *resty.Client {
|
||||||
client := resty.New()
|
client := ClientFactory()
|
||||||
// 如果有代理
|
// 如果有代理
|
||||||
if len(proxys) > 0 {
|
if len(proxys) > 0 {
|
||||||
proxy := proxys[0]
|
proxy := proxys[0]
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./unauthorized-error-BlVgwebo.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./unauthorized-error-9CwofmD6.js";var t=e;export{t as component};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./forbidden-B-WSRpe6.js";var t=e;export{t as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./forbidden-C7g3z0HN.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./not-found-error-mxpXcTRa.js";var t=e;export{t as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./not-found-error-BKAx_mEr.js";var t=e;export{t as component};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./general-error-CAIDyDhH.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./general-error-ruXTchhS.js";var t=e;export{t as component};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./maintenance-error-yQ4OJvXf.js";var t=e;export{t as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./maintenance-error-vtpJpThI.js";var t=e;export{t as component};
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";import{o as r,s as i,t as a}from"./useRouter-DbizRCmt.js";import{t as o}from"./useStore-8Xlx4tji.js";import{f as s}from"./ClientOnly-BerhZEDB.js";import"./redirect-dE0wk0WH.js";import{a as c,i as l,r as u,s as d,t as f}from"./Match-DWfHsy4k.js";import{n as p}from"./matchContext-DOaBJYLs.js";import{t as m}from"./atom-DI1Bn-1s.js";function h(e){if(typeof document<`u`&&document.querySelector){let t=e.stores.location.get(),n=t.state.__hashScrollIntoViewOptions??!0;if(n&&t.hash!==``){let e=document.getElementById(t.hash);e&&e.scrollIntoView(n)}}}var g=n(e(),1);function _(){let e=a(),t=g.useRef({router:e,mounted:!1}),[n,c]=g.useState(!1),l=o(e.stores.isLoading,e=>e),u=o(e.stores.hasPending,e=>e),f=i(l),p=l||n||u,_=i(p),v=l||u,y=i(v);return e.startTransition=e=>{c(!0),g.startTransition(()=>{e(),c(!1)})},g.useEffect(()=>{let t=e.history.subscribe(e.load),n=e.buildLocation({to:e.latestLocation.pathname,search:!0,params:!0,hash:!0,state:!0,_includeValidateSearch:!0});return s(e.latestLocation.publicHref)!==s(n.publicHref)&&e.commitLocation({...n,replace:!0}),()=>{t()}},[e,e.history]),r(()=>{typeof window<`u`&&e.ssr||t.current.router===e&&t.current.mounted||(t.current={router:e,mounted:!0},(async()=>{try{await e.load()}catch(e){console.error(e)}})())},[e]),r(()=>{f&&!l&&e.emit({type:`onLoad`,...d(e.stores.location.get(),e.stores.resolvedLocation.get())})},[f,e,l]),r(()=>{y&&!v&&e.emit({type:`onBeforeRouteMount`,...d(e.stores.location.get(),e.stores.resolvedLocation.get())})},[v,y,e]),r(()=>{if(_&&!p){let t=d(e.stores.location.get(),e.stores.resolvedLocation.get());e.emit({type:`onResolved`,...t}),m(()=>{e.stores.status.set(`idle`),e.stores.resolvedLocation.set(e.stores.location.get())}),t.hrefChanged&&h(e)}},[p,_,e]),null}var v=t();function y(){let e=a(),t=e.routesById.__root__.options.pendingComponent??e.options.defaultPendingComponent,n=t?(0,v.jsx)(t,{}):null,r=(0,v.jsxs)(typeof document<`u`&&e.ssr?u:g.Suspense,{fallback:n,children:[(0,v.jsx)(_,{}),(0,v.jsx)(b,{})]});return e.options.InnerWrap?(0,v.jsx)(e.options.InnerWrap,{children:r}):r}function b(){let e=a(),t=o(e.stores.firstId,e=>e),n=o(e.stores.loadedAt,e=>e),r=t?(0,v.jsx)(f,{matchId:t}):null;return(0,v.jsx)(p.Provider,{value:t,children:e.options.disableGlobalCatchBoundary?r:(0,v.jsx)(l,{getResetKey:()=>n,errorComponent:c,onCatch:void 0,children:r})})}function x(){let e=a();return o(e.stores.matchRouteDeps,e=>e),g.useCallback(t=>{let{pending:n,caseSensitive:r,fuzzy:i,includeSearch:a,...o}=t;return e.matchRoute(o,{pending:n,caseSensitive:r,fuzzy:i,includeSearch:a})},[e])}export{x as n,y as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";import{o as r,s as i,t as a}from"./useRouter-DS97kuA5.js";import{t as o}from"./useStore-pgHsvR0E.js";import{f as s}from"./ClientOnly-COESZSX_.js";import"./redirect-dE0wk0WH.js";import{a as c,i as l,r as u,s as d,t as f}from"./Match-Bdr6F13c.js";import{n as p}from"./matchContext-BJCpOvLW.js";import{t as m}from"./atom-DI1Bn-1s.js";function h(e){if(typeof document<`u`&&document.querySelector){let t=e.stores.location.get(),n=t.state.__hashScrollIntoViewOptions??!0;if(n&&t.hash!==``){let e=document.getElementById(t.hash);e&&e.scrollIntoView(n)}}}var g=n(e(),1);function _(){let e=a(),t=g.useRef({router:e,mounted:!1}),[n,c]=g.useState(!1),l=o(e.stores.isLoading,e=>e),u=o(e.stores.hasPending,e=>e),f=i(l),p=l||n||u,_=i(p),v=l||u,y=i(v);return e.startTransition=e=>{c(!0),g.startTransition(()=>{e(),c(!1)})},g.useEffect(()=>{let t=e.history.subscribe(e.load),n=e.buildLocation({to:e.latestLocation.pathname,search:!0,params:!0,hash:!0,state:!0,_includeValidateSearch:!0});return s(e.latestLocation.publicHref)!==s(n.publicHref)&&e.commitLocation({...n,replace:!0}),()=>{t()}},[e,e.history]),r(()=>{typeof window<`u`&&e.ssr||t.current.router===e&&t.current.mounted||(t.current={router:e,mounted:!0},(async()=>{try{await e.load()}catch(e){console.error(e)}})())},[e]),r(()=>{f&&!l&&e.emit({type:`onLoad`,...d(e.stores.location.get(),e.stores.resolvedLocation.get())})},[f,e,l]),r(()=>{y&&!v&&e.emit({type:`onBeforeRouteMount`,...d(e.stores.location.get(),e.stores.resolvedLocation.get())})},[v,y,e]),r(()=>{if(_&&!p){let t=d(e.stores.location.get(),e.stores.resolvedLocation.get());e.emit({type:`onResolved`,...t}),m(()=>{e.stores.status.set(`idle`),e.stores.resolvedLocation.set(e.stores.location.get())}),t.hrefChanged&&h(e)}},[p,_,e]),null}var v=t();function y(){let e=a(),t=e.routesById.__root__.options.pendingComponent??e.options.defaultPendingComponent,n=t?(0,v.jsx)(t,{}):null,r=(0,v.jsxs)(typeof document<`u`&&e.ssr?u:g.Suspense,{fallback:n,children:[(0,v.jsx)(_,{}),(0,v.jsx)(b,{})]});return e.options.InnerWrap?(0,v.jsx)(e.options.InnerWrap,{children:r}):r}function b(){let e=a(),t=o(e.stores.firstId,e=>e),n=o(e.stores.loadedAt,e=>e),r=t?(0,v.jsx)(f,{matchId:t}):null;return(0,v.jsx)(p.Provider,{value:t,children:e.options.disableGlobalCatchBoundary?r:(0,v.jsx)(l,{getResetKey:()=>n,errorComponent:c,onCatch:void 0,children:r})})}function x(){let e=a();return o(e.stores.matchRouteDeps,e=>e),g.useCallback(t=>{let{pending:n,caseSensitive:r,fuzzy:i,includeSearch:a,...o}=t;return e.matchRoute(o,{pending:n,caseSensitive:r,fuzzy:i,includeSearch:a})},[e])}export{x as n,y as t};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{Tu as e}from"./messages-xqHXgrWc.js";import{t}from"./_error-C4Q3lqci.js";import{m as n}from"./search-provider-udckA1q-.js";import{n as r,t as i}from"./theme-switch-Bz2aiHbD.js";import{t as a}from"./general-error-CAIDyDhH.js";import{t as o}from"./not-found-error-BKAx_mEr.js";import{t as s}from"./unauthorized-error-BlVgwebo.js";import{t as c}from"./forbidden-C7g3z0HN.js";import{t as l}from"./maintenance-error-vtpJpThI.js";import{n as u,r as d,t as f}from"./header-ChKsBqaX.js";var p=e();function m(){let{error:e}=t.useParams(),m={unauthorized:s,forbidden:c,"not-found":o,"internal-server-error":a,"maintenance-error":l}[e]||o;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(f,{className:`border-b`,fixed:!0,children:[(0,p.jsx)(u,{}),(0,p.jsxs)(`div`,{className:`ms-auto flex items-center space-x-4`,children:[(0,p.jsx)(r,{}),(0,p.jsx)(i,{}),(0,p.jsx)(n,{}),(0,p.jsx)(d,{})]})]}),(0,p.jsx)(`div`,{className:`flex-1 [&>div]:h-full`,children:(0,p.jsx)(m,{})})]})}export{m as component};
|
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_error-BuPuBfMQ.js","assets/messages-xqHXgrWc.js","assets/search-provider-udckA1q-.js","assets/dist-DoGn2h1J.js","assets/confirm-dialog-MtS_UKjk.js","assets/button-BQECWbag.js","assets/dist-ea73EafA.js","assets/dist-BQFlyo06.js","assets/dist-B8TJsLh2.js","assets/dist-CxCGwIT8.js","assets/es2015-DVWRgcTe.js","assets/dist-4j1Lrjyz.js","assets/dist-pzMFqYMR.js","assets/dropdown-menu-DmhEvuLR.js","assets/dist-DPqNmVyq.js","assets/dist-B1wXypYC.js","assets/dist-DQ662yCu.js","assets/createLucideIcon-BjX75ffX.js","assets/check-CkR9hU2c.js","assets/dist-Jii_SG39.js","assets/dist-CeQDKZ9c.js","assets/separator-DnDg5F8J.js","assets/wallet-D2a8vt6s.js","assets/cookies-BkW9sKRD.js","assets/auth-store-Cp1Qr8YS.js","assets/dist-CD4kjzmO.js","assets/with-selector-DHnjcmG4.js","assets/useRouter-DbizRCmt.js","assets/useNavigate-DSiROrTl.js","assets/useStore-8Xlx4tji.js","assets/command-Kxl1kgbj.js","assets/circle-check-CZ7s_UaE.js","assets/input-DBrSAqhD.js","assets/font-provider-hqH5jrNZ.js","assets/theme-provider-CUq7mJXc.js","assets/theme-switch-Bz2aiHbD.js","assets/header-ChKsBqaX.js","assets/link-CKQegE2A.js","assets/ClientOnly-BerhZEDB.js","assets/forbidden-C7g3z0HN.js","assets/general-error-CAIDyDhH.js","assets/maintenance-error-vtpJpThI.js","assets/not-found-error-BKAx_mEr.js","assets/unauthorized-error-BlVgwebo.js"])))=>i.map(i=>d[i]);
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_error-DUUb7pi1.js","assets/messages-BOl-zx8S.js","assets/search-provider-D-fTfilE.js","assets/skeleton-gJOqI-7w.js","assets/button-D-oR8d6w.js","assets/createLucideIcon-DMX28cCu.js","assets/dist-DzENW8NP.js","assets/confirm-dialog-DyK21C4Z.js","assets/dist-C3yOG_Qz.js","assets/dist-BPKZF5GI.js","assets/dist-oydJxq9L.js","assets/dist-DJhZSa1-.js","assets/es2015-DRmlSfkW.js","assets/dist-BZg_Jfik.js","assets/dist-BeVKhAtj.js","assets/dist-CML2zK1G.js","assets/dist-CT2DjA94.js","assets/dist-QGW08nls.js","assets/dist-Bh3bGrZa.js","assets/separator-Dw-mNGCy.js","assets/tooltip-m5xmPGQe.js","assets/dist-Ck6_E5T6.js","assets/auth-store-D_jr_Pei.js","assets/dist-BNiRpK39.js","assets/with-selector-CQzBqoHI.js","assets/cookies-D0aVbsDr.js","assets/useRouter-DS97kuA5.js","assets/useNavigate-BNrwOhV8.js","assets/useStore-pgHsvR0E.js","assets/command-yFHhtFiR.js","assets/circle-check-nos3opMb.js","assets/logo-BVdckS6R.js","assets/shield-check-NJ5V92SM.js","assets/wallet-C1oxpYOh.js","assets/input-CZHXycLK.js","assets/font-provider-BBeIKmOK.js","assets/theme-provider-Dmxgp34D.js","assets/theme-switch-BVGTp-bE.js","assets/dropdown-menu-HbmfecEg.js","assets/check-DH6qIczM.js","assets/header-B5Qx5Y9m.js","assets/link-Du-u9SDI.js","assets/ClientOnly-COESZSX_.js","assets/forbidden-B-WSRpe6.js","assets/general-error-ruXTchhS.js","assets/maintenance-error-yQ4OJvXf.js","assets/not-found-error-mxpXcTRa.js","assets/unauthorized-error-9CwofmD6.js"])))=>i.map(i=>d[i]);
|
||||||
import{Eu as e,ku as t}from"./messages-xqHXgrWc.js";import{r as n}from"./useRouter-DbizRCmt.js";import{d as r}from"./useStore-8Xlx4tji.js";import{n as i}from"./route-CfqHSlRV.js";function a(e){return new o(e,{silent:!0}).createRoute}var o=class{constructor(e,t){this.path=e,this.createRoute=e=>{let t=i(e);return t.isRoot=!1,t},this.silent=t?.silent}},s=t(e(),1);function c(e,t){let i,a,o,c,l=()=>(i||=e().then(e=>{i=void 0,a=e[t??`default`]}).catch(e=>{if(o=e,r(o)&&o instanceof Error&&typeof window<`u`&&typeof sessionStorage<`u`){let e=`tanstack_router_reload:${o.message}`;sessionStorage.getItem(e)||(sessionStorage.setItem(e,`1`),c=!0)}}),i),u=function(e){if(c)throw window.location.reload(),new Promise(()=>{});if(o)throw o;if(!a)if(n)n(l());else throw l();return s.createElement(a,e)};return u.preload=l,u}var l=`modulepreload`,u=function(e){return`/`+e},d={},f=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=u(t,n),t in d)return;d[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:l,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},p=a(`/_authenticated/errors/$error`)({component:c(()=>f(()=>import(`./_error-BuPuBfMQ.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43])),`component`)});export{a as i,f as n,c as r,p as t};
|
import{$u as e,nd as t}from"./messages-BOl-zx8S.js";import{r as n}from"./useRouter-DS97kuA5.js";import{d as r}from"./useStore-pgHsvR0E.js";import{n as i}from"./route-C5Xnq6N2.js";function a(e){return new o(e,{silent:!0}).createRoute}var o=class{constructor(e,t){this.path=e,this.createRoute=e=>{let t=i(e);return t.isRoot=!1,t},this.silent=t?.silent}},s=t(e(),1);function c(e,t){let i,a,o,c,l=()=>(i||=e().then(e=>{i=void 0,a=e[t??`default`]}).catch(e=>{if(o=e,r(o)&&o instanceof Error&&typeof window<`u`&&typeof sessionStorage<`u`){let e=`tanstack_router_reload:${o.message}`;sessionStorage.getItem(e)||(sessionStorage.setItem(e,`1`),c=!0)}}),i),u=function(e){if(c)throw window.location.reload(),new Promise(()=>{});if(o)throw o;if(!a)if(n)n(l());else throw l();return s.createElement(a,e)};return u.preload=l,u}var l=`modulepreload`,u=function(e){return`/`+e},d={},f=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=u(t,n),t in d)return;d[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:l,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},p=a(`/_authenticated/errors/$error`)({component:c(()=>f(()=>import(`./_error-DUUb7pi1.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47])),`component`)});export{a as i,f as n,c as r,p as t};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Qu as e}from"./messages-BOl-zx8S.js";import{t}from"./_error-Ct843SHu.js";import{m as n}from"./search-provider-D-fTfilE.js";import{n as r,t as i}from"./theme-switch-BVGTp-bE.js";import{t as a}from"./general-error-ruXTchhS.js";import{t as o}from"./not-found-error-mxpXcTRa.js";import{t as s}from"./unauthorized-error-9CwofmD6.js";import{t as c}from"./forbidden-B-WSRpe6.js";import{t as l}from"./maintenance-error-yQ4OJvXf.js";import{n as u,r as d,t as f}from"./header-B5Qx5Y9m.js";var p=e();function m(){let{error:e}=t.useParams(),m={unauthorized:s,forbidden:c,"not-found":o,"internal-server-error":a,"maintenance-error":l}[e]||o;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(f,{className:`border-b`,fixed:!0,children:[(0,p.jsx)(u,{}),(0,p.jsxs)(`div`,{className:`ms-auto flex items-center space-x-4`,children:[(0,p.jsx)(r,{}),(0,p.jsx)(i,{}),(0,p.jsx)(n,{}),(0,p.jsx)(d,{})]})]}),(0,p.jsx)(`div`,{className:`flex-1 [&>div]:h-full`,children:(0,p.jsx)(m,{})})]})}export{m as component};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
import{$ as e,J as t,Q as n,Tu as r,X as i,Y as a,Z as o,mu as s,pu as c,q as l}from"./messages-xqHXgrWc.js";import{i as u,n as d,t as f}from"./button-BQECWbag.js";import{n as p,r as m}from"./font-provider-hqH5jrNZ.js";import{n as h}from"./theme-provider-CUq7mJXc.js";import{t as g}from"./chevron-down-C9UXFHLA.js";import{n as _,t as v}from"./radio-group-Dgnx77ZO.js";import{r as y,s as b}from"./zod-BnhDiB7H.js";import{a as x,c as S,i as C,l as w,n as T,o as E,r as D,s as O,t as k}from"./form-DK0bnk5h.js";import{t as A}from"./page-header-C0GHzPxS.js";import{t as j}from"./show-submitted-data-B0wIea74.js";var M=r(),N=b({theme:y([`light`,`dark`]),font:y(m)});function P(){let{font:e,setFont:n}=p(),{theme:r,setTheme:y}=h(),b={theme:r,font:e},A=w({resolver:S(N),defaultValues:b});function P(t){t.font!==e&&n(t.font),t.theme!==r&&y(t.theme),j(t)}return(0,M.jsx)(k,{...A,children:(0,M.jsxs)(`form`,{className:`space-y-8`,onSubmit:A.handleSubmit(P),children:[(0,M.jsx)(C,{control:A.control,name:`font`,render:({field:e})=>(0,M.jsxs)(x,{children:[(0,M.jsx)(E,{children:o()}),(0,M.jsxs)(`div`,{className:`relative w-max`,children:[(0,M.jsx)(T,{children:(0,M.jsx)(`select`,{className:u(d({variant:`outline`}),`w-50 appearance-none font-normal capitalize`,`dark:bg-background dark:hover:bg-background`),...e,children:m.map(e=>(0,M.jsx)(`option`,{value:e,children:e},e))})}),(0,M.jsx)(g,{className:`absolute inset-e-3 top-2.5 h-4 w-4 opacity-50`})]}),(0,M.jsx)(D,{className:`font-manrope`,children:i()}),(0,M.jsx)(O,{})]})}),(0,M.jsx)(C,{control:A.control,name:`theme`,render:({field:e})=>(0,M.jsxs)(x,{children:[(0,M.jsx)(E,{children:a()}),(0,M.jsx)(D,{children:t()}),(0,M.jsx)(O,{}),(0,M.jsxs)(v,{className:`grid max-w-md grid-cols-2 gap-8 pt-2`,defaultValue:e.value,onValueChange:e.onChange,children:[(0,M.jsx)(x,{children:(0,M.jsxs)(E,{className:`[&:has([data-state=checked])>div]:border-primary`,children:[(0,M.jsx)(T,{children:(0,M.jsx)(_,{className:`sr-only`,value:`light`})}),(0,M.jsx)(`div`,{className:`items-center rounded-md border-2 border-muted p-1 hover:border-accent`,children:(0,M.jsxs)(`div`,{className:`space-y-2 rounded-sm bg-[#ecedef] p-2`,children:[(0,M.jsxs)(`div`,{className:`space-y-2 rounded-md bg-white p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-2 w-20 rounded-lg bg-[#ecedef]`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-[#ecedef]`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-white p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-[#ecedef]`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-[#ecedef]`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-white p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-[#ecedef]`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-[#ecedef]`})]})]})}),(0,M.jsx)(`span`,{className:`block w-full p-2 text-center font-normal`,children:s()})]})}),(0,M.jsx)(x,{children:(0,M.jsxs)(E,{className:`[&:has([data-state=checked])>div]:border-primary`,children:[(0,M.jsx)(T,{children:(0,M.jsx)(_,{className:`sr-only`,value:`dark`})}),(0,M.jsx)(`div`,{className:`items-center rounded-md border-2 border-muted bg-popover p-1 hover:bg-accent hover:text-accent-foreground`,children:(0,M.jsxs)(`div`,{className:`space-y-2 rounded-sm bg-slate-950 p-2`,children:[(0,M.jsxs)(`div`,{className:`space-y-2 rounded-md bg-slate-800 p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-2 w-20 rounded-lg bg-slate-400`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-slate-400`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-slate-800 p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-slate-400`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-slate-400`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-slate-800 p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-slate-400`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-slate-400`})]})]})}),(0,M.jsx)(`span`,{className:`block w-full p-2 text-center font-normal`,children:c()})]})})]})]})}),(0,M.jsx)(f,{type:`submit`,children:l()})]})})}function F(){return(0,M.jsx)(A,{description:n(),title:e(),variant:`section`,children:(0,M.jsx)(P,{})})}var I=F;export{I as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Bu as e,Qu as t,Vu as n,ct as r,dt as i,ft as a,lt as o,pt as s,st as c,ut as l}from"./messages-BOl-zx8S.js";import{i as u,n as d,t as f}from"./button-D-oR8d6w.js";import{n as p,r as m}from"./font-provider-BBeIKmOK.js";import{n as h}from"./theme-provider-Dmxgp34D.js";import{t as g}from"./chevron-down-uSXLUPEl.js";import{n as _,t as v}from"./radio-group-8QacflxY.js";import{r as y,s as b}from"./zod-DzRgHmfz.js";import{a as x,c as S,i as C,l as w,n as T,o as E,r as D,s as O,t as k}from"./form-uKra2bmF.js";import{t as A}from"./page-header-BRM1dngJ.js";import{t as j}from"./show-submitted-data-sbgXi_a9.js";var M=t(),N=b({theme:y([`light`,`dark`]),font:y(m)});function P(){let{font:t,setFont:a}=p(),{theme:s,setTheme:y}=h(),b={theme:s,font:t},A=w({resolver:S(N),defaultValues:b});function P(e){e.font!==t&&a(e.font),e.theme!==s&&y(e.theme),j(e)}return(0,M.jsx)(k,{...A,children:(0,M.jsxs)(`form`,{className:`space-y-8`,onSubmit:A.handleSubmit(P),children:[(0,M.jsx)(C,{control:A.control,name:`font`,render:({field:e})=>(0,M.jsxs)(x,{children:[(0,M.jsx)(E,{children:i()}),(0,M.jsxs)(`div`,{className:`relative w-max`,children:[(0,M.jsx)(T,{children:(0,M.jsx)(`select`,{className:u(d({variant:`outline`}),`w-50 appearance-none font-normal capitalize`,`dark:bg-background dark:hover:bg-background`),...e,children:m.map(e=>(0,M.jsx)(`option`,{value:e,children:e},e))})}),(0,M.jsx)(g,{className:`absolute inset-e-3 top-2.5 h-4 w-4 opacity-50`})]}),(0,M.jsx)(D,{className:`font-manrope`,children:l()}),(0,M.jsx)(O,{})]})}),(0,M.jsx)(C,{control:A.control,name:`theme`,render:({field:t})=>(0,M.jsxs)(x,{children:[(0,M.jsx)(E,{children:o()}),(0,M.jsx)(D,{children:r()}),(0,M.jsx)(O,{}),(0,M.jsxs)(v,{className:`grid max-w-md grid-cols-2 gap-8 pt-2`,defaultValue:t.value,onValueChange:t.onChange,children:[(0,M.jsx)(x,{children:(0,M.jsxs)(E,{className:`[&:has([data-state=checked])>div]:border-primary`,children:[(0,M.jsx)(T,{children:(0,M.jsx)(_,{className:`sr-only`,value:`light`})}),(0,M.jsx)(`div`,{className:`items-center rounded-md border-2 border-muted p-1 hover:border-accent`,children:(0,M.jsxs)(`div`,{className:`space-y-2 rounded-sm bg-[#ecedef] p-2`,children:[(0,M.jsxs)(`div`,{className:`space-y-2 rounded-md bg-white p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-2 w-20 rounded-lg bg-[#ecedef]`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-[#ecedef]`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-white p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-[#ecedef]`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-[#ecedef]`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-white p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-[#ecedef]`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-[#ecedef]`})]})]})}),(0,M.jsx)(`span`,{className:`block w-full p-2 text-center font-normal`,children:n()})]})}),(0,M.jsx)(x,{children:(0,M.jsxs)(E,{className:`[&:has([data-state=checked])>div]:border-primary`,children:[(0,M.jsx)(T,{children:(0,M.jsx)(_,{className:`sr-only`,value:`dark`})}),(0,M.jsx)(`div`,{className:`items-center rounded-md border-2 border-muted bg-popover p-1 hover:bg-accent hover:text-accent-foreground`,children:(0,M.jsxs)(`div`,{className:`space-y-2 rounded-sm bg-slate-950 p-2`,children:[(0,M.jsxs)(`div`,{className:`space-y-2 rounded-md bg-slate-800 p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-2 w-20 rounded-lg bg-slate-400`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-slate-400`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-slate-800 p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-slate-400`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-slate-400`})]}),(0,M.jsxs)(`div`,{className:`flex items-center space-x-2 rounded-md bg-slate-800 p-2 shadow-xs`,children:[(0,M.jsx)(`div`,{className:`h-4 w-4 rounded-full bg-slate-400`}),(0,M.jsx)(`div`,{className:`h-2 w-25 rounded-lg bg-slate-400`})]})]})}),(0,M.jsx)(`span`,{className:`block w-full p-2 text-center font-normal`,children:e()})]})})]})]})}),(0,M.jsx)(f,{type:`submit`,children:c()})]})})}function F(){return(0,M.jsx)(A,{description:a(),title:s(),variant:`section`,children:(0,M.jsx)(P,{})})}var I=F;export{I as component};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]);export{t};
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";var r=n(e(),1),i=t(),a=(0,r.createContext)({isTyping:!1,passwordLength:0,setIsTyping:()=>void 0,setPasswordLength:()=>void 0,setShowPassword:()=>void 0,showPassword:!1});function o({children:e}){let[t,n]=(0,r.useState)(!1),[o,s]=(0,r.useState)(!1),[c,l]=(0,r.useState)(0);return(0,i.jsx)(a.Provider,{value:{isTyping:t,passwordLength:c,setIsTyping:n,setPasswordLength:l,setShowPassword:s,showPassword:o},children:e})}function s(){return(0,r.useContext)(a)}export{s as n,o as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";var r=n(e(),1),i=t(),a=(0,r.createContext)({isTyping:!1,passwordLength:0,setIsTyping:()=>void 0,setPasswordLength:()=>void 0,setShowPassword:()=>void 0,showPassword:!1});function o({children:e}){let[t,n]=(0,r.useState)(!1),[o,s]=(0,r.useState)(!1),[c,l]=(0,r.useState)(0);return(0,i.jsx)(a.Provider,{value:{isTyping:t,passwordLength:c,setIsTyping:n,setPasswordLength:l,setShowPassword:s,showPassword:o},children:e})}function s(){return(0,r.useContext)(a)}export{s as n,o as t};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{Tu as e}from"./messages-xqHXgrWc.js";import{i as t,r as n,s as r}from"./button-BQECWbag.js";var i=e(),a=n(`inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-full border border-transparent px-2 py-0.5 font-medium text-xs transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3`,{variants:{variant:{default:`bg-primary text-primary-foreground [a&]:hover:bg-primary/90`,secondary:`bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90`,destructive:`bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90`,outline:`border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,ghost:`[a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,link:`text-primary underline-offset-4 [a&]:hover:underline`}},defaultVariants:{variant:`default`}});function o({className:e,variant:n=`default`,asChild:o=!1,...s}){return(0,i.jsx)(o?r:`span`,{className:t(a({variant:n}),e),"data-slot":`badge`,"data-variant":n,...s})}export{o as t};
|
import{Qu as e}from"./messages-BOl-zx8S.js";import{i as t,r as n,s as r}from"./button-D-oR8d6w.js";var i=e(),a=n(`inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-full border border-transparent px-2 py-0.5 font-medium text-xs transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3`,{variants:{variant:{default:`bg-primary text-primary-foreground [a&]:hover:bg-primary/90`,secondary:`bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90`,destructive:`bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90`,outline:`border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,ghost:`[a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,link:`text-primary underline-offset-4 [a&]:hover:underline`}},defaultVariants:{variant:`default`}});function o({className:e,variant:n=`default`,asChild:o=!1,...s}){return(0,i.jsx)(o?r:`span`,{className:t(a({variant:n}),e),"data-slot":`badge`,"data-variant":n,...s})}export{o as t};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{Tu as e}from"./messages-xqHXgrWc.js";import{i as t}from"./button-BQECWbag.js";var n=e();function r({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm`,e),"data-slot":`card`,...r})}function i({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,e),"data-slot":`card-header`,...r})}function a({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`font-semibold leading-none`,e),"data-slot":`card-title`,...r})}function o({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`text-muted-foreground text-sm`,e),"data-slot":`card-description`,...r})}function s({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`px-6`,e),"data-slot":`card-content`,...r})}export{a,i,s as n,o as r,r as t};
|
import{Qu as e}from"./messages-BOl-zx8S.js";import{i as t}from"./button-D-oR8d6w.js";var n=e();function r({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm`,e),"data-slot":`card`,...r})}function i({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,e),"data-slot":`card-header`,...r})}function a({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`font-semibold leading-none`,e),"data-slot":`card-title`,...r})}function o({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`text-muted-foreground text-sm`,e),"data-slot":`card-description`,...r})}function s({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`px-6`,e),"data-slot":`card-content`,...r})}export{a,i,s as n,o as r,r as t};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{Eu as e,ku as t}from"./messages-xqHXgrWc.js";import{a as n,d as r,u as i}from"./auth-store-Cp1Qr8YS.js";import{t as a}from"./createLucideIcon-BjX75ffX.js";var o=a(`pen-line`,[[`path`,{d:`M13 21h8`,key:`1jsn5i`}],[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]]),s=t(e(),1),c=new i({chains:[],loading:!1});function l(e){c.setState(t=>({...t,chains:e}))}function u(e){c.setState(t=>({...t,loading:e}))}function d(){let e=r(c,e=>e.chains),t=r(c,e=>e.loading),i=n.useQuery(`get`,`/admin/api/v1/chains`);return(0,s.useEffect)(()=>{u(i.isLoading)},[i.isLoading]),(0,s.useEffect)(()=>{i.data?.data&&l(i.data.data)},[i.data?.data]),{chains:e,loading:t,refetch:i.refetch}}export{o as n,d as t};
|
import{$u as e,nd as t}from"./messages-BOl-zx8S.js";import{a as n,d as r,u as i}from"./auth-store-D_jr_Pei.js";import{t as a}from"./createLucideIcon-DMX28cCu.js";var o=a(`pen-line`,[[`path`,{d:`M13 21h8`,key:`1jsn5i`}],[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]]),s=t(e(),1),c=new i({chains:[],loading:!1});function l(e){c.setState(t=>({...t,chains:e}))}function u(e){c.setState(t=>({...t,loading:e}))}function d(){let e=r(c,e=>e.chains),t=r(c,e=>e.loading),i=n.useQuery(`get`,`/admin/api/v1/chains`);return(0,s.useEffect)(()=>{u(i.isLoading)},[i.isLoading]),(0,s.useEffect)(()=>{i.data?.data&&l(i.data.data)},[i.data?.data]),{chains:e,loading:t,refetch:i.refetch}}export{o as n,d as t};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]);export{t};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]);export{t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";import{t as r}from"./dist-CxCGwIT8.js";import{d as i,i as a}from"./button-BQECWbag.js";import{a as o,r as s,t as c}from"./dist-DoGn2h1J.js";import{t as l}from"./dist-4j1Lrjyz.js";import{t as u}from"./dist-CeQDKZ9c.js";import{t as d}from"./dist-B1wXypYC.js";import{t as f}from"./check-CkR9hU2c.js";var p=n(e(),1),m=t(),h=`Checkbox`,[g,_]=o(h),[v,y]=g(h);function b(e){let{__scopeCheckbox:t,checked:n,children:r,defaultChecked:i,disabled:a,form:o,name:s,onCheckedChange:l,required:u,value:d=`on`,internal_do_not_use_render:f}=e,[g,_]=c({prop:n,defaultProp:i??!1,onChange:l,caller:h}),[y,b]=p.useState(null),[x,S]=p.useState(null),C=p.useRef(!1),w=y?!!o||!!y.closest(`form`):!0,T={checked:g,disabled:a,setChecked:_,control:y,setControl:b,name:s,form:o,value:d,hasConsumerStoppedPropagationRef:C,required:u,defaultChecked:k(i)?!1:i,isFormControl:w,bubbleInput:x,setBubbleInput:S};return(0,m.jsx)(v,{scope:t,...T,children:O(f)?f(T):r})}var x=`CheckboxTrigger`,S=p.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:n,...a},o)=>{let{control:c,value:l,disabled:u,checked:d,required:f,setControl:h,setChecked:g,hasConsumerStoppedPropagationRef:_,isFormControl:v,bubbleInput:b}=y(x,e),S=i(o,h),C=p.useRef(d);return p.useEffect(()=>{let e=c?.form;if(e){let t=()=>g(C.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[c,g]),(0,m.jsx)(r.button,{type:`button`,role:`checkbox`,"aria-checked":k(d)?`mixed`:d,"aria-required":f,"data-state":A(d),"data-disabled":u?``:void 0,disabled:u,value:l,...a,ref:S,onKeyDown:s(t,e=>{e.key===`Enter`&&e.preventDefault()}),onClick:s(n,e=>{g(e=>k(e)?!0:!e),b&&v&&(_.current=e.isPropagationStopped(),_.current||e.stopPropagation())})})});S.displayName=x;var C=p.forwardRef((e,t)=>{let{__scopeCheckbox:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,m.jsx)(b,{__scopeCheckbox:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{...d,ref:t,__scopeCheckbox:n}),e&&(0,m.jsx)(D,{__scopeCheckbox:n})]})})});C.displayName=h;var w=`CheckboxIndicator`,T=p.forwardRef((e,t)=>{let{__scopeCheckbox:n,forceMount:i,...a}=e,o=y(w,n);return(0,m.jsx)(l,{present:i||k(o.checked)||o.checked===!0,children:(0,m.jsx)(r.span,{"data-state":A(o.checked),"data-disabled":o.disabled?``:void 0,...a,ref:t,style:{pointerEvents:`none`,...e.style}})})});T.displayName=w;var E=`CheckboxBubbleInput`,D=p.forwardRef(({__scopeCheckbox:e,...t},n)=>{let{control:a,hasConsumerStoppedPropagationRef:o,checked:s,defaultChecked:c,required:l,disabled:f,name:h,value:g,form:_,bubbleInput:v,setBubbleInput:b}=y(E,e),x=i(n,b),S=u(s),C=d(a);p.useEffect(()=>{let e=v;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=!o.current;if(S!==s&&n){let t=new Event(`click`,{bubbles:r});e.indeterminate=k(s),n.call(e,k(s)?!1:s),e.dispatchEvent(t)}},[v,S,s,o]);let w=p.useRef(k(s)?!1:s);return(0,m.jsx)(r.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:c??w.current,required:l,disabled:f,name:h,value:g,form:_,...t,tabIndex:-1,ref:x,style:{...t.style,...C,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})});D.displayName=E;function O(e){return typeof e==`function`}function k(e){return e===`indeterminate`}function A(e){return k(e)?`indeterminate`:e?`checked`:`unchecked`}function j({className:e,...t}){return(0,m.jsx)(C,{className:a(`peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs outline-none transition-shadow focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:data-[state=checked]:bg-primary dark:aria-invalid:ring-destructive/40`,e),"data-slot":`checkbox`,...t,children:(0,m.jsx)(T,{className:`grid place-content-center text-current transition-none`,"data-slot":`checkbox-indicator`,children:(0,m.jsx)(f,{className:`size-3.5`})})})}export{j as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";import{t as r}from"./dist-DJhZSa1-.js";import{d as i,i as a}from"./button-D-oR8d6w.js";import{a as o,r as s,t as c}from"./dist-DzENW8NP.js";import{t as l}from"./dist-BZg_Jfik.js";import{t as u}from"./dist-QGW08nls.js";import{t as d}from"./dist-Bh3bGrZa.js";import{t as f}from"./check-DH6qIczM.js";var p=n(e(),1),m=t(),h=`Checkbox`,[g,_]=o(h),[v,y]=g(h);function b(e){let{__scopeCheckbox:t,checked:n,children:r,defaultChecked:i,disabled:a,form:o,name:s,onCheckedChange:l,required:u,value:d=`on`,internal_do_not_use_render:f}=e,[g,_]=c({prop:n,defaultProp:i??!1,onChange:l,caller:h}),[y,b]=p.useState(null),[x,S]=p.useState(null),C=p.useRef(!1),w=y?!!o||!!y.closest(`form`):!0,T={checked:g,disabled:a,setChecked:_,control:y,setControl:b,name:s,form:o,value:d,hasConsumerStoppedPropagationRef:C,required:u,defaultChecked:k(i)?!1:i,isFormControl:w,bubbleInput:x,setBubbleInput:S};return(0,m.jsx)(v,{scope:t,...T,children:O(f)?f(T):r})}var x=`CheckboxTrigger`,S=p.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:n,...a},o)=>{let{control:c,value:l,disabled:u,checked:d,required:f,setControl:h,setChecked:g,hasConsumerStoppedPropagationRef:_,isFormControl:v,bubbleInput:b}=y(x,e),S=i(o,h),C=p.useRef(d);return p.useEffect(()=>{let e=c?.form;if(e){let t=()=>g(C.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[c,g]),(0,m.jsx)(r.button,{type:`button`,role:`checkbox`,"aria-checked":k(d)?`mixed`:d,"aria-required":f,"data-state":A(d),"data-disabled":u?``:void 0,disabled:u,value:l,...a,ref:S,onKeyDown:s(t,e=>{e.key===`Enter`&&e.preventDefault()}),onClick:s(n,e=>{g(e=>k(e)?!0:!e),b&&v&&(_.current=e.isPropagationStopped(),_.current||e.stopPropagation())})})});S.displayName=x;var C=p.forwardRef((e,t)=>{let{__scopeCheckbox:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,m.jsx)(b,{__scopeCheckbox:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{...d,ref:t,__scopeCheckbox:n}),e&&(0,m.jsx)(D,{__scopeCheckbox:n})]})})});C.displayName=h;var w=`CheckboxIndicator`,T=p.forwardRef((e,t)=>{let{__scopeCheckbox:n,forceMount:i,...a}=e,o=y(w,n);return(0,m.jsx)(l,{present:i||k(o.checked)||o.checked===!0,children:(0,m.jsx)(r.span,{"data-state":A(o.checked),"data-disabled":o.disabled?``:void 0,...a,ref:t,style:{pointerEvents:`none`,...e.style}})})});T.displayName=w;var E=`CheckboxBubbleInput`,D=p.forwardRef(({__scopeCheckbox:e,...t},n)=>{let{control:a,hasConsumerStoppedPropagationRef:o,checked:s,defaultChecked:c,required:l,disabled:f,name:h,value:g,form:_,bubbleInput:v,setBubbleInput:b}=y(E,e),x=i(n,b),S=u(s),C=d(a);p.useEffect(()=>{let e=v;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=!o.current;if(S!==s&&n){let t=new Event(`click`,{bubbles:r});e.indeterminate=k(s),n.call(e,k(s)?!1:s),e.dispatchEvent(t)}},[v,S,s,o]);let w=p.useRef(k(s)?!1:s);return(0,m.jsx)(r.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:c??w.current,required:l,disabled:f,name:h,value:g,form:_,...t,tabIndex:-1,ref:x,style:{...t.style,...C,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})});D.displayName=E;function O(e){return typeof e==`function`}function k(e){return e===`indeterminate`}function A(e){return k(e)?`indeterminate`:e?`checked`:`unchecked`}function j({className:e,...t}){return(0,m.jsx)(C,{className:a(`peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs outline-none transition-shadow focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:data-[state=checked]:bg-primary dark:aria-invalid:ring-destructive/40`,e),"data-slot":`checkbox`,...t,children:(0,m.jsx)(T,{className:`grid place-content-center text-current transition-none`,"data-slot":`checkbox-indicator`,children:(0,m.jsx)(f,{className:`size-3.5`})})})}export{j as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]);export{t};
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`chevrons-up-down`,[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`chevrons-up-down`,[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]);export{t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]);export{t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`clock-3`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6h4`,key:`135r8i`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`clock-3`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6h4`,key:`135r8i`}]]);export{t};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Fu as e,Nu as t,Pu as n,Qu as r}from"./messages-BOl-zx8S.js";import{d as i,l as a,m as o,p as s,u as c}from"./command-yFHhtFiR.js";import{t as l}from"./telescope-CH8QonjS.js";var u=r();function d({open:r,onOpenChange:d}){return(0,u.jsx)(a,{onOpenChange:d,open:r,children:(0,u.jsx)(c,{className:`sm:max-w-sm`,children:(0,u.jsxs)(s,{className:`items-center text-center`,children:[(0,u.jsx)(l,{className:`mb-2 size-12 text-muted-foreground`}),(0,u.jsx)(o,{children:e()}),(0,u.jsxs)(i,{children:[n(),(0,u.jsx)(`br`,{}),(0,u.jsx)(`p`,{className:`mt-2 text-center`,children:t()})]})]})})})}export{d as t};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{Tu as e,cu as t,ou as n,su as r}from"./messages-xqHXgrWc.js";import{d as i,l as a,m as o,p as s,u as c}from"./command-Kxl1kgbj.js";import{t as l}from"./telescope-tTmzP4X9.js";var u=e();function d({open:e,onOpenChange:d}){return(0,u.jsx)(a,{onOpenChange:d,open:e,children:(0,u.jsx)(c,{className:`sm:max-w-sm`,children:(0,u.jsxs)(s,{className:`items-center text-center`,children:[(0,u.jsx)(l,{className:`mb-2 size-12 text-muted-foreground`}),(0,u.jsx)(o,{children:t()}),(0,u.jsxs)(i,{children:[r(),(0,u.jsx)(`br`,{}),(0,u.jsx)(`p`,{className:`mt-2 text-center`,children:n()})]})]})})})}export{d as t};
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
import{Eu as e,Tu as t,bu as n,ku as r,yu as i}from"./messages-xqHXgrWc.js";import{d as a,i as o,l as s,t as c}from"./button-BQECWbag.js";import{a as l,r as u}from"./dist-DoGn2h1J.js";import{a as d,c as f,i as p,l as m,n as h,o as g,r as _,s as ee,t as v,u as y}from"./dist-ea73EafA.js";var b=r(e(),1),x=t(),S=`AlertDialog`,[C,te]=l(S,[y]),w=y(),T=e=>{let{__scopeAlertDialog:t,...n}=e,r=w(t);return(0,x.jsx)(g,{...r,...n,modal:!0})};T.displayName=S;var E=`AlertDialogTrigger`,D=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(f,{...i,...r,ref:t})});D.displayName=E;var O=`AlertDialogPortal`,k=e=>{let{__scopeAlertDialog:t,...n}=e,r=w(t);return(0,x.jsx)(d,{...r,...n})};k.displayName=O;var A=`AlertDialogOverlay`,j=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(p,{...i,...r,ref:t})});j.displayName=A;var M=`AlertDialogContent`,[N,P]=C(M),F=s(`AlertDialogContent`),I=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,children:r,...i}=e,o=w(n),s=b.useRef(null),c=a(t,s),l=b.useRef(null);return(0,x.jsx)(m,{contentName:M,titleName:L,docsSlug:`alert-dialog`,children:(0,x.jsx)(N,{scope:n,cancelRef:l,children:(0,x.jsxs)(h,{role:`alertdialog`,...o,...i,ref:c,onOpenAutoFocus:u(i.onOpenAutoFocus,e=>{e.preventDefault(),l.current?.focus({preventScroll:!0})}),onPointerDownOutside:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),children:[(0,x.jsx)(F,{children:r}),(0,x.jsx)(G,{contentRef:s})]})})})});I.displayName=M;var L=`AlertDialogTitle`,R=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(ee,{...i,...r,ref:t})});R.displayName=L;var z=`AlertDialogDescription`,B=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(_,{...i,...r,ref:t})});B.displayName=z;var V=`AlertDialogAction`,H=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(v,{...i,...r,ref:t})});H.displayName=V;var U=`AlertDialogCancel`,W=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,{cancelRef:i}=P(U,n),o=w(n),s=a(t,i);return(0,x.jsx)(v,{...o,...r,ref:s})});W.displayName=U;var G=({contentRef:e})=>{let t=`\`${M}\` requires a description for the component to be accessible for screen reader users.
|
import{$u as e,Ku as t,Qu as n,nd as r,qu as i}from"./messages-BOl-zx8S.js";import{d as a,i as o,l as s,t as c}from"./button-D-oR8d6w.js";import{a as l,r as u}from"./dist-DzENW8NP.js";import{a as d,c as f,i as p,l as m,n as h,o as g,r as _,s as ee,t as v,u as y}from"./dist-C3yOG_Qz.js";var b=r(e(),1),x=n(),S=`AlertDialog`,[C,te]=l(S,[y]),w=y(),T=e=>{let{__scopeAlertDialog:t,...n}=e,r=w(t);return(0,x.jsx)(g,{...r,...n,modal:!0})};T.displayName=S;var E=`AlertDialogTrigger`,D=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(f,{...i,...r,ref:t})});D.displayName=E;var O=`AlertDialogPortal`,k=e=>{let{__scopeAlertDialog:t,...n}=e,r=w(t);return(0,x.jsx)(d,{...r,...n})};k.displayName=O;var A=`AlertDialogOverlay`,j=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(p,{...i,...r,ref:t})});j.displayName=A;var M=`AlertDialogContent`,[N,P]=C(M),F=s(`AlertDialogContent`),I=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,children:r,...i}=e,o=w(n),s=b.useRef(null),c=a(t,s),l=b.useRef(null);return(0,x.jsx)(m,{contentName:M,titleName:L,docsSlug:`alert-dialog`,children:(0,x.jsx)(N,{scope:n,cancelRef:l,children:(0,x.jsxs)(h,{role:`alertdialog`,...o,...i,ref:c,onOpenAutoFocus:u(i.onOpenAutoFocus,e=>{e.preventDefault(),l.current?.focus({preventScroll:!0})}),onPointerDownOutside:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),children:[(0,x.jsx)(F,{children:r}),(0,x.jsx)(G,{contentRef:s})]})})})});I.displayName=M;var L=`AlertDialogTitle`,R=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(ee,{...i,...r,ref:t})});R.displayName=L;var z=`AlertDialogDescription`,B=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(_,{...i,...r,ref:t})});B.displayName=z;var V=`AlertDialogAction`,H=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=w(n);return(0,x.jsx)(v,{...i,...r,ref:t})});H.displayName=V;var U=`AlertDialogCancel`,W=b.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,{cancelRef:i}=P(U,n),o=w(n),s=a(t,i);return(0,x.jsx)(v,{...o,...r,ref:s})});W.displayName=U;var G=({contentRef:e})=>{let t=`\`${M}\` requires a description for the component to be accessible for screen reader users.
|
||||||
|
|
||||||
You can add a description to the \`${M}\` by passing a \`${z}\` component as a child, which also benefits sighted users by adding visible context to the dialog.
|
You can add a description to the \`${M}\` by passing a \`${z}\` component as a child, which also benefits sighted users by adding visible context to the dialog.
|
||||||
|
|
||||||
Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${M}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
|
Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${M}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
|
||||||
|
|
||||||
For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return b.useEffect(()=>{document.getElementById(e.current?.getAttribute(`aria-describedby`))||console.warn(t)},[t,e]),null},K=T,q=k,J=j,Y=I,X=W,Z=R,Q=B;function ne({...e}){return(0,x.jsx)(K,{"data-slot":`alert-dialog`,...e})}function re({...e}){return(0,x.jsx)(q,{"data-slot":`alert-dialog-portal`,...e})}function ie({className:e,...t}){return(0,x.jsx)(J,{className:o(`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=open]:animate-in`,e),"data-slot":`alert-dialog-overlay`,...t})}function ae({className:e,size:t=`default`,...n}){return(0,x.jsxs)(re,{children:[(0,x.jsx)(ie,{}),(0,x.jsx)(Y,{className:o(`group/alert-dialog-content data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=open]:animate-in data-[size=default]:sm:max-w-lg`,e),"data-size":t,"data-slot":`alert-dialog-content`,...n})]})}function oe({className:e,...t}){return(0,x.jsx)(`div`,{className:o(`grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]`,e),"data-slot":`alert-dialog-header`,...t})}function $({className:e,...t}){return(0,x.jsx)(`div`,{className:o(`flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end`,e),"data-slot":`alert-dialog-footer`,...t})}function se({className:e,...t}){return(0,x.jsx)(Z,{className:o(`font-semibold text-lg sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2`,e),"data-slot":`alert-dialog-title`,...t})}function ce({className:e,...t}){return(0,x.jsx)(Q,{className:o(`text-muted-foreground text-sm`,e),"data-slot":`alert-dialog-description`,...t})}function le({className:e,variant:t=`outline`,size:n=`default`,...r}){return(0,x.jsx)(c,{asChild:!0,size:n,variant:t,children:(0,x.jsx)(X,{className:o(e),"data-slot":`alert-dialog-cancel`,...r})})}function ue(e){let{title:t,desc:r,children:a,className:s,confirmText:l,cancelBtnText:u,destructive:d,isLoading:f,disabled:p=!1,form:m,handleConfirm:h,...g}=e;return(0,x.jsx)(ne,{...g,children:(0,x.jsxs)(ae,{className:o(s&&s),children:[(0,x.jsxs)(oe,{className:`text-start`,children:[(0,x.jsx)(se,{children:t}),(0,x.jsx)(ce,{asChild:!0,children:(0,x.jsx)(`div`,{children:r})})]}),a,(0,x.jsxs)($,{children:[(0,x.jsx)(le,{disabled:f,children:u??n()}),(0,x.jsx)(c,{disabled:p||f,form:m,onClick:h,type:m?`submit`:`button`,variant:d?`destructive`:`default`,children:l??i()})]})]})})}export{ue as t};
|
For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return b.useEffect(()=>{document.getElementById(e.current?.getAttribute(`aria-describedby`))||console.warn(t)},[t,e]),null},K=T,q=k,J=j,Y=I,X=W,Z=R,Q=B;function ne({...e}){return(0,x.jsx)(K,{"data-slot":`alert-dialog`,...e})}function re({...e}){return(0,x.jsx)(q,{"data-slot":`alert-dialog-portal`,...e})}function ie({className:e,...t}){return(0,x.jsx)(J,{className:o(`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=open]:animate-in`,e),"data-slot":`alert-dialog-overlay`,...t})}function ae({className:e,size:t=`default`,...n}){return(0,x.jsxs)(re,{children:[(0,x.jsx)(ie,{}),(0,x.jsx)(Y,{className:o(`group/alert-dialog-content data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=open]:animate-in data-[size=default]:sm:max-w-lg`,e),"data-size":t,"data-slot":`alert-dialog-content`,...n})]})}function oe({className:e,...t}){return(0,x.jsx)(`div`,{className:o(`grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]`,e),"data-slot":`alert-dialog-header`,...t})}function $({className:e,...t}){return(0,x.jsx)(`div`,{className:o(`flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end`,e),"data-slot":`alert-dialog-footer`,...t})}function se({className:e,...t}){return(0,x.jsx)(Z,{className:o(`font-semibold text-lg sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2`,e),"data-slot":`alert-dialog-title`,...t})}function ce({className:e,...t}){return(0,x.jsx)(Q,{className:o(`text-muted-foreground text-sm`,e),"data-slot":`alert-dialog-description`,...t})}function le({className:e,variant:t=`outline`,size:n=`default`,...r}){return(0,x.jsx)(c,{asChild:!0,size:n,variant:t,children:(0,x.jsx)(X,{className:o(e),"data-slot":`alert-dialog-cancel`,...r})})}function ue(e){let{title:n,desc:r,children:a,className:s,confirmText:l,cancelBtnText:u,destructive:d,isLoading:f,disabled:p=!1,form:m,handleConfirm:h,...g}=e;return(0,x.jsx)(ne,{...g,children:(0,x.jsxs)(ae,{className:o(s&&s),children:[(0,x.jsxs)(oe,{className:`text-start`,children:[(0,x.jsx)(se,{children:n}),(0,x.jsx)(ce,{asChild:!0,children:(0,x.jsx)(`div`,{children:r})})]}),a,(0,x.jsxs)($,{children:[(0,x.jsx)(le,{disabled:f,children:u??i()}),(0,x.jsx)(c,{disabled:p||f,form:m,onClick:h,type:m?`submit`:`button`,variant:d?`destructive`:`default`,children:l??t()})]})]})})}export{ue as t};
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
import{Du as e}from"./messages-xqHXgrWc.js";import{t}from"./createLucideIcon-BjX75ffX.js";var n=t(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),r=e(((e,t)=>{t.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;r<e.rangeCount;r++)n.push(e.getRangeAt(r));switch(t.tagName.toUpperCase()){case`INPUT`:case`TEXTAREA`:t.blur();break;default:t=null;break}return e.removeAllRanges(),function(){e.type===`Caret`&&e.removeAllRanges(),e.rangeCount||n.forEach(function(t){e.addRange(t)}),t&&t.focus()}}})),i=e(((e,t)=>{var n=r(),i={"text/plain":`Text`,"text/html":`Url`,default:`Text`},a=`Copy to clipboard: #{key}, Enter`;function o(e){var t=(/mac os x/i.test(navigator.userAgent)?`⌘`:`Ctrl`)+`+C`;return e.replace(/#{\s*key\s*}/g,t)}function s(e,t){var r,s,c,l,u,d,f=!1;t||={},r=t.debug||!1;try{if(c=n(),l=document.createRange(),u=document.getSelection(),d=document.createElement(`span`),d.textContent=e,d.ariaHidden=`true`,d.style.all=`unset`,d.style.position=`fixed`,d.style.top=0,d.style.clip=`rect(0, 0, 0, 0)`,d.style.whiteSpace=`pre`,d.style.webkitUserSelect=`text`,d.style.MozUserSelect=`text`,d.style.msUserSelect=`text`,d.style.userSelect=`text`,d.addEventListener(`copy`,function(n){if(n.stopPropagation(),t.format)if(n.preventDefault(),n.clipboardData===void 0){r&&console.warn(`unable to use e.clipboardData`),r&&console.warn(`trying IE specific stuff`),window.clipboardData.clearData();var a=i[t.format]||i.default;window.clipboardData.setData(a,e)}else n.clipboardData.clearData(),n.clipboardData.setData(t.format,e);t.onCopy&&(n.preventDefault(),t.onCopy(n.clipboardData))}),document.body.appendChild(d),l.selectNodeContents(d),u.addRange(l),!document.execCommand(`copy`))throw Error(`copy command was unsuccessful`);f=!0}catch(n){r&&console.error(`unable to copy using execCommand: `,n),r&&console.warn(`trying IE specific stuff`);try{window.clipboardData.setData(t.format||`text`,e),t.onCopy&&t.onCopy(window.clipboardData),f=!0}catch(n){r&&console.error(`unable to copy using clipboardData: `,n),r&&console.error(`falling back to prompt`),s=o(`message`in t?t.message:a),window.prompt(s,e)}}finally{u&&(typeof u.removeRange==`function`?u.removeRange(l):u.removeAllRanges()),d&&document.body.removeChild(d),c()}return f}t.exports=s}));export{n,i as t};
|
import{ed as e}from"./messages-BOl-zx8S.js";import{t}from"./createLucideIcon-DMX28cCu.js";var n=t(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),r=e(((e,t)=>{t.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;r<e.rangeCount;r++)n.push(e.getRangeAt(r));switch(t.tagName.toUpperCase()){case`INPUT`:case`TEXTAREA`:t.blur();break;default:t=null;break}return e.removeAllRanges(),function(){e.type===`Caret`&&e.removeAllRanges(),e.rangeCount||n.forEach(function(t){e.addRange(t)}),t&&t.focus()}}})),i=e(((e,t)=>{var n=r(),i={"text/plain":`Text`,"text/html":`Url`,default:`Text`},a=`Copy to clipboard: #{key}, Enter`;function o(e){var t=(/mac os x/i.test(navigator.userAgent)?`⌘`:`Ctrl`)+`+C`;return e.replace(/#{\s*key\s*}/g,t)}function s(e,t){var r,s,c,l,u,d,f=!1;t||={},r=t.debug||!1;try{if(c=n(),l=document.createRange(),u=document.getSelection(),d=document.createElement(`span`),d.textContent=e,d.ariaHidden=`true`,d.style.all=`unset`,d.style.position=`fixed`,d.style.top=0,d.style.clip=`rect(0, 0, 0, 0)`,d.style.whiteSpace=`pre`,d.style.webkitUserSelect=`text`,d.style.MozUserSelect=`text`,d.style.msUserSelect=`text`,d.style.userSelect=`text`,d.addEventListener(`copy`,function(n){if(n.stopPropagation(),t.format)if(n.preventDefault(),n.clipboardData===void 0){r&&console.warn(`unable to use e.clipboardData`),r&&console.warn(`trying IE specific stuff`),window.clipboardData.clearData();var a=i[t.format]||i.default;window.clipboardData.setData(a,e)}else n.clipboardData.clearData(),n.clipboardData.setData(t.format,e);t.onCopy&&(n.preventDefault(),t.onCopy(n.clipboardData))}),document.body.appendChild(d),l.selectNodeContents(d),u.addRange(l),!document.execCommand(`copy`))throw Error(`copy command was unsuccessful`);f=!0}catch(n){r&&console.error(`unable to copy using execCommand: `,n),r&&console.warn(`trying IE specific stuff`);try{window.clipboardData.setData(t.format||`text`,e),t.onCopy&&t.onCopy(window.clipboardData),f=!0}catch(n){r&&console.error(`unable to copy using clipboardData: `,n),r&&console.error(`falling back to prompt`),s=o(`message`in t?t.message:a),window.prompt(s,e)}}finally{u&&(typeof u.removeRange==`function`?u.removeRange(l):u.removeAllRanges()),d&&document.body.removeChild(d),c()}return f}t.exports=s}));export{n,i as t};
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
import{Eu as e,ku as t}from"./messages-xqHXgrWc.js";var n=t(e()),r=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),i=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),a=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),o=e=>{let t=a(e);return t.charAt(0).toUpperCase()+t.slice(1)},s={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},c=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},l=(0,n.createContext)({}),u=()=>(0,n.useContext)(l),d=(0,n.forwardRef)(({color:e,size:t,strokeWidth:i,absoluteStrokeWidth:a,className:o=``,children:l,iconNode:d,...f},p)=>{let{size:m=24,strokeWidth:h=2,absoluteStrokeWidth:g=!1,color:_=`currentColor`,className:v=``}=u()??{},y=a??g?Number(i??h)*24/Number(t??m):i??h;return(0,n.createElement)(`svg`,{ref:p,...s,width:t??m??s.width,height:t??m??s.height,stroke:e??_,strokeWidth:y,className:r(`lucide`,v,o),...!l&&!c(f)&&{"aria-hidden":`true`},...f},[...d.map(([e,t])=>(0,n.createElement)(e,t)),...Array.isArray(l)?l:[l]])}),f=(e,t)=>{let a=(0,n.forwardRef)(({className:a,...s},c)=>(0,n.createElement)(d,{ref:c,iconNode:t,className:r(`lucide-${i(o(e))}`,`lucide-${e}`,a),...s}));return a.displayName=o(e),a};export{f as t};
|
import{$u as e,nd as t}from"./messages-BOl-zx8S.js";var n=t(e()),r=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),i=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),a=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),o=e=>{let t=a(e);return t.charAt(0).toUpperCase()+t.slice(1)},s={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},c=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},l=(0,n.createContext)({}),u=()=>(0,n.useContext)(l),d=(0,n.forwardRef)(({color:e,size:t,strokeWidth:i,absoluteStrokeWidth:a,className:o=``,children:l,iconNode:d,...f},p)=>{let{size:m=24,strokeWidth:h=2,absoluteStrokeWidth:g=!1,color:_=`currentColor`,className:v=``}=u()??{},y=a??g?Number(i??h)*24/Number(t??m):i??h;return(0,n.createElement)(`svg`,{ref:p,...s,width:t??m??s.width,height:t??m??s.height,stroke:e??_,strokeWidth:y,className:r(`lucide`,v,o),...!l&&!c(f)&&{"aria-hidden":`true`},...f},[...d.map(([e,t])=>(0,n.createElement)(e,t)),...Array.isArray(l)?l:[l]])}),f=(e,t)=>{let a=(0,n.forwardRef)(({className:a,...s},c)=>(0,n.createElement)(d,{ref:c,iconNode:t,className:r(`lucide-${i(o(e))}`,`lucide-${e}`,a),...s}));return a.displayName=o(e),a};export{f as t};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
import{$ as e,Q as t,Qu as n,X as r,Y as i,Z as a,at as o,et as s,it as c,nt as l,ot as u,rt as d,tt as f}from"./messages-BOl-zx8S.js";import{t as p}from"./button-D-oR8d6w.js";import{t as m}from"./checkbox-D_bL2Pt-.js";import{c as h,i as g,s as _}from"./zod-DzRgHmfz.js";import{a as v,c as y,i as b,l as x,n as S,o as C,r as w,s as T,t as E}from"./form-uKra2bmF.js";import{t as D}from"./page-header-BRM1dngJ.js";import{t as O}from"./show-submitted-data-sbgXi_a9.js";var k=n(),A=[{id:`recents`,label:c()},{id:`home`,label:d()},{id:`applications`,label:l()},{id:`desktop`,label:f()},{id:`downloads`,label:s()},{id:`documents`,label:e()}],j=_({items:g(h()).refine(e=>e.some(e=>e),{message:t()})}),M={items:[`recents`,`home`]};function N(){let e=x({resolver:y(j),defaultValues:M});return(0,k.jsx)(E,{...e,children:(0,k.jsxs)(`form`,{className:`space-y-8`,onSubmit:e.handleSubmit(e=>O(e)),children:[(0,k.jsx)(b,{control:e.control,name:`items`,render:()=>(0,k.jsxs)(v,{children:[(0,k.jsxs)(`div`,{className:`mb-4`,children:[(0,k.jsx)(C,{className:`text-base`,children:a()}),(0,k.jsx)(w,{children:r()})]}),A.map(t=>(0,k.jsx)(b,{control:e.control,name:`items`,render:({field:e})=>(0,k.jsxs)(v,{className:`flex flex-row items-start`,children:[(0,k.jsx)(S,{children:(0,k.jsx)(m,{checked:e.value?.includes(t.id),onCheckedChange:n=>n?e.onChange([...e.value,t.id]):e.onChange(e.value?.filter(e=>e!==t.id))})}),(0,k.jsx)(C,{className:`font-normal`,children:t.label})]},t.id)},t.id)),(0,k.jsx)(T,{})]})}),(0,k.jsx)(p,{type:`submit`,children:i()})]})})}function P(){return(0,k.jsx)(D,{description:o(),title:u(),variant:`section`,children:(0,k.jsx)(N,{})})}var F=P;export{F as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{B as e,F as t,G as n,H as r,I as i,K as a,L as o,R as s,Tu as c,U as l,V as u,W as d,z as f}from"./messages-xqHXgrWc.js";import{t as p}from"./button-BQECWbag.js";import{t as m}from"./checkbox-DeJbPvE-.js";import{c as h,i as g,s as _}from"./zod-BnhDiB7H.js";import{a as v,c as y,i as b,l as x,n as S,o as C,r as w,s as T,t as E}from"./form-DK0bnk5h.js";import{t as D}from"./page-header-C0GHzPxS.js";import{t as O}from"./show-submitted-data-B0wIea74.js";var k=c(),A=[{id:`recents`,label:d()},{id:`home`,label:l()},{id:`applications`,label:r()},{id:`desktop`,label:u()},{id:`downloads`,label:e()},{id:`documents`,label:f()}],j=_({items:g(h()).refine(e=>e.some(e=>e),{message:s()})}),M={items:[`recents`,`home`]};function N(){let e=x({resolver:y(j),defaultValues:M});return(0,k.jsx)(E,{...e,children:(0,k.jsxs)(`form`,{className:`space-y-8`,onSubmit:e.handleSubmit(e=>O(e)),children:[(0,k.jsx)(b,{control:e.control,name:`items`,render:()=>(0,k.jsxs)(v,{children:[(0,k.jsxs)(`div`,{className:`mb-4`,children:[(0,k.jsx)(C,{className:`text-base`,children:o()}),(0,k.jsx)(w,{children:i()})]}),A.map(t=>(0,k.jsx)(b,{control:e.control,name:`items`,render:({field:e})=>(0,k.jsxs)(v,{className:`flex flex-row items-start`,children:[(0,k.jsx)(S,{children:(0,k.jsx)(m,{checked:e.value?.includes(t.id),onCheckedChange:n=>n?e.onChange([...e.value,t.id]):e.onChange(e.value?.filter(e=>e!==t.id))})}),(0,k.jsx)(C,{className:`font-normal`,children:t.label})]},t.id)},t.id)),(0,k.jsx)(T,{})]})}),(0,k.jsx)(p,{type:`submit`,children:t()})]})})}function P(){return(0,k.jsx)(D,{description:n(),title:a(),variant:`section`,children:(0,k.jsx)(N,{})})}var F=P;export{F as component};
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";import{n as r,r as i,t as a}from"./dist-CxCGwIT8.js";import{d as o}from"./button-BQECWbag.js";import{n as s,r as c}from"./dist-DoGn2h1J.js";import{t as l}from"./dist-B8TJsLh2.js";var u=n(e(),1);function d(e,t=globalThis?.document){let n=l(e);u.useEffect(()=>{let e=e=>{e.key===`Escape`&&n(e)};return t.addEventListener(`keydown`,e,{capture:!0}),()=>t.removeEventListener(`keydown`,e,{capture:!0})},[n,t])}var f=t(),p=`DismissableLayer`,m=`dismissableLayer.update`,h=`dismissableLayer.pointerDownOutside`,g=`dismissableLayer.focusOutside`,_,v=u.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),y=u.forwardRef((e,t)=>{let{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:i,onFocusOutside:s,onInteractOutside:l,onDismiss:p,...h}=e,g=u.useContext(v),[y,b]=u.useState(null),x=y?.ownerDocument??globalThis?.document,[,T]=u.useState({}),E=o(t,e=>b(e)),D=Array.from(g.layers),[O]=[...g.layersWithOutsidePointerEventsDisabled].slice(-1),k=D.indexOf(O),A=y?D.indexOf(y):-1,j=g.layersWithOutsidePointerEventsDisabled.size>0,M=A>=k,N=S(e=>{let t=e.target,n=[...g.branches].some(e=>e.contains(t));!M||n||(i?.(e),l?.(e),e.defaultPrevented||p?.())},x),P=C(e=>{let t=e.target;[...g.branches].some(e=>e.contains(t))||(s?.(e),l?.(e),e.defaultPrevented||p?.())},x);return d(e=>{A===g.layers.size-1&&(r?.(e),!e.defaultPrevented&&p&&(e.preventDefault(),p()))},x),u.useEffect(()=>{if(y)return n&&(g.layersWithOutsidePointerEventsDisabled.size===0&&(_=x.body.style.pointerEvents,x.body.style.pointerEvents=`none`),g.layersWithOutsidePointerEventsDisabled.add(y)),g.layers.add(y),w(),()=>{n&&g.layersWithOutsidePointerEventsDisabled.size===1&&(x.body.style.pointerEvents=_)}},[y,x,n,g]),u.useEffect(()=>()=>{y&&(g.layers.delete(y),g.layersWithOutsidePointerEventsDisabled.delete(y),w())},[y,g]),u.useEffect(()=>{let e=()=>T({});return document.addEventListener(m,e),()=>document.removeEventListener(m,e)},[]),(0,f.jsx)(a.div,{...h,ref:E,style:{pointerEvents:j?M?`auto`:`none`:void 0,...e.style},onFocusCapture:c(e.onFocusCapture,P.onFocusCapture),onBlurCapture:c(e.onBlurCapture,P.onBlurCapture),onPointerDownCapture:c(e.onPointerDownCapture,N.onPointerDownCapture)})});y.displayName=p;var b=`DismissableLayerBranch`,x=u.forwardRef((e,t)=>{let n=u.useContext(v),r=u.useRef(null),i=o(t,r);return u.useEffect(()=>{let e=r.current;if(e)return n.branches.add(e),()=>{n.branches.delete(e)}},[n.branches]),(0,f.jsx)(a.div,{...e,ref:i})});x.displayName=b;function S(e,t=globalThis?.document){let n=l(e),r=u.useRef(!1),i=u.useRef(()=>{});return u.useEffect(()=>{let e=e=>{if(e.target&&!r.current){let r=function(){T(h,n,a,{discrete:!0})},a={originalEvent:e};e.pointerType===`touch`?(t.removeEventListener(`click`,i.current),i.current=r,t.addEventListener(`click`,i.current,{once:!0})):r()}else t.removeEventListener(`click`,i.current);r.current=!1},a=window.setTimeout(()=>{t.addEventListener(`pointerdown`,e)},0);return()=>{window.clearTimeout(a),t.removeEventListener(`pointerdown`,e),t.removeEventListener(`click`,i.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function C(e,t=globalThis?.document){let n=l(e),r=u.useRef(!1);return u.useEffect(()=>{let e=e=>{e.target&&!r.current&&T(g,n,{originalEvent:e},{discrete:!1})};return t.addEventListener(`focusin`,e),()=>t.removeEventListener(`focusin`,e)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function w(){let e=new CustomEvent(m);document.dispatchEvent(e)}function T(e,t,n,{discrete:i}){let a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),i?r(a,o):a.dispatchEvent(o)}var E=n(i(),1),D=`Portal`,O=u.forwardRef((e,t)=>{let{container:n,...r}=e,[i,o]=u.useState(!1);s(()=>o(!0),[]);let c=n||i&&globalThis?.document?.body;return c?E.createPortal((0,f.jsx)(a.div,{...r,ref:t}),c):null});O.displayName=D;export{y as n,O as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";import{n as r,r as i,t as a}from"./dist-DJhZSa1-.js";import{d as o}from"./button-D-oR8d6w.js";import{n as s,r as c}from"./dist-DzENW8NP.js";import{t as l}from"./dist-oydJxq9L.js";var u=n(e(),1);function d(e,t=globalThis?.document){let n=l(e);u.useEffect(()=>{let e=e=>{e.key===`Escape`&&n(e)};return t.addEventListener(`keydown`,e,{capture:!0}),()=>t.removeEventListener(`keydown`,e,{capture:!0})},[n,t])}var f=t(),p=`DismissableLayer`,m=`dismissableLayer.update`,h=`dismissableLayer.pointerDownOutside`,g=`dismissableLayer.focusOutside`,_,v=u.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),y=u.forwardRef((e,t)=>{let{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:i,onFocusOutside:s,onInteractOutside:l,onDismiss:p,...h}=e,g=u.useContext(v),[y,b]=u.useState(null),x=y?.ownerDocument??globalThis?.document,[,T]=u.useState({}),E=o(t,e=>b(e)),D=Array.from(g.layers),[O]=[...g.layersWithOutsidePointerEventsDisabled].slice(-1),k=D.indexOf(O),A=y?D.indexOf(y):-1,j=g.layersWithOutsidePointerEventsDisabled.size>0,M=A>=k,N=S(e=>{let t=e.target,n=[...g.branches].some(e=>e.contains(t));!M||n||(i?.(e),l?.(e),e.defaultPrevented||p?.())},x),P=C(e=>{let t=e.target;[...g.branches].some(e=>e.contains(t))||(s?.(e),l?.(e),e.defaultPrevented||p?.())},x);return d(e=>{A===g.layers.size-1&&(r?.(e),!e.defaultPrevented&&p&&(e.preventDefault(),p()))},x),u.useEffect(()=>{if(y)return n&&(g.layersWithOutsidePointerEventsDisabled.size===0&&(_=x.body.style.pointerEvents,x.body.style.pointerEvents=`none`),g.layersWithOutsidePointerEventsDisabled.add(y)),g.layers.add(y),w(),()=>{n&&g.layersWithOutsidePointerEventsDisabled.size===1&&(x.body.style.pointerEvents=_)}},[y,x,n,g]),u.useEffect(()=>()=>{y&&(g.layers.delete(y),g.layersWithOutsidePointerEventsDisabled.delete(y),w())},[y,g]),u.useEffect(()=>{let e=()=>T({});return document.addEventListener(m,e),()=>document.removeEventListener(m,e)},[]),(0,f.jsx)(a.div,{...h,ref:E,style:{pointerEvents:j?M?`auto`:`none`:void 0,...e.style},onFocusCapture:c(e.onFocusCapture,P.onFocusCapture),onBlurCapture:c(e.onBlurCapture,P.onBlurCapture),onPointerDownCapture:c(e.onPointerDownCapture,N.onPointerDownCapture)})});y.displayName=p;var b=`DismissableLayerBranch`,x=u.forwardRef((e,t)=>{let n=u.useContext(v),r=u.useRef(null),i=o(t,r);return u.useEffect(()=>{let e=r.current;if(e)return n.branches.add(e),()=>{n.branches.delete(e)}},[n.branches]),(0,f.jsx)(a.div,{...e,ref:i})});x.displayName=b;function S(e,t=globalThis?.document){let n=l(e),r=u.useRef(!1),i=u.useRef(()=>{});return u.useEffect(()=>{let e=e=>{if(e.target&&!r.current){let r=function(){T(h,n,a,{discrete:!0})},a={originalEvent:e};e.pointerType===`touch`?(t.removeEventListener(`click`,i.current),i.current=r,t.addEventListener(`click`,i.current,{once:!0})):r()}else t.removeEventListener(`click`,i.current);r.current=!1},a=window.setTimeout(()=>{t.addEventListener(`pointerdown`,e)},0);return()=>{window.clearTimeout(a),t.removeEventListener(`pointerdown`,e),t.removeEventListener(`click`,i.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function C(e,t=globalThis?.document){let n=l(e),r=u.useRef(!1);return u.useEffect(()=>{let e=e=>{e.target&&!r.current&&T(g,n,{originalEvent:e},{discrete:!1})};return t.addEventListener(`focusin`,e),()=>t.removeEventListener(`focusin`,e)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function w(){let e=new CustomEvent(m);document.dispatchEvent(e)}function T(e,t,n,{discrete:i}){let a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),i?r(a,o):a.dispatchEvent(o)}var E=n(i(),1),D=`Portal`,O=u.forwardRef((e,t)=>{let{container:n,...r}=e,[i,o]=u.useState(!1);s(()=>o(!0),[]);let c=n||i&&globalThis?.document?.body;return c?E.createPortal((0,f.jsx)(a.div,{...r,ref:t}),c):null});O.displayName=D;export{y as n,O as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,ku as t}from"./messages-xqHXgrWc.js";import{d as n}from"./button-BQECWbag.js";import{n as r}from"./dist-DoGn2h1J.js";var i=t(e(),1);function a(e,t){return i.useReducer((e,n)=>t[e][n]??e,e)}var o=e=>{let{present:t,children:r}=e,a=s(t),o=typeof r==`function`?r({present:a.isPresent}):i.Children.only(r),c=n(a.ref,l(o));return typeof r==`function`||a.isPresent?i.cloneElement(o,{ref:c}):null};o.displayName=`Presence`;function s(e){let[t,n]=i.useState(),o=i.useRef(null),s=i.useRef(e),l=i.useRef(`none`),[u,d]=a(e?`mounted`:`unmounted`,{mounted:{UNMOUNT:`unmounted`,ANIMATION_OUT:`unmountSuspended`},unmountSuspended:{MOUNT:`mounted`,ANIMATION_END:`unmounted`},unmounted:{MOUNT:`mounted`}});return i.useEffect(()=>{let e=c(o.current);l.current=u===`mounted`?e:`none`},[u]),r(()=>{let t=o.current,n=s.current;if(n!==e){let r=l.current,i=c(t);e?d(`MOUNT`):i===`none`||t?.display===`none`?d(`UNMOUNT`):d(n&&r!==i?`ANIMATION_OUT`:`UNMOUNT`),s.current=e}},[e,d]),r(()=>{if(t){let e,n=t.ownerDocument.defaultView??window,r=r=>{let i=c(o.current).includes(CSS.escape(r.animationName));if(r.target===t&&i&&(d(`ANIMATION_END`),!s.current)){let r=t.style.animationFillMode;t.style.animationFillMode=`forwards`,e=n.setTimeout(()=>{t.style.animationFillMode===`forwards`&&(t.style.animationFillMode=r)})}},i=e=>{e.target===t&&(l.current=c(o.current))};return t.addEventListener(`animationstart`,i),t.addEventListener(`animationcancel`,r),t.addEventListener(`animationend`,r),()=>{n.clearTimeout(e),t.removeEventListener(`animationstart`,i),t.removeEventListener(`animationcancel`,r),t.removeEventListener(`animationend`,r)}}else d(`ANIMATION_END`)},[t,d]),{isPresent:[`mounted`,`unmountSuspended`].includes(u),ref:i.useCallback(e=>{o.current=e?getComputedStyle(e):null,n(e)},[])}}function c(e){return e?.animationName||`none`}function l(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}export{o as t};
|
import{$u as e,nd as t}from"./messages-BOl-zx8S.js";import{d as n}from"./button-D-oR8d6w.js";import{n as r}from"./dist-DzENW8NP.js";var i=t(e(),1);function a(e,t){return i.useReducer((e,n)=>t[e][n]??e,e)}var o=e=>{let{present:t,children:r}=e,a=s(t),o=typeof r==`function`?r({present:a.isPresent}):i.Children.only(r),c=n(a.ref,l(o));return typeof r==`function`||a.isPresent?i.cloneElement(o,{ref:c}):null};o.displayName=`Presence`;function s(e){let[t,n]=i.useState(),o=i.useRef(null),s=i.useRef(e),l=i.useRef(`none`),[u,d]=a(e?`mounted`:`unmounted`,{mounted:{UNMOUNT:`unmounted`,ANIMATION_OUT:`unmountSuspended`},unmountSuspended:{MOUNT:`mounted`,ANIMATION_END:`unmounted`},unmounted:{MOUNT:`mounted`}});return i.useEffect(()=>{let e=c(o.current);l.current=u===`mounted`?e:`none`},[u]),r(()=>{let t=o.current,n=s.current;if(n!==e){let r=l.current,i=c(t);e?d(`MOUNT`):i===`none`||t?.display===`none`?d(`UNMOUNT`):d(n&&r!==i?`ANIMATION_OUT`:`UNMOUNT`),s.current=e}},[e,d]),r(()=>{if(t){let e,n=t.ownerDocument.defaultView??window,r=r=>{let i=c(o.current).includes(CSS.escape(r.animationName));if(r.target===t&&i&&(d(`ANIMATION_END`),!s.current)){let r=t.style.animationFillMode;t.style.animationFillMode=`forwards`,e=n.setTimeout(()=>{t.style.animationFillMode===`forwards`&&(t.style.animationFillMode=r)})}},i=e=>{e.target===t&&(l.current=c(o.current))};return t.addEventListener(`animationstart`,i),t.addEventListener(`animationcancel`,r),t.addEventListener(`animationend`,r),()=>{n.clearTimeout(e),t.removeEventListener(`animationstart`,i),t.removeEventListener(`animationcancel`,r),t.removeEventListener(`animationend`,r)}}else d(`ANIMATION_END`)},[t,d]),{isPresent:[`mounted`,`unmountSuspended`].includes(u),ref:i.useCallback(e=>{o.current=e?getComputedStyle(e):null,n(e)},[])}}function c(e){return e?.animationName||`none`}function l(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}export{o as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";var r=n(e(),1),i=t(),a=r.createContext(void 0),o=e=>{let{dir:t,children:n}=e;return(0,i.jsx)(a.Provider,{value:t,children:n})};function s(e){let t=r.useContext(a);return e||t||`ltr`}export{s as n,o as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";var r=n(e(),1),i=t(),a=r.createContext(void 0),o=e=>{let{dir:t,children:n}=e;return(0,i.jsx)(a.Provider,{value:t,children:n})};function s(e){let t=r.useContext(a);return e||t||`ltr`}export{s as n,o as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,ku as t}from"./messages-xqHXgrWc.js";import{n}from"./dist-DoGn2h1J.js";var r=t(e(),1);function i(e){let[t,i]=r.useState(void 0);return n(()=>{if(e){i({width:e.offsetWidth,height:e.offsetHeight});let t=new ResizeObserver(t=>{if(!Array.isArray(t)||!t.length)return;let n=t[0],r,a;if(`borderBoxSize`in n){let e=n.borderBoxSize,t=Array.isArray(e)?e[0]:e;r=t.inlineSize,a=t.blockSize}else r=e.offsetWidth,a=e.offsetHeight;i({width:r,height:a})});return t.observe(e,{box:`border-box`}),()=>t.unobserve(e)}else i(void 0)},[e]),t}export{i as t};
|
import{$u as e,nd as t}from"./messages-BOl-zx8S.js";import{n}from"./dist-DzENW8NP.js";var r=t(e(),1);function i(e){let[t,i]=r.useState(void 0);return n(()=>{if(e){i({width:e.offsetWidth,height:e.offsetHeight});let t=new ResizeObserver(t=>{if(!Array.isArray(t)||!t.length)return;let n=t[0],r,a;if(`borderBoxSize`in n){let e=n.borderBoxSize,t=Array.isArray(e)?e[0]:e;r=t.inlineSize,a=t.blockSize}else r=e.offsetWidth,a=e.offsetHeight;i({width:r,height:a})});return t.observe(e,{box:`border-box`}),()=>t.unobserve(e)}else i(void 0)},[e]),t}export{i as t};
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";import{t as r}from"./dist-CxCGwIT8.js";import{c as i,d as a}from"./button-BQECWbag.js";import{a as o,i as s,r as c,t as l}from"./dist-DoGn2h1J.js";import{t as u}from"./dist-4j1Lrjyz.js";import{n as d}from"./dist-B8TJsLh2.js";import{n as f,t as p}from"./dist-BQFlyo06.js";import{i as m,n as h,r as g,t as _}from"./es2015-DVWRgcTe.js";var v=n(e(),1),y=t(),b=`Dialog`,[x,S]=o(b),[C,w]=x(b),T=e=>{let{__scopeDialog:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!0}=e,s=v.useRef(null),c=v.useRef(null),[u,f]=l({prop:r,defaultProp:i??!1,onChange:a,caller:b});return(0,y.jsx)(C,{scope:t,triggerRef:s,contentRef:c,contentId:d(),titleId:d(),descriptionId:d(),open:u,onOpenChange:f,onOpenToggle:v.useCallback(()=>f(e=>!e),[f]),modal:o,children:n})};T.displayName=b;var E=`DialogTrigger`,D=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,o=w(E,n),s=a(t,o.triggerRef);return(0,y.jsx)(r.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":o.open,"aria-controls":o.contentId,"data-state":q(o.open),...i,ref:s,onClick:c(e.onClick,o.onOpenToggle)})});D.displayName=E;var O=`DialogPortal`,[k,A]=x(O,{forceMount:void 0}),j=e=>{let{__scopeDialog:t,forceMount:n,children:r,container:i}=e,a=w(O,t);return(0,y.jsx)(k,{scope:t,forceMount:n,children:v.Children.map(r,e=>(0,y.jsx)(u,{present:n||a.open,children:(0,y.jsx)(p,{asChild:!0,container:i,children:e})}))})};j.displayName=O;var M=`DialogOverlay`,N=v.forwardRef((e,t)=>{let n=A(M,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=w(M,e.__scopeDialog);return a.modal?(0,y.jsx)(u,{present:r||a.open,children:(0,y.jsx)(F,{...i,ref:t})}):null});N.displayName=M;var P=i(`DialogOverlay.RemoveScroll`),F=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(M,n);return(0,y.jsx)(h,{as:P,allowPinchZoom:!0,shards:[a.contentRef],children:(0,y.jsx)(r.div,{"data-state":q(a.open),...i,ref:t,style:{pointerEvents:`auto`,...i.style}})})}),I=`DialogContent`,L=v.forwardRef((e,t)=>{let n=A(I,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=w(I,e.__scopeDialog);return(0,y.jsx)(u,{present:r||a.open,children:a.modal?(0,y.jsx)(R,{...i,ref:t}):(0,y.jsx)(z,{...i,ref:t})})});L.displayName=I;var R=v.forwardRef((e,t)=>{let n=w(I,e.__scopeDialog),r=v.useRef(null),i=a(t,n.contentRef,r);return v.useEffect(()=>{let e=r.current;if(e)return _(e)},[]),(0,y.jsx)(B,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:c(e.onCloseAutoFocus,e=>{e.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:c(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;(t.button===2||n)&&e.preventDefault()}),onFocusOutside:c(e.onFocusOutside,e=>e.preventDefault())})}),z=v.forwardRef((e,t)=>{let n=w(I,e.__scopeDialog),r=v.useRef(!1),i=v.useRef(!1);return(0,y.jsx)(B,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})}),B=v.forwardRef((e,t)=>{let{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:o,...s}=e,c=w(I,n),l=v.useRef(null),u=a(t,l);return g(),(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:o,children:(0,y.jsx)(f,{role:`dialog`,id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":q(c.open),...s,ref:u,onDismiss:()=>c.onOpenChange(!1)})}),(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(Z,{titleId:c.titleId}),(0,y.jsx)($,{contentRef:l,descriptionId:c.descriptionId})]})]})}),V=`DialogTitle`,H=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(V,n);return(0,y.jsx)(r.h2,{id:a.titleId,...i,ref:t})});H.displayName=V;var U=`DialogDescription`,W=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(U,n);return(0,y.jsx)(r.p,{id:a.descriptionId,...i,ref:t})});W.displayName=U;var G=`DialogClose`,K=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(G,n);return(0,y.jsx)(r.button,{type:`button`,...i,ref:t,onClick:c(e.onClick,()=>a.onOpenChange(!1))})});K.displayName=G;function q(e){return e?`open`:`closed`}var J=`DialogTitleWarning`,[Y,X]=s(J,{contentName:I,titleName:V,docsSlug:`dialog`}),Z=({titleId:e})=>{let t=X(J),n=`\`${t.contentName}\` requires a \`${t.titleName}\` for the component to be accessible for screen reader users.
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";import{t as r}from"./dist-DJhZSa1-.js";import{c as i,d as a}from"./button-D-oR8d6w.js";import{a as o,i as s,r as c,t as l}from"./dist-DzENW8NP.js";import{t as u}from"./dist-BZg_Jfik.js";import{n as d}from"./dist-oydJxq9L.js";import{n as f,t as p}from"./dist-BPKZF5GI.js";import{i as m,n as h,r as g,t as _}from"./es2015-DRmlSfkW.js";var v=n(e(),1),y=t(),b=`Dialog`,[x,S]=o(b),[C,w]=x(b),T=e=>{let{__scopeDialog:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!0}=e,s=v.useRef(null),c=v.useRef(null),[u,f]=l({prop:r,defaultProp:i??!1,onChange:a,caller:b});return(0,y.jsx)(C,{scope:t,triggerRef:s,contentRef:c,contentId:d(),titleId:d(),descriptionId:d(),open:u,onOpenChange:f,onOpenToggle:v.useCallback(()=>f(e=>!e),[f]),modal:o,children:n})};T.displayName=b;var E=`DialogTrigger`,D=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,o=w(E,n),s=a(t,o.triggerRef);return(0,y.jsx)(r.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":o.open,"aria-controls":o.contentId,"data-state":q(o.open),...i,ref:s,onClick:c(e.onClick,o.onOpenToggle)})});D.displayName=E;var O=`DialogPortal`,[k,A]=x(O,{forceMount:void 0}),j=e=>{let{__scopeDialog:t,forceMount:n,children:r,container:i}=e,a=w(O,t);return(0,y.jsx)(k,{scope:t,forceMount:n,children:v.Children.map(r,e=>(0,y.jsx)(u,{present:n||a.open,children:(0,y.jsx)(p,{asChild:!0,container:i,children:e})}))})};j.displayName=O;var M=`DialogOverlay`,N=v.forwardRef((e,t)=>{let n=A(M,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=w(M,e.__scopeDialog);return a.modal?(0,y.jsx)(u,{present:r||a.open,children:(0,y.jsx)(F,{...i,ref:t})}):null});N.displayName=M;var P=i(`DialogOverlay.RemoveScroll`),F=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(M,n);return(0,y.jsx)(h,{as:P,allowPinchZoom:!0,shards:[a.contentRef],children:(0,y.jsx)(r.div,{"data-state":q(a.open),...i,ref:t,style:{pointerEvents:`auto`,...i.style}})})}),I=`DialogContent`,L=v.forwardRef((e,t)=>{let n=A(I,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=w(I,e.__scopeDialog);return(0,y.jsx)(u,{present:r||a.open,children:a.modal?(0,y.jsx)(R,{...i,ref:t}):(0,y.jsx)(z,{...i,ref:t})})});L.displayName=I;var R=v.forwardRef((e,t)=>{let n=w(I,e.__scopeDialog),r=v.useRef(null),i=a(t,n.contentRef,r);return v.useEffect(()=>{let e=r.current;if(e)return _(e)},[]),(0,y.jsx)(B,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:c(e.onCloseAutoFocus,e=>{e.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:c(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;(t.button===2||n)&&e.preventDefault()}),onFocusOutside:c(e.onFocusOutside,e=>e.preventDefault())})}),z=v.forwardRef((e,t)=>{let n=w(I,e.__scopeDialog),r=v.useRef(!1),i=v.useRef(!1);return(0,y.jsx)(B,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})}),B=v.forwardRef((e,t)=>{let{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:o,...s}=e,c=w(I,n),l=v.useRef(null),u=a(t,l);return g(),(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:o,children:(0,y.jsx)(f,{role:`dialog`,id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":q(c.open),...s,ref:u,onDismiss:()=>c.onOpenChange(!1)})}),(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(Z,{titleId:c.titleId}),(0,y.jsx)($,{contentRef:l,descriptionId:c.descriptionId})]})]})}),V=`DialogTitle`,H=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(V,n);return(0,y.jsx)(r.h2,{id:a.titleId,...i,ref:t})});H.displayName=V;var U=`DialogDescription`,W=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(U,n);return(0,y.jsx)(r.p,{id:a.descriptionId,...i,ref:t})});W.displayName=U;var G=`DialogClose`,K=v.forwardRef((e,t)=>{let{__scopeDialog:n,...i}=e,a=w(G,n);return(0,y.jsx)(r.button,{type:`button`,...i,ref:t,onClick:c(e.onClick,()=>a.onOpenChange(!1))})});K.displayName=G;function q(e){return e?`open`:`closed`}var J=`DialogTitleWarning`,[Y,X]=s(J,{contentName:I,titleName:V,docsSlug:`dialog`}),Z=({titleId:e})=>{let t=X(J),n=`\`${t.contentName}\` requires a \`${t.titleName}\` for the component to be accessible for screen reader users.
|
||||||
|
|
||||||
If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component.
|
If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component.
|
||||||
|
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";import{t as r}from"./dist-CxCGwIT8.js";import{d as i}from"./button-BQECWbag.js";import{a,r as o,t as s}from"./dist-DoGn2h1J.js";import{n as c,r as l,t as u}from"./dist-DQ662yCu.js";import{t as d}from"./dist-4j1Lrjyz.js";import{n as f}from"./dist-pzMFqYMR.js";import{t as p}from"./dist-CeQDKZ9c.js";import{t as m}from"./dist-B1wXypYC.js";var h=n(e(),1),g=t(),_=`Radio`,[v,y]=a(_),[b,x]=v(_),S=h.forwardRef((e,t)=>{let{__scopeRadio:n,name:a,checked:s=!1,required:c,disabled:l,value:u=`on`,onCheck:d,form:f,...p}=e,[m,_]=h.useState(null),v=i(t,e=>_(e)),y=h.useRef(!1),x=m?f||!!m.closest(`form`):!0;return(0,g.jsxs)(b,{scope:n,checked:s,disabled:l,children:[(0,g.jsx)(r.button,{type:`button`,role:`radio`,"aria-checked":s,"data-state":D(s),"data-disabled":l?``:void 0,disabled:l,value:u,...p,ref:v,onClick:o(e.onClick,e=>{s||d?.(),x&&(y.current=e.isPropagationStopped(),y.current||e.stopPropagation())})}),x&&(0,g.jsx)(E,{control:m,bubbles:!y.current,name:a,value:u,checked:s,required:c,disabled:l,form:f,style:{transform:`translateX(-100%)`}})]})});S.displayName=_;var C=`RadioIndicator`,w=h.forwardRef((e,t)=>{let{__scopeRadio:n,forceMount:i,...a}=e,o=x(C,n);return(0,g.jsx)(d,{present:i||o.checked,children:(0,g.jsx)(r.span,{"data-state":D(o.checked),"data-disabled":o.disabled?``:void 0,...a,ref:t})})});w.displayName=C;var T=`RadioBubbleInput`,E=h.forwardRef(({__scopeRadio:e,control:t,checked:n,bubbles:a=!0,...o},s)=>{let c=h.useRef(null),l=i(c,s),u=p(n),d=m(t);return h.useEffect(()=>{let e=c.current;if(!e)return;let t=window.HTMLInputElement.prototype,r=Object.getOwnPropertyDescriptor(t,`checked`).set;if(u!==n&&r){let t=new Event(`click`,{bubbles:a});r.call(e,n),e.dispatchEvent(t)}},[u,n,a]),(0,g.jsx)(r.input,{type:`radio`,"aria-hidden":!0,defaultChecked:n,...o,tabIndex:-1,ref:l,style:{...o.style,...d,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0}})});E.displayName=T;function D(e){return e?`checked`:`unchecked`}var O=[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`],k=`RadioGroup`,[A,j]=a(k,[l,y]),M=l(),N=y(),[P,F]=A(k),I=h.forwardRef((e,t)=>{let{__scopeRadioGroup:n,name:i,defaultValue:a,value:o,required:l=!1,disabled:u=!1,orientation:d,dir:p,loop:m=!0,onValueChange:h,..._}=e,v=M(n),y=f(p),[b,x]=s({prop:o,defaultProp:a??null,onChange:h,caller:k});return(0,g.jsx)(P,{scope:n,name:i,required:l,disabled:u,value:b,onValueChange:x,children:(0,g.jsx)(c,{asChild:!0,...v,orientation:d,dir:y,loop:m,children:(0,g.jsx)(r.div,{role:`radiogroup`,"aria-required":l,"aria-orientation":d,"data-disabled":u?``:void 0,dir:y,..._,ref:t})})})});I.displayName=k;var L=`RadioGroupItem`,R=h.forwardRef((e,t)=>{let{__scopeRadioGroup:n,disabled:r,...a}=e,s=F(L,n),c=s.disabled||r,l=M(n),d=N(n),f=h.useRef(null),p=i(t,f),m=s.value===a.value,_=h.useRef(!1);return h.useEffect(()=>{let e=e=>{O.includes(e.key)&&(_.current=!0)},t=()=>_.current=!1;return document.addEventListener(`keydown`,e),document.addEventListener(`keyup`,t),()=>{document.removeEventListener(`keydown`,e),document.removeEventListener(`keyup`,t)}},[]),(0,g.jsx)(u,{asChild:!0,...l,focusable:!c,active:m,children:(0,g.jsx)(S,{disabled:c,required:s.required,checked:m,...d,...a,name:s.name,ref:p,onCheck:()=>s.onValueChange(a.value),onKeyDown:o(e=>{e.key===`Enter`&&e.preventDefault()}),onFocus:o(a.onFocus,()=>{_.current&&f.current?.click()})})})});R.displayName=L;var z=`RadioGroupIndicator`,B=h.forwardRef((e,t)=>{let{__scopeRadioGroup:n,...r}=e;return(0,g.jsx)(w,{...N(n),...r,ref:t})});B.displayName=z;var V=I,H=R,U=B;export{H as n,V as r,U as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";import{t as r}from"./dist-DJhZSa1-.js";import{d as i}from"./button-D-oR8d6w.js";import{a,r as o,t as s}from"./dist-DzENW8NP.js";import{n as c,r as l,t as u}from"./dist-CT2DjA94.js";import{t as d}from"./dist-BZg_Jfik.js";import{n as f}from"./dist-BeVKhAtj.js";import{t as p}from"./dist-QGW08nls.js";import{t as m}from"./dist-Bh3bGrZa.js";var h=n(e(),1),g=t(),_=`Radio`,[v,y]=a(_),[b,x]=v(_),S=h.forwardRef((e,t)=>{let{__scopeRadio:n,name:a,checked:s=!1,required:c,disabled:l,value:u=`on`,onCheck:d,form:f,...p}=e,[m,_]=h.useState(null),v=i(t,e=>_(e)),y=h.useRef(!1),x=m?f||!!m.closest(`form`):!0;return(0,g.jsxs)(b,{scope:n,checked:s,disabled:l,children:[(0,g.jsx)(r.button,{type:`button`,role:`radio`,"aria-checked":s,"data-state":D(s),"data-disabled":l?``:void 0,disabled:l,value:u,...p,ref:v,onClick:o(e.onClick,e=>{s||d?.(),x&&(y.current=e.isPropagationStopped(),y.current||e.stopPropagation())})}),x&&(0,g.jsx)(E,{control:m,bubbles:!y.current,name:a,value:u,checked:s,required:c,disabled:l,form:f,style:{transform:`translateX(-100%)`}})]})});S.displayName=_;var C=`RadioIndicator`,w=h.forwardRef((e,t)=>{let{__scopeRadio:n,forceMount:i,...a}=e,o=x(C,n);return(0,g.jsx)(d,{present:i||o.checked,children:(0,g.jsx)(r.span,{"data-state":D(o.checked),"data-disabled":o.disabled?``:void 0,...a,ref:t})})});w.displayName=C;var T=`RadioBubbleInput`,E=h.forwardRef(({__scopeRadio:e,control:t,checked:n,bubbles:a=!0,...o},s)=>{let c=h.useRef(null),l=i(c,s),u=p(n),d=m(t);return h.useEffect(()=>{let e=c.current;if(!e)return;let t=window.HTMLInputElement.prototype,r=Object.getOwnPropertyDescriptor(t,`checked`).set;if(u!==n&&r){let t=new Event(`click`,{bubbles:a});r.call(e,n),e.dispatchEvent(t)}},[u,n,a]),(0,g.jsx)(r.input,{type:`radio`,"aria-hidden":!0,defaultChecked:n,...o,tabIndex:-1,ref:l,style:{...o.style,...d,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0}})});E.displayName=T;function D(e){return e?`checked`:`unchecked`}var O=[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`],k=`RadioGroup`,[A,j]=a(k,[l,y]),M=l(),N=y(),[P,F]=A(k),I=h.forwardRef((e,t)=>{let{__scopeRadioGroup:n,name:i,defaultValue:a,value:o,required:l=!1,disabled:u=!1,orientation:d,dir:p,loop:m=!0,onValueChange:h,..._}=e,v=M(n),y=f(p),[b,x]=s({prop:o,defaultProp:a??null,onChange:h,caller:k});return(0,g.jsx)(P,{scope:n,name:i,required:l,disabled:u,value:b,onValueChange:x,children:(0,g.jsx)(c,{asChild:!0,...v,orientation:d,dir:y,loop:m,children:(0,g.jsx)(r.div,{role:`radiogroup`,"aria-required":l,"aria-orientation":d,"data-disabled":u?``:void 0,dir:y,..._,ref:t})})})});I.displayName=k;var L=`RadioGroupItem`,R=h.forwardRef((e,t)=>{let{__scopeRadioGroup:n,disabled:r,...a}=e,s=F(L,n),c=s.disabled||r,l=M(n),d=N(n),f=h.useRef(null),p=i(t,f),m=s.value===a.value,_=h.useRef(!1);return h.useEffect(()=>{let e=e=>{O.includes(e.key)&&(_.current=!0)},t=()=>_.current=!1;return document.addEventListener(`keydown`,e),document.addEventListener(`keyup`,t),()=>{document.removeEventListener(`keydown`,e),document.removeEventListener(`keyup`,t)}},[]),(0,g.jsx)(u,{asChild:!0,...l,focusable:!c,active:m,children:(0,g.jsx)(S,{disabled:c,required:s.required,checked:m,...d,...a,name:s.name,ref:p,onCheck:()=>s.onValueChange(a.value),onKeyDown:o(e=>{e.key===`Enter`&&e.preventDefault()}),onFocus:o(a.onFocus,()=>{_.current&&f.current?.click()})})})});R.displayName=L;var z=`RadioGroupIndicator`,B=h.forwardRef((e,t)=>{let{__scopeRadioGroup:n,...r}=e;return(0,g.jsx)(w,{...N(n),...r,ref:t})});B.displayName=z;var V=I,H=R,U=B;export{H as n,V as r,U as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";import{t as r}from"./dist-CxCGwIT8.js";import{c as i,d as a}from"./button-BQECWbag.js";import{a as o,r as s,t as c}from"./dist-DoGn2h1J.js";import{n as l,t as u}from"./dist-B8TJsLh2.js";import{n as d}from"./dist-pzMFqYMR.js";var f=n(e(),1),p=t();function m(e){let t=e+`CollectionProvider`,[n,r]=o(t),[s,c]=n(t,{collectionRef:{current:null},itemMap:new Map}),l=e=>{let{scope:t,children:n}=e,r=f.useRef(null),i=f.useRef(new Map).current;return(0,p.jsx)(s,{scope:t,itemMap:i,collectionRef:r,children:n})};l.displayName=t;let u=e+`CollectionSlot`,d=i(u),m=f.forwardRef((e,t)=>{let{scope:n,children:r}=e;return(0,p.jsx)(d,{ref:a(t,c(u,n).collectionRef),children:r})});m.displayName=u;let h=e+`CollectionItemSlot`,g=`data-radix-collection-item`,_=i(h),v=f.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=f.useRef(null),s=a(t,o),l=c(h,n);return f.useEffect(()=>(l.itemMap.set(o,{ref:o,...i}),()=>void l.itemMap.delete(o))),(0,p.jsx)(_,{[g]:``,ref:s,children:r})});v.displayName=h;function y(t){let n=c(e+`CollectionConsumer`,t);return f.useCallback(()=>{let e=n.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll(`[${g}]`));return Array.from(n.itemMap.values()).sort((e,n)=>t.indexOf(e.ref.current)-t.indexOf(n.ref.current))},[n.collectionRef,n.itemMap])}return[{Provider:l,Slot:m,ItemSlot:v},y,r]}var h=`rovingFocusGroup.onEntryFocus`,g={bubbles:!1,cancelable:!0},_=`RovingFocusGroup`,[v,y,b]=m(_),[x,S]=o(_,[b]),[C,w]=x(_),T=f.forwardRef((e,t)=>(0,p.jsx)(v.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,p.jsx)(v.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,p.jsx)(E,{...e,ref:t})})}));T.displayName=_;var E=f.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:n,orientation:i,loop:o=!1,dir:l,currentTabStopId:m,defaultCurrentTabStopId:v,onCurrentTabStopIdChange:b,onEntryFocus:x,preventScrollOnEntryFocus:S=!1,...w}=e,T=f.useRef(null),E=a(t,T),D=d(l),[O,k]=c({prop:m,defaultProp:v??null,onChange:b,caller:_}),[A,j]=f.useState(!1),N=u(x),P=y(n),F=f.useRef(!1),[I,L]=f.useState(0);return f.useEffect(()=>{let e=T.current;if(e)return e.addEventListener(h,N),()=>e.removeEventListener(h,N)},[N]),(0,p.jsx)(C,{scope:n,orientation:i,dir:D,loop:o,currentTabStopId:O,onItemFocus:f.useCallback(e=>k(e),[k]),onItemShiftTab:f.useCallback(()=>j(!0),[]),onFocusableItemAdd:f.useCallback(()=>L(e=>e+1),[]),onFocusableItemRemove:f.useCallback(()=>L(e=>e-1),[]),children:(0,p.jsx)(r.div,{tabIndex:A||I===0?-1:0,"data-orientation":i,...w,ref:E,style:{outline:`none`,...e.style},onMouseDown:s(e.onMouseDown,()=>{F.current=!0}),onFocus:s(e.onFocus,e=>{let t=!F.current;if(e.target===e.currentTarget&&t&&!A){let t=new CustomEvent(h,g);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=P().filter(e=>e.focusable);M([e.find(e=>e.active),e.find(e=>e.id===O),...e].filter(Boolean).map(e=>e.ref.current),S)}}F.current=!1}),onBlur:s(e.onBlur,()=>j(!1))})})}),D=`RovingFocusGroupItem`,O=f.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:n,focusable:i=!0,active:a=!1,tabStopId:o,children:c,...u}=e,d=l(),m=o||d,h=w(D,n),g=h.currentTabStopId===m,_=y(n),{onFocusableItemAdd:b,onFocusableItemRemove:x,currentTabStopId:S}=h;return f.useEffect(()=>{if(i)return b(),()=>x()},[i,b,x]),(0,p.jsx)(v.ItemSlot,{scope:n,id:m,focusable:i,active:a,children:(0,p.jsx)(r.span,{tabIndex:g?0:-1,"data-orientation":h.orientation,...u,ref:t,onMouseDown:s(e.onMouseDown,e=>{i?h.onItemFocus(m):e.preventDefault()}),onFocus:s(e.onFocus,()=>h.onItemFocus(m)),onKeyDown:s(e.onKeyDown,e=>{if(e.key===`Tab`&&e.shiftKey){h.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=j(e,h.orientation,h.dir);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let n=_().filter(e=>e.focusable).map(e=>e.ref.current);if(t===`last`)n.reverse();else if(t===`prev`||t===`next`){t===`prev`&&n.reverse();let r=n.indexOf(e.currentTarget);n=h.loop?N(n,r+1):n.slice(r+1)}setTimeout(()=>M(n))}}),children:typeof c==`function`?c({isCurrentTabStop:g,hasTabStop:S!=null}):c})})});O.displayName=D;var k={ArrowLeft:`prev`,ArrowUp:`prev`,ArrowRight:`next`,ArrowDown:`next`,PageUp:`first`,Home:`first`,PageDown:`last`,End:`last`};function A(e,t){return t===`rtl`?e===`ArrowLeft`?`ArrowRight`:e===`ArrowRight`?`ArrowLeft`:e:e}function j(e,t,n){let r=A(e.key,n);if(!(t===`vertical`&&[`ArrowLeft`,`ArrowRight`].includes(r))&&!(t===`horizontal`&&[`ArrowUp`,`ArrowDown`].includes(r)))return k[r]}function M(e,t=!1){let n=document.activeElement;for(let r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}function N(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var P=T,F=O;export{m as i,P as n,S as r,F as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";import{t as r}from"./dist-DJhZSa1-.js";import{c as i,d as a}from"./button-D-oR8d6w.js";import{a as o,r as s,t as c}from"./dist-DzENW8NP.js";import{n as l,t as u}from"./dist-oydJxq9L.js";import{n as d}from"./dist-BeVKhAtj.js";var f=n(e(),1),p=t();function m(e){let t=e+`CollectionProvider`,[n,r]=o(t),[s,c]=n(t,{collectionRef:{current:null},itemMap:new Map}),l=e=>{let{scope:t,children:n}=e,r=f.useRef(null),i=f.useRef(new Map).current;return(0,p.jsx)(s,{scope:t,itemMap:i,collectionRef:r,children:n})};l.displayName=t;let u=e+`CollectionSlot`,d=i(u),m=f.forwardRef((e,t)=>{let{scope:n,children:r}=e;return(0,p.jsx)(d,{ref:a(t,c(u,n).collectionRef),children:r})});m.displayName=u;let h=e+`CollectionItemSlot`,g=`data-radix-collection-item`,_=i(h),v=f.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=f.useRef(null),s=a(t,o),l=c(h,n);return f.useEffect(()=>(l.itemMap.set(o,{ref:o,...i}),()=>void l.itemMap.delete(o))),(0,p.jsx)(_,{[g]:``,ref:s,children:r})});v.displayName=h;function y(t){let n=c(e+`CollectionConsumer`,t);return f.useCallback(()=>{let e=n.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll(`[${g}]`));return Array.from(n.itemMap.values()).sort((e,n)=>t.indexOf(e.ref.current)-t.indexOf(n.ref.current))},[n.collectionRef,n.itemMap])}return[{Provider:l,Slot:m,ItemSlot:v},y,r]}var h=`rovingFocusGroup.onEntryFocus`,g={bubbles:!1,cancelable:!0},_=`RovingFocusGroup`,[v,y,b]=m(_),[x,S]=o(_,[b]),[C,w]=x(_),T=f.forwardRef((e,t)=>(0,p.jsx)(v.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,p.jsx)(v.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,p.jsx)(E,{...e,ref:t})})}));T.displayName=_;var E=f.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:n,orientation:i,loop:o=!1,dir:l,currentTabStopId:m,defaultCurrentTabStopId:v,onCurrentTabStopIdChange:b,onEntryFocus:x,preventScrollOnEntryFocus:S=!1,...w}=e,T=f.useRef(null),E=a(t,T),D=d(l),[O,k]=c({prop:m,defaultProp:v??null,onChange:b,caller:_}),[A,j]=f.useState(!1),N=u(x),P=y(n),F=f.useRef(!1),[I,L]=f.useState(0);return f.useEffect(()=>{let e=T.current;if(e)return e.addEventListener(h,N),()=>e.removeEventListener(h,N)},[N]),(0,p.jsx)(C,{scope:n,orientation:i,dir:D,loop:o,currentTabStopId:O,onItemFocus:f.useCallback(e=>k(e),[k]),onItemShiftTab:f.useCallback(()=>j(!0),[]),onFocusableItemAdd:f.useCallback(()=>L(e=>e+1),[]),onFocusableItemRemove:f.useCallback(()=>L(e=>e-1),[]),children:(0,p.jsx)(r.div,{tabIndex:A||I===0?-1:0,"data-orientation":i,...w,ref:E,style:{outline:`none`,...e.style},onMouseDown:s(e.onMouseDown,()=>{F.current=!0}),onFocus:s(e.onFocus,e=>{let t=!F.current;if(e.target===e.currentTarget&&t&&!A){let t=new CustomEvent(h,g);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=P().filter(e=>e.focusable);M([e.find(e=>e.active),e.find(e=>e.id===O),...e].filter(Boolean).map(e=>e.ref.current),S)}}F.current=!1}),onBlur:s(e.onBlur,()=>j(!1))})})}),D=`RovingFocusGroupItem`,O=f.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:n,focusable:i=!0,active:a=!1,tabStopId:o,children:c,...u}=e,d=l(),m=o||d,h=w(D,n),g=h.currentTabStopId===m,_=y(n),{onFocusableItemAdd:b,onFocusableItemRemove:x,currentTabStopId:S}=h;return f.useEffect(()=>{if(i)return b(),()=>x()},[i,b,x]),(0,p.jsx)(v.ItemSlot,{scope:n,id:m,focusable:i,active:a,children:(0,p.jsx)(r.span,{tabIndex:g?0:-1,"data-orientation":h.orientation,...u,ref:t,onMouseDown:s(e.onMouseDown,e=>{i?h.onItemFocus(m):e.preventDefault()}),onFocus:s(e.onFocus,()=>h.onItemFocus(m)),onKeyDown:s(e.onKeyDown,e=>{if(e.key===`Tab`&&e.shiftKey){h.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=j(e,h.orientation,h.dir);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let n=_().filter(e=>e.focusable).map(e=>e.ref.current);if(t===`last`)n.reverse();else if(t===`prev`||t===`next`){t===`prev`&&n.reverse();let r=n.indexOf(e.currentTarget);n=h.loop?N(n,r+1):n.slice(r+1)}setTimeout(()=>M(n))}}),children:typeof c==`function`?c({isCurrentTabStop:g,hasTabStop:S!=null}):c})})});O.displayName=D;var k={ArrowLeft:`prev`,ArrowUp:`prev`,ArrowRight:`next`,ArrowDown:`next`,PageUp:`first`,Home:`first`,PageDown:`last`,End:`last`};function A(e,t){return t===`rtl`?e===`ArrowLeft`?`ArrowRight`:e===`ArrowRight`?`ArrowLeft`:e:e}function j(e,t,n){let r=A(e.key,n);if(!(t===`vertical`&&[`ArrowLeft`,`ArrowRight`].includes(r))&&!(t===`horizontal`&&[`ArrowUp`,`ArrowDown`].includes(r)))return k[r]}function M(e,t=!1){let n=document.activeElement;for(let r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}function N(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var P=T,F=O;export{m as i,P as n,S as r,F as t};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{Du as e,Eu as t,Tu as n,ku as r}from"./messages-xqHXgrWc.js";import{c as i}from"./button-BQECWbag.js";var a=e((e=>{var n=t();function r(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function i(){}var a={d:{f:i,r:function(){throw Error(r(522))},D:i,C:i,L:i,m:i,X:i,S:i,M:i},p:0,findDOMNode:null},o=Symbol.for(`react.portal`);function s(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:o,key:r==null?null:``+r,children:e,containerInfo:t,implementation:n}}var c=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function l(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}e.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=a,e.createPortal=function(e,t){var n=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(r(299));return s(e,t,null,n)},e.flushSync=function(e){var t=c.T,n=a.p;try{if(c.T=null,a.p=2,e)return e()}finally{c.T=t,a.p=n,a.d.f()}},e.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,a.d.C(e,t))},e.prefetchDNS=function(e){typeof e==`string`&&a.d.D(e)},e.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=l(n,t.crossOrigin),i=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?a.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:i,fetchPriority:o}):n===`script`&&a.d.X(e,{crossOrigin:r,integrity:i,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},e.preinitModule=function(e,t){if(typeof e==`string`)if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=l(t.as,t.crossOrigin);a.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0})}}else t??a.d.M(e)},e.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=l(n,t.crossOrigin);a.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},e.preloadModule=function(e,t){if(typeof e==`string`)if(t){var n=l(t.as,t.crossOrigin);a.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0})}else a.d.m(e)},e.requestFormReset=function(e){a.d.r(e)},e.unstable_batchedUpdates=function(e,t){return e(t)},e.useFormState=function(e,t,n){return c.H.useFormState(e,t,n)},e.useFormStatus=function(){return c.H.useHostTransitionStatus()},e.version=`19.2.5`})),o=e(((e,t)=>{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=r(t(),1),c=r(o(),1),l=n(),u=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=i(`Primitive.${t}`),r=s.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,l.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function d(e,t){e&&c.flushSync(()=>e.dispatchEvent(t))}export{d as n,o as r,u as t};
|
import{$u as e,Qu as t,ed as n,nd as r}from"./messages-BOl-zx8S.js";import{c as i}from"./button-D-oR8d6w.js";var a=n((t=>{var n=e();function r(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function i(){}var a={d:{f:i,r:function(){throw Error(r(522))},D:i,C:i,L:i,m:i,X:i,S:i,M:i},p:0,findDOMNode:null},o=Symbol.for(`react.portal`);function s(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:o,key:r==null?null:``+r,children:e,containerInfo:t,implementation:n}}var c=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function l(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}t.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=a,t.createPortal=function(e,t){var n=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(r(299));return s(e,t,null,n)},t.flushSync=function(e){var t=c.T,n=a.p;try{if(c.T=null,a.p=2,e)return e()}finally{c.T=t,a.p=n,a.d.f()}},t.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,a.d.C(e,t))},t.prefetchDNS=function(e){typeof e==`string`&&a.d.D(e)},t.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=l(n,t.crossOrigin),i=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?a.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:i,fetchPriority:o}):n===`script`&&a.d.X(e,{crossOrigin:r,integrity:i,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},t.preinitModule=function(e,t){if(typeof e==`string`)if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=l(t.as,t.crossOrigin);a.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0})}}else t??a.d.M(e)},t.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=l(n,t.crossOrigin);a.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},t.preloadModule=function(e,t){if(typeof e==`string`)if(t){var n=l(t.as,t.crossOrigin);a.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0})}else a.d.m(e)},t.requestFormReset=function(e){a.d.r(e)},t.unstable_batchedUpdates=function(e,t){return e(t)},t.useFormState=function(e,t,n){return c.H.useFormState(e,t,n)},t.useFormStatus=function(){return c.H.useHostTransitionStatus()},t.version=`19.2.5`})),o=n(((e,t)=>{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=r(e(),1),c=r(o(),1),l=t(),u=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=i(`Primitive.${t}`),r=s.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,l.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function d(e,t){e&&c.flushSync(()=>e.dispatchEvent(t))}export{d as n,o as r,u as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";var r=n(e(),1),i=t();function a(e,t){let n=r.createContext(t),a=e=>{let{children:t,...a}=e,o=r.useMemo(()=>a,Object.values(a));return(0,i.jsx)(n.Provider,{value:o,children:t})};a.displayName=e+`Provider`;function o(i){let a=r.useContext(n);if(a)return a;if(t!==void 0)return t;throw Error(`\`${i}\` must be used within \`${e}\``)}return[a,o]}function o(e,t=[]){let n=[];function a(t,a){let o=r.createContext(a),s=n.length;n=[...n,a];let c=t=>{let{scope:n,children:a,...c}=t,l=n?.[e]?.[s]||o,u=r.useMemo(()=>c,Object.values(c));return(0,i.jsx)(l.Provider,{value:u,children:a})};c.displayName=t+`Provider`;function l(n,i){let c=i?.[e]?.[s]||o,l=r.useContext(c);if(l)return l;if(a!==void 0)return a;throw Error(`\`${n}\` must be used within \`${t}\``)}return[c,l]}let o=()=>{let t=n.map(e=>r.createContext(e));return function(n){let i=n?.[e]||t;return r.useMemo(()=>({[`__scope${e}`]:{...n,[e]:i}}),[n,i])}};return o.scopeName=e,[a,s(o,...t)]}function s(...e){let t=e[0];if(e.length===1)return t;let n=()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let i=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return r.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}typeof window<`u`&&window.document&&window.document.createElement;function c(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),n===!1||!r.defaultPrevented)return t?.(r)}}var l=globalThis?.document?r.useLayoutEffect:()=>{},u=r.useInsertionEffect||l;function d({prop:e,defaultProp:t,onChange:n=()=>{},caller:i}){let[a,o,s]=f({defaultProp:t,onChange:n}),c=e!==void 0,l=c?e:a;{let t=r.useRef(e!==void 0);r.useEffect(()=>{let e=t.current;e!==c&&console.warn(`${i} is changing from ${e?`controlled`:`uncontrolled`} to ${c?`controlled`:`uncontrolled`}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),t.current=c},[c,i])}return[l,r.useCallback(t=>{if(c){let n=p(t)?t(e):t;n!==e&&s.current?.(n)}else o(t)},[c,e,o,s])]}function f({defaultProp:e,onChange:t}){let[n,i]=r.useState(e),a=r.useRef(n),o=r.useRef(t);return u(()=>{o.current=t},[t]),r.useEffect(()=>{a.current!==n&&(o.current?.(n),a.current=n)},[n,a]),[n,i,o]}function p(e){return typeof e==`function`}export{o as a,a as i,l as n,c as r,d as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";var r=n(e(),1),i=t();function a(e,t){let n=r.createContext(t),a=e=>{let{children:t,...a}=e,o=r.useMemo(()=>a,Object.values(a));return(0,i.jsx)(n.Provider,{value:o,children:t})};a.displayName=e+`Provider`;function o(i){let a=r.useContext(n);if(a)return a;if(t!==void 0)return t;throw Error(`\`${i}\` must be used within \`${e}\``)}return[a,o]}function o(e,t=[]){let n=[];function a(t,a){let o=r.createContext(a),s=n.length;n=[...n,a];let c=t=>{let{scope:n,children:a,...c}=t,l=n?.[e]?.[s]||o,u=r.useMemo(()=>c,Object.values(c));return(0,i.jsx)(l.Provider,{value:u,children:a})};c.displayName=t+`Provider`;function l(n,i){let c=i?.[e]?.[s]||o,l=r.useContext(c);if(l)return l;if(a!==void 0)return a;throw Error(`\`${n}\` must be used within \`${t}\``)}return[c,l]}let o=()=>{let t=n.map(e=>r.createContext(e));return function(n){let i=n?.[e]||t;return r.useMemo(()=>({[`__scope${e}`]:{...n,[e]:i}}),[n,i])}};return o.scopeName=e,[a,s(o,...t)]}function s(...e){let t=e[0];if(e.length===1)return t;let n=()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let i=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return r.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}typeof window<`u`&&window.document&&window.document.createElement;function c(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),n===!1||!r.defaultPrevented)return t?.(r)}}var l=globalThis?.document?r.useLayoutEffect:()=>{},u=r.useInsertionEffect||l;function d({prop:e,defaultProp:t,onChange:n=()=>{},caller:i}){let[a,o,s]=f({defaultProp:t,onChange:n}),c=e!==void 0,l=c?e:a;{let t=r.useRef(e!==void 0);r.useEffect(()=>{let e=t.current;e!==c&&console.warn(`${i} is changing from ${e?`controlled`:`uncontrolled`} to ${c?`controlled`:`uncontrolled`}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),t.current=c},[c,i])}return[l,r.useCallback(t=>{if(c){let n=p(t)?t(e):t;n!==e&&s.current?.(n)}else o(t)},[c,e,o,s])]}function f({defaultProp:e,onChange:t}){let[n,i]=r.useState(e),a=r.useRef(n),o=r.useRef(t);return u(()=>{o.current=t},[t]),r.useEffect(()=>{a.current!==n&&(o.current?.(n),a.current=n)},[n,a]),[n,i,o]}function p(e){return typeof e==`function`}export{o as a,a as i,l as n,c as r,d as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,ku as t}from"./messages-xqHXgrWc.js";var n=t(e(),1);function r(e){let t=n.useRef({value:e,previous:e});return n.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}export{r as t};
|
import{$u as e,nd as t}from"./messages-BOl-zx8S.js";var n=t(e(),1);function r(e){let t=n.useRef({value:e,previous:e});return n.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}export{r as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,ku as t}from"./messages-xqHXgrWc.js";import{n}from"./dist-DoGn2h1J.js";var r=t(e(),1),i=r.useId||(()=>void 0),a=0;function o(e){let[t,o]=r.useState(i());return n(()=>{e||o(e=>e??String(a++))},[e]),e||(t?`radix-${t}`:``)}function s(e){let t=r.useRef(e);return r.useEffect(()=>{t.current=e}),r.useMemo(()=>(...e)=>t.current?.(...e),[])}export{o as n,s as t};
|
import{$u as e,nd as t}from"./messages-BOl-zx8S.js";import{n}from"./dist-DzENW8NP.js";var r=t(e(),1),i=r.useId||(()=>void 0),a=0;function o(e){let[t,o]=r.useState(i());return n(()=>{e||o(e=>e??String(a++))},[e]),e||(t?`radix-${t}`:``)}function s(e){let t=r.useRef(e);return r.useEffect(()=>{t.current=e}),r.useMemo(()=>(...e)=>t.current?.(...e),[])}export{o as n,s as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`ellipsis`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`ellipsis`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]]);export{t};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{Tu as e}from"./messages-xqHXgrWc.js";import{i as t}from"./button-BQECWbag.js";import{t as n}from"./createLucideIcon-BjX75ffX.js";var r=n(`inbox`,[[`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`,key:`o97t9d`}],[`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`oot6mr`}]]),i=n(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),a=n(`sliders-horizontal`,[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]),o=e();function s({className:e,description:n=`暂无数据`,icon:i,title:a}){return(0,o.jsxs)(`div`,{className:t(`flex flex-col items-center justify-center gap-3 py-16 text-center`,e),children:[(0,o.jsx)(`div`,{className:`flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground`,children:i??(0,o.jsx)(r,{className:`size-6`})}),a&&(0,o.jsx)(`p`,{className:`font-medium text-sm`,children:a}),(0,o.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:n})]})}export{a as n,i as r,s as t};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Qu as e,r as t}from"./messages-BOl-zx8S.js";import{i as n}from"./button-D-oR8d6w.js";import{t as r}from"./createLucideIcon-DMX28cCu.js";var i=r(`inbox`,[[`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`,key:`o97t9d`}],[`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`oot6mr`}]]),a=r(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),o=r(`sliders-horizontal`,[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]),s=e();function c({className:e,description:r=t(),icon:a,title:o}){return(0,s.jsxs)(`div`,{className:n(`flex flex-col items-center justify-center gap-3 py-16 text-center`,e),children:[(0,s.jsx)(`div`,{className:`flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground`,children:a??(0,s.jsx)(i,{className:`size-6`})}),o&&(0,s.jsx)(`p`,{className:`font-medium text-sm`,children:o}),(0,s.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:r})]})}export{o as n,a as r,c as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,el as n,et as r,ku as i,nl as a,nt as o,rl as s,tl as c,tt as l}from"./messages-xqHXgrWc.js";import{t as u}from"./button-BQECWbag.js";import{c as d,s as f}from"./zod-BnhDiB7H.js";import{a as p,c as m,i as h,l as g,n as _,o as v,s as y,t as b}from"./form-DK0bnk5h.js";import{t as x}from"./input-DBrSAqhD.js";import{t as S}from"./page-header-C0GHzPxS.js";import{a as C,i as w,n as T,t as E}from"./lib-DuCpw_EA.js";var D=i(e(),1),O=t(),k=f({defaultToken:d().min(1,a()),defaultCurrency:d().min(1,c()),defaultNetwork:d().min(1,n())});function A(){let e=w(`epay`),t=C(),i=g({resolver:m(k),defaultValues:{defaultToken:``,defaultCurrency:``,defaultNetwork:``}});(0,D.useEffect)(()=>{let t=e.data?.data;t&&i.reset({defaultToken:E(t,`epay.default_token`),defaultCurrency:E(t,`epay.default_currency`),defaultNetwork:E(t,`epay.default_network`)})},[e.data,i]);async function o(n){await T(t.mutateAsync,[{group:`epay`,key:`epay.default_token`,type:`string`,value:n.defaultToken},{group:`epay`,key:`epay.default_currency`,type:`string`,value:n.defaultCurrency},{group:`epay`,key:`epay.default_network`,type:`string`,value:n.defaultNetwork}],l()),await e.refetch()}return(0,O.jsx)(b,{...i,children:(0,O.jsxs)(`form`,{className:`space-y-6`,onSubmit:i.handleSubmit(o),children:[(0,O.jsx)(h,{control:i.control,name:`defaultToken`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:a()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`usdt`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:i.control,name:`defaultCurrency`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:c()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`cny`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:i.control,name:`defaultNetwork`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:n()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`tron`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(u,{disabled:t.isPending||e.isLoading,type:`submit`,children:r()})]})})}function j(){return(0,O.jsx)(S,{description:o(),title:s(),variant:`section`,children:(0,O.jsx)(A,{})})}var M=j;export{M as component};
|
import{$u as e,Al as t,Dl as n,Ol as r,Qu as i,gt as a,ht as o,kl as s,mt as c,nd as l}from"./messages-BOl-zx8S.js";import{t as u}from"./button-D-oR8d6w.js";import{c as d,s as f}from"./zod-DzRgHmfz.js";import{a as p,c as m,i as h,l as g,n as _,o as v,s as y,t as b}from"./form-uKra2bmF.js";import{t as x}from"./input-CZHXycLK.js";import{t as S}from"./page-header-BRM1dngJ.js";import{a as C,i as w,n as T,t as E}from"./lib-_PocwKaj.js";var D=l(e(),1),O=i(),k=f({defaultToken:d().min(1,s()),defaultCurrency:d().min(1,r()),defaultNetwork:d().min(1,n())});function A(){let e=w(`epay`),t=C(),i=g({resolver:m(k),defaultValues:{defaultToken:``,defaultCurrency:``,defaultNetwork:``}});(0,D.useEffect)(()=>{let t=e.data?.data;t&&i.reset({defaultToken:E(t,`epay.default_token`),defaultCurrency:E(t,`epay.default_currency`),defaultNetwork:E(t,`epay.default_network`)})},[e.data,i]);async function a(n){await T(t.mutateAsync,[{group:`epay`,key:`epay.default_token`,type:`string`,value:n.defaultToken},{group:`epay`,key:`epay.default_currency`,type:`string`,value:n.defaultCurrency},{group:`epay`,key:`epay.default_network`,type:`string`,value:n.defaultNetwork}],o()),await e.refetch()}return(0,O.jsx)(b,{...i,children:(0,O.jsxs)(`form`,{className:`space-y-6`,onSubmit:i.handleSubmit(a),children:[(0,O.jsx)(h,{control:i.control,name:`defaultToken`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:s()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`usdt`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:i.control,name:`defaultCurrency`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:r()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`cny`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:i.control,name:`defaultNetwork`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:n()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`tron`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(u,{disabled:t.isPending||e.isLoading,type:`submit`,children:c()})]})})}function j(){return(0,O.jsx)(S,{description:a(),title:t(),variant:`section`,children:(0,O.jsx)(A,{})})}var M=j;export{M as component};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]);export{t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-BjX75ffX.js";var t=e(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]);export{t};
|
import{t as e}from"./createLucideIcon-DMX28cCu.js";var t=e(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]);export{t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Eu as e,Tu as t,ku as n}from"./messages-xqHXgrWc.js";import{n as r,r as i,t as a}from"./cookies-BkW9sKRD.js";var o=n(e(),1),s=[`inter`,`manrope`,`noto`,`system`],c=t(),l=`font`,u=3600*24*365,d=(0,o.createContext)(null);function f({children:e}){let[t,n]=(0,o.useState)(()=>{let e=a(l);return s.includes(e)?e:s[0]});return(0,o.useEffect)(()=>{(e=>{let t=document.documentElement;t.classList.remove(...[...t.classList].filter(e=>e.startsWith(`font-`))),t.classList.add(`font-${e}`)})(t)},[t]),(0,c.jsx)(d,{value:{font:t,setFont:e=>{i(l,e,u),n(e)},resetFont:()=>{r(l),n(s[0])}},children:e})}var p=()=>{let e=(0,o.useContext)(d);if(!e)throw Error(`useFont must be used within a FontProvider`);return e};export{p as n,s as r,f as t};
|
import{$u as e,Qu as t,nd as n}from"./messages-BOl-zx8S.js";import{n as r,r as i,t as a}from"./cookies-D0aVbsDr.js";var o=n(e(),1),s=[`inter`,`manrope`,`noto`,`system`],c=t(),l=`font`,u=3600*24*365,d=(0,o.createContext)(null);function f({children:e}){let[t,n]=(0,o.useState)(()=>{let e=a(l);return s.includes(e)?e:s[0]});return(0,o.useEffect)(()=>{(e=>{let t=document.documentElement;t.classList.remove(...[...t.classList].filter(e=>e.startsWith(`font-`))),t.classList.add(`font-${e}`)})(t)},[t]),(0,c.jsx)(d,{value:{font:t,setFont:e=>{i(l,e,u),n(e)},resetFont:()=>{r(l),n(s[0])}},children:e})}var p=()=>{let e=(0,o.useContext)(d);if(!e)throw Error(`useFont must be used within a FontProvider`);return e};export{p as n,s as r,f as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Mc as e,Tu as t,d as n,jc as r,l as i,u as a}from"./messages-xqHXgrWc.js";import{t as o}from"./useRouter-DbizRCmt.js";import{t as s}from"./useNavigate-DSiROrTl.js";import{t as c}from"./button-BQECWbag.js";var l=t();function u(){let t=s(),{history:u}=o();return(0,l.jsx)(`div`,{className:`h-svh`,children:(0,l.jsxs)(`div`,{className:`m-auto flex h-full w-full flex-col items-center justify-center gap-2`,children:[(0,l.jsx)(`h1`,{className:`font-bold text-[7rem] leading-tight`,children:`403`}),(0,l.jsx)(`span`,{className:`font-medium`,children:n()}),(0,l.jsxs)(`p`,{className:`text-center text-muted-foreground`,children:[a(),` `,(0,l.jsx)(`br`,{}),i()]}),(0,l.jsxs)(`div`,{className:`mt-6 flex gap-4`,children:[(0,l.jsx)(c,{onClick:()=>u.go(-1),variant:`outline`,children:e()}),(0,l.jsx)(c,{onClick:()=>t({to:`/dashboard`}),children:r()})]})]})})}export{u as t};
|
import{C as e,Qu as t,T as n,al as r,il as i,w as a}from"./messages-BOl-zx8S.js";import{t as o}from"./useRouter-DS97kuA5.js";import{t as s}from"./useNavigate-BNrwOhV8.js";import{t as c}from"./button-D-oR8d6w.js";var l=t();function u(){let t=s(),{history:u}=o();return(0,l.jsx)(`div`,{className:`h-svh`,children:(0,l.jsxs)(`div`,{className:`m-auto flex h-full w-full flex-col items-center justify-center gap-2`,children:[(0,l.jsx)(`h1`,{className:`font-bold text-[7rem] leading-tight`,children:`403`}),(0,l.jsx)(`span`,{className:`font-medium`,children:n()}),(0,l.jsxs)(`p`,{className:`text-center text-muted-foreground`,children:[a(),` `,(0,l.jsx)(`br`,{}),e()]}),(0,l.jsxs)(`div`,{className:`mt-6 flex gap-4`,children:[(0,l.jsx)(c,{onClick:()=>u.go(-1),variant:`outline`,children:r()}),(0,l.jsx)(c,{onClick:()=>t({to:`/dashboard`}),children:i()})]})]})})}export{u as t};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
import{Mc as e,Nc as t,Pc as n,Tu as r,jc as i}from"./messages-xqHXgrWc.js";import{t as a}from"./useRouter-DbizRCmt.js";import{t as o}from"./useNavigate-DSiROrTl.js";import{i as s,t as c}from"./button-BQECWbag.js";var l=r();function u({className:r,minimal:u=!1}){let d=o(),{history:f}=a();return(0,l.jsx)(`div`,{className:s(`h-svh w-full`,r),children:(0,l.jsxs)(`div`,{className:`m-auto flex h-full w-full flex-col items-center justify-center gap-2`,children:[!u&&(0,l.jsx)(`h1`,{className:`font-bold text-[7rem] leading-tight`,children:`500`}),(0,l.jsx)(`span`,{className:`font-medium`,children:n()}),(0,l.jsx)(`p`,{className:`text-center text-muted-foreground`,children:t()}),!u&&(0,l.jsxs)(`div`,{className:`mt-6 flex gap-4`,children:[(0,l.jsx)(c,{onClick:()=>f.go(-1),variant:`outline`,children:e()}),(0,l.jsx)(c,{onClick:()=>d({to:`/dashboard`}),children:i()})]})]})})}export{u as t};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Qu as e,al as t,il as n,ol as r,sl as i}from"./messages-BOl-zx8S.js";import{t as a}from"./useRouter-DS97kuA5.js";import{t as o}from"./useNavigate-BNrwOhV8.js";import{i as s,t as c}from"./button-D-oR8d6w.js";var l=e();function u({className:e,minimal:u=!1}){let d=o(),{history:f}=a();return(0,l.jsx)(`div`,{className:s(`h-svh w-full`,e),children:(0,l.jsxs)(`div`,{className:`m-auto flex h-full w-full flex-col items-center justify-center gap-2`,children:[!u&&(0,l.jsx)(`h1`,{className:`font-bold text-[7rem] leading-tight`,children:`500`}),(0,l.jsx)(`span`,{className:`font-medium`,children:i()}),(0,l.jsx)(`p`,{className:`text-center text-muted-foreground`,children:r()}),!u&&(0,l.jsxs)(`div`,{className:`mt-6 flex gap-4`,children:[(0,l.jsx)(c,{onClick:()=>f.go(-1),variant:`outline`,children:t()}),(0,l.jsx)(c,{onClick:()=>d({to:`/dashboard`}),children:n()})]})]})})}export{u as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Ds as e,Es as t,Eu as n,Ns as r,Tu as i,_u as a,ku as o,n as s,vu as c,xu as l}from"./messages-xqHXgrWc.js";import{i as u}from"./auth-store-Cp1Qr8YS.js";import{t as d}from"./link-CKQegE2A.js";import{B as f,I as p,R as m,d as h,f as g,h as _,j as v,l as y,n as b,o as x,p as S,u as C,z as w}from"./search-provider-udckA1q-.js";import{i as T,t as E}from"./button-BQECWbag.js";import{a as D,i as O,l as k,o as A,r as j,s as M,t as N}from"./dropdown-menu-DmhEvuLR.js";import{t as P}from"./separator-DnDg5F8J.js";import{_ as F}from"./command-Kxl1kgbj.js";var I=o(n(),1),L=i();function R(){let[n,i]=y(),[o,l]=(0,I.useState)(!1),{user:v}=u(),b=v?.username?.trim()||s(),T=b.charAt(0).toUpperCase()||`U`,P=v?.last_login_at?e({time:x(v.last_login_at)}):t();return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(p,{onOpenChange:l,open:o,children:(0,L.jsx)(_,{})}),(0,L.jsxs)(N,{modal:!1,children:[(0,L.jsx)(k,{asChild:!0,children:(0,L.jsx)(E,{className:`relative h-8 w-8 rounded-full`,variant:`ghost`,children:(0,L.jsxs)(C,{className:`h-8 w-8`,children:[(0,L.jsx)(g,{alt:b,src:`/avatars/01.png`}),(0,L.jsx)(h,{children:T})]})})}),(0,L.jsxs)(j,{align:`end`,className:`w-56`,forceMount:!0,children:[(0,L.jsx)(A,{className:`p-0 font-normal`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-2 px-1 py-1.5 text-start text-sm`,children:[(0,L.jsxs)(C,{className:`h-8 w-8 rounded-lg`,children:[(0,L.jsx)(g,{alt:b,src:`/avatars/01.png`}),(0,L.jsx)(h,{className:`rounded-lg`,children:T})]}),(0,L.jsxs)(`div`,{className:`grid flex-1 text-start text-sm leading-tight`,children:[(0,L.jsx)(`span`,{className:`truncate font-semibold`,children:b}),(0,L.jsx)(`span`,{className:`truncate text-muted-foreground text-xs`,children:P})]})]})}),(0,L.jsx)(M,{}),(0,L.jsxs)(O,{children:[(0,L.jsx)(D,{asChild:!0,children:(0,L.jsxs)(d,{to:`/account/password`,children:[(0,L.jsx)(f,{className:`mr-2 size-4`}),c()]})}),(0,L.jsxs)(D,{onClick:()=>l(!0),onSelect:e=>e.preventDefault(),children:[(0,L.jsx)(m,{className:`mr-2 size-4`}),r()]})]}),(0,L.jsx)(M,{}),(0,L.jsxs)(D,{onClick:()=>i(!0),variant:`destructive`,children:[(0,L.jsx)(w,{className:`mr-2 size-4`}),a()]})]})]}),(0,L.jsx)(S,{onOpenChange:i,open:!!n})]})}function z({className:e=``,placeholder:t}){let{setOpen:n}=b();return(0,L.jsxs)(E,{className:T(`group relative h-8 w-full flex-1 justify-start rounded-md bg-muted/25 font-normal text-muted-foreground text-sm shadow-none hover:bg-accent sm:w-40 sm:pe-12 md:flex-none lg:w-52 xl:w-64`,e),onClick:()=>n(!0),variant:`outline`,children:[(0,L.jsx)(F,{"aria-hidden":`true`,className:`absolute inset-s-1.5 top-1/2 -translate-y-1/2`,size:16}),(0,L.jsx)(`span`,{className:`ms-4`,children:t??l()}),(0,L.jsxs)(`kbd`,{className:`pointer-events-none absolute inset-e-[0.3rem] top-[0.3rem] hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-medium font-mono text-[10px] opacity-100 group-hover:bg-accent sm:flex`,children:[(0,L.jsx)(`span`,{className:`text-xs`,children:`⌘`}),`K`]})]})}function B({className:e,fixed:t,children:n,...r}){let[i,a]=(0,I.useState)(0);return(0,I.useEffect)(()=>{let e=()=>{a(document.body.scrollTop||document.documentElement.scrollTop)};return document.addEventListener(`scroll`,e,{passive:!0}),()=>document.removeEventListener(`scroll`,e)},[]),(0,L.jsx)(`header`,{className:T(`z-50 h-16`,t&&`header-fixed peer/header sticky top-0 w-[inherit]`,i>10&&t?`shadow`:`shadow-none`,e),...r,children:(0,L.jsxs)(`div`,{className:T(`relative flex h-full items-center gap-3 p-4 sm:gap-4`,i>10&&t&&`after:absolute after:inset-0 after:-z-10 after:bg-background/20 after:backdrop-blur-lg`),children:[(0,L.jsx)(v,{className:`max-md:scale-125`,variant:`outline`}),(0,L.jsx)(P,{className:`h-6`,orientation:`vertical`}),n]})})}export{z as n,R as r,B as t};
|
import{$u as e,Gu as t,Ju as n,Qs as r,Qu as i,Wu as a,Zs as o,g as s,nd as c,oc as l}from"./messages-BOl-zx8S.js";import{i as u}from"./auth-store-D_jr_Pei.js";import{t as d}from"./link-Du-u9SDI.js";import{F as f,L as p,R as m,d as h,f as g,h as _,j as v,l as y,n as b,o as x,p as S,u as C,z as w}from"./search-provider-D-fTfilE.js";import{i as T,t as E}from"./button-D-oR8d6w.js";import{a as D,i as O,l as k,o as A,r as j,s as M,t as N}from"./dropdown-menu-HbmfecEg.js";import{t as P}from"./separator-Dw-mNGCy.js";import{g as F}from"./command-yFHhtFiR.js";var I=c(e(),1),L=i();function R(){let[e,n]=y(),[i,c]=(0,I.useState)(!1),{user:v}=u(),b=v?.username?.trim()||s(),T=b.charAt(0).toUpperCase()||`U`,P=v?.last_login_at?r({time:x(v.last_login_at)}):o();return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(f,{onOpenChange:c,open:i,children:(0,L.jsx)(_,{})}),(0,L.jsxs)(N,{modal:!1,children:[(0,L.jsx)(k,{asChild:!0,children:(0,L.jsx)(E,{className:`relative h-8 w-8 rounded-full`,variant:`ghost`,children:(0,L.jsxs)(C,{className:`h-8 w-8`,children:[(0,L.jsx)(g,{alt:b,src:`/avatars/01.png`}),(0,L.jsx)(h,{children:T})]})})}),(0,L.jsxs)(j,{align:`end`,className:`w-56`,forceMount:!0,children:[(0,L.jsx)(A,{className:`p-0 font-normal`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-2 px-1 py-1.5 text-start text-sm`,children:[(0,L.jsxs)(C,{className:`h-8 w-8 rounded-lg`,children:[(0,L.jsx)(g,{alt:b,src:`/avatars/01.png`}),(0,L.jsx)(h,{className:`rounded-lg`,children:T})]}),(0,L.jsxs)(`div`,{className:`grid flex-1 text-start text-sm leading-tight`,children:[(0,L.jsx)(`span`,{className:`truncate font-semibold`,children:b}),(0,L.jsx)(`span`,{className:`truncate text-muted-foreground text-xs`,children:P})]})]})}),(0,L.jsx)(M,{}),(0,L.jsxs)(O,{children:[(0,L.jsx)(D,{asChild:!0,children:(0,L.jsxs)(d,{to:`/account/password`,children:[(0,L.jsx)(w,{className:`mr-2 size-4`}),t()]})}),(0,L.jsxs)(D,{onClick:()=>c(!0),onSelect:e=>e.preventDefault(),children:[(0,L.jsx)(p,{className:`mr-2 size-4`}),l()]})]}),(0,L.jsx)(M,{}),(0,L.jsxs)(D,{onClick:()=>n(!0),variant:`destructive`,children:[(0,L.jsx)(m,{className:`mr-2 size-4`}),a()]})]})]}),(0,L.jsx)(S,{onOpenChange:n,open:!!e})]})}function z({className:e=``,placeholder:t}){let{setOpen:r}=b();return(0,L.jsxs)(E,{className:T(`group relative h-8 w-full flex-1 justify-start rounded-md bg-muted/25 font-normal text-muted-foreground text-sm shadow-none hover:bg-accent sm:w-40 sm:pe-12 md:flex-none lg:w-52 xl:w-64`,e),onClick:()=>r(!0),variant:`outline`,children:[(0,L.jsx)(F,{"aria-hidden":`true`,className:`absolute inset-s-1.5 top-1/2 -translate-y-1/2`,size:16}),(0,L.jsx)(`span`,{className:`ms-4`,children:t??n()}),(0,L.jsxs)(`kbd`,{className:`pointer-events-none absolute inset-e-[0.3rem] top-[0.3rem] hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-medium font-mono text-[10px] opacity-100 group-hover:bg-accent sm:flex`,children:[(0,L.jsx)(`span`,{className:`text-xs`,children:`⌘`}),`K`]})]})}function B({className:e,fixed:t,children:n,...r}){let[i,a]=(0,I.useState)(0);return(0,I.useEffect)(()=>{let e=()=>{a(document.body.scrollTop||document.documentElement.scrollTop)};return document.addEventListener(`scroll`,e,{passive:!0}),()=>document.removeEventListener(`scroll`,e)},[]),(0,L.jsx)(`header`,{className:T(`z-50 h-16`,t&&`header-fixed peer/header sticky top-0 w-[inherit]`,i>10&&t?`shadow`:`shadow-none`,e),...r,children:(0,L.jsxs)(`div`,{className:T(`relative flex h-full items-center gap-3 p-4 sm:gap-4`,i>10&&t&&`after:absolute after:inset-0 after:-z-10 after:bg-background/20 after:backdrop-blur-lg`),children:[(0,L.jsx)(v,{className:`max-md:scale-125`,variant:`outline`}),(0,L.jsx)(P,{className:`h-6`,orientation:`vertical`}),n]})})}export{z as n,R as r,B as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Tu as e,cu as t,ou as n,su as r}from"./messages-xqHXgrWc.js";import{t as i}from"./telescope-tTmzP4X9.js";var a=e();function o(){return(0,a.jsx)(`div`,{className:`h-svh`,children:(0,a.jsxs)(`div`,{className:`m-auto flex h-full w-full flex-col items-center justify-center gap-2`,children:[(0,a.jsx)(i,{size:72}),(0,a.jsx)(`h1`,{className:`font-bold text-4xl leading-tight`,children:t()}),(0,a.jsxs)(`p`,{className:`text-center text-muted-foreground`,children:[r(),` `,(0,a.jsx)(`br`,{}),n()]})]})})}var s=o;export{s as component};
|
import{Fu as e,Nu as t,Pu as n,Qu as r}from"./messages-BOl-zx8S.js";import{t as i}from"./telescope-CH8QonjS.js";var a=r();function o(){return(0,a.jsx)(`div`,{className:`h-svh`,children:(0,a.jsxs)(`div`,{className:`m-auto flex h-full w-full flex-col items-center justify-center gap-2`,children:[(0,a.jsx)(i,{size:72}),(0,a.jsx)(`h1`,{className:`font-bold text-4xl leading-tight`,children:e()}),(0,a.jsxs)(`p`,{className:`text-center text-muted-foreground`,children:[n(),` `,(0,a.jsx)(`br`,{}),t()]})]})})}var s=o;export{s as component};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user