mirror of
https://github.com/GMWalletApp/epusdt.git
synced 2026-07-07 18:26:16 +00:00
feat: integrate okpay switch-network flow and notify handling
This commit is contained in:
@@ -24,6 +24,16 @@ import (
|
|||||||
// epay.default_currency (string) — fiat currency for EPAY orders, e.g. "cny" (default)
|
// epay.default_currency (string) — fiat currency for EPAY orders, e.g. "cny" (default)
|
||||||
// epay.default_network (string) — blockchain network for EPAY orders, e.g. "tron" (default)
|
// epay.default_network (string) — blockchain network for EPAY orders, e.g. "tron" (default)
|
||||||
//
|
//
|
||||||
|
// - group=okpay:
|
||||||
|
// okpay.enabled (bool) — enable OkPay as a switch-network payment option
|
||||||
|
// okpay.shop_id (string) — OkPay merchant/shop identifier
|
||||||
|
// okpay.shop_token (string) — OkPay signing token
|
||||||
|
// okpay.api_url (string) — OkPay API base URL
|
||||||
|
// okpay.callback_url (string) — server callback URL used for OkPay notify
|
||||||
|
// okpay.return_url (string) — optional default browser return URL after payment
|
||||||
|
// okpay.timeout_seconds (int) — outbound OkPay API timeout in seconds
|
||||||
|
// okpay.allow_tokens (string) — comma-separated allowed tokens, e.g. "USDT,TRX"
|
||||||
|
//
|
||||||
// - group=brand:
|
// - group=brand:
|
||||||
// brand.site_name (string) — site display name
|
// brand.site_name (string) — site display name
|
||||||
// brand.logo_url (string) — logo image URL
|
// brand.logo_url (string) — logo image URL
|
||||||
@@ -34,7 +44,7 @@ import (
|
|||||||
// - group=system:
|
// - group=system:
|
||||||
// system.order_expiration_time (int) — order expiry in minutes
|
// system.order_expiration_time (int) — order expiry in minutes
|
||||||
type SettingUpsertItem struct {
|
type SettingUpsertItem struct {
|
||||||
Group string `json:"group" enums:"brand,rate,system,epay" example:"epay"`
|
Group string `json:"group" enums:"brand,rate,system,epay,okpay" example:"epay"`
|
||||||
Key string `json:"key" example:"epay.default_network"`
|
Key string `json:"key" example:"epay.default_network"`
|
||||||
Value string `json:"value" example:"tron"`
|
Value string `json:"value" example:"tron"`
|
||||||
Type string `json:"type" enums:"string,int,bool,json" example:"string"`
|
Type string `json:"type" enums:"string,int,bool,json" example:"string"`
|
||||||
@@ -48,12 +58,12 @@ type SettingsUpsertRequest struct {
|
|||||||
// ListSettings returns all rows, optionally filtered by group.
|
// ListSettings returns all rows, optionally filtered by group.
|
||||||
// @Summary List settings
|
// @Summary List settings
|
||||||
// @Description Returns all settings, optionally filtered by group.
|
// @Description Returns all settings, optionally filtered by group.
|
||||||
// @Description Available groups: brand, rate, system, epay.
|
// @Description Available groups: brand, rate, system, epay, okpay.
|
||||||
// @Description See SettingUpsertItem for the full list of supported keys per group.
|
// @Description See SettingUpsertItem for the full list of supported keys per group.
|
||||||
// @Tags Admin Settings
|
// @Tags Admin Settings
|
||||||
// @Security AdminJWT
|
// @Security AdminJWT
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Param group query string false "Group filter (brand|rate|system|epay)"
|
// @Param group query string false "Group filter (brand|rate|system|epay|okpay)"
|
||||||
// @Success 200 {object} response.ApiResponse{data=[]mdb.Setting}
|
// @Success 200 {object} response.ApiResponse{data=[]mdb.Setting}
|
||||||
// @Failure 400 {object} response.ApiResponse
|
// @Failure 400 {object} response.ApiResponse
|
||||||
// @Router /admin/api/v1/settings [get]
|
// @Router /admin/api/v1/settings [get]
|
||||||
@@ -71,8 +81,9 @@ func (c *BaseAdminController) ListSettings(ctx echo.Context) error {
|
|||||||
// ones. Errors are returned per-key so the UI can surface them.
|
// ones. Errors are returned per-key so the UI can surface them.
|
||||||
// @Summary Upsert settings
|
// @Summary Upsert settings
|
||||||
// @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, okpay.
|
||||||
// @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 okpay group keys: okpay.enabled, okpay.shop_id, okpay.shop_token, okpay.api_url, okpay.callback_url, okpay.return_url, okpay.timeout_seconds, okpay.allow_tokens.
|
||||||
// @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 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.
|
||||||
|
|||||||
@@ -0,0 +1,154 @@
|
|||||||
|
package comm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/model/service"
|
||||||
|
"github.com/GMWalletApp/epusdt/util/log"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
// OkPayNotify receives the server-to-server OkPay payment callback.
|
||||||
|
// The handler accepts JSON or form-urlencoded payloads and returns plain-text
|
||||||
|
// acknowledgements expected by the upstream provider.
|
||||||
|
// @Summary OkPay notify callback
|
||||||
|
// @Description Receives OkPay deposit callbacks for hosted checkout child orders.
|
||||||
|
// @Description The callback is verified against the configured OkPay shop token and, on success, marks the matching child order as paid.
|
||||||
|
// @Tags Payment
|
||||||
|
// @Accept json
|
||||||
|
// @Accept x-www-form-urlencoded
|
||||||
|
// @Produce plain
|
||||||
|
// @Success 200 {string} string "success"
|
||||||
|
// @Failure 400 {string} string "fail"
|
||||||
|
// @Router /payments/okpay/v1/notify [post]
|
||||||
|
func (c *BaseCommController) OkPayNotify(ctx echo.Context) error {
|
||||||
|
req := ctx.Request()
|
||||||
|
rawBody, err := io.ReadAll(req.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Sugar.Warnf("[okpay] read notify body failed err=%v", err)
|
||||||
|
return ctx.String(http.StatusBadRequest, "fail")
|
||||||
|
}
|
||||||
|
req.Body = io.NopCloser(bytes.NewReader(rawBody))
|
||||||
|
|
||||||
|
form := make(map[string]string)
|
||||||
|
copyForm := func(values url.Values) {
|
||||||
|
for key, items := range values {
|
||||||
|
if len(items) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
form[key] = items[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
copyForm(req.URL.Query())
|
||||||
|
|
||||||
|
contentType := strings.ToLower(req.Header.Get(echo.HeaderContentType))
|
||||||
|
|
||||||
|
if strings.Contains(contentType, echo.MIMEApplicationJSON) && len(rawBody) > 0 {
|
||||||
|
if jsonForm, jsonErr := flattenOkPayJSONBody(rawBody); jsonErr == nil {
|
||||||
|
for key, value := range jsonForm {
|
||||||
|
form[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match the PHP example's $_POST semantics: let Echo/net/http parse both
|
||||||
|
// application/x-www-form-urlencoded and multipart/form-data.
|
||||||
|
if len(form) == 0 {
|
||||||
|
req.Body = io.NopCloser(bytes.NewReader(rawBody))
|
||||||
|
if parsedForm, formErr := ctx.FormParams(); formErr == nil {
|
||||||
|
copyForm(parsedForm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final fallback for raw query-string style bodies.
|
||||||
|
if len(form) == 0 && len(rawBody) > 0 && looksLikeQueryPayload(string(rawBody)) {
|
||||||
|
if parsed, parseErr := url.ParseQuery(string(rawBody)); parseErr == nil && len(parsed) > 0 {
|
||||||
|
copyForm(parsed)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rawFormData := string(rawBody)
|
||||||
|
if rawFormData == "" {
|
||||||
|
rawFormData = req.URL.RawQuery
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(form) == 0 {
|
||||||
|
log.Sugar.Warnf("[okpay] empty notify payload method=%s content_type=%s remote=%s raw_query=%q raw_body=%q", req.Method, req.Header.Get(echo.HeaderContentType), ctx.RealIP(), req.URL.RawQuery, rawFormData)
|
||||||
|
return ctx.String(http.StatusBadRequest, "fail")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = service.HandleOkPayNotify(form, rawFormData); err != nil {
|
||||||
|
log.Sugar.Warnf("[okpay] notify handle failed method=%s content_type=%s remote=%s form=%v raw_query=%q raw_body=%q err=%v", req.Method, req.Header.Get(echo.HeaderContentType), ctx.RealIP(), form, req.URL.RawQuery, rawFormData, err)
|
||||||
|
return ctx.String(http.StatusBadRequest, "fail")
|
||||||
|
}
|
||||||
|
return ctx.String(http.StatusOK, "success")
|
||||||
|
}
|
||||||
|
|
||||||
|
func flattenOkPayJSONBody(rawBody []byte) (map[string]string, error) {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(rawBody))
|
||||||
|
decoder.UseNumber()
|
||||||
|
|
||||||
|
var payload map[string]interface{}
|
||||||
|
if err := decoder.Decode(&payload); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
flat := make(map[string]string)
|
||||||
|
for key, value := range payload {
|
||||||
|
if key == "data" {
|
||||||
|
dataMap, ok := value.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for dataKey, dataValue := range dataMap {
|
||||||
|
flat["data["+dataKey+"]"] = stringifyOkPayJSONValue(dataValue)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
flat[key] = stringifyOkPayJSONValue(value)
|
||||||
|
}
|
||||||
|
return flat, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func stringifyOkPayJSONValue(value interface{}) string {
|
||||||
|
switch v := value.(type) {
|
||||||
|
case nil:
|
||||||
|
return ""
|
||||||
|
case string:
|
||||||
|
return strings.TrimSpace(v)
|
||||||
|
case json.Number:
|
||||||
|
return v.String()
|
||||||
|
case float64:
|
||||||
|
if v == math.Trunc(v) {
|
||||||
|
return strconv.FormatInt(int64(v), 10)
|
||||||
|
}
|
||||||
|
return strconv.FormatFloat(v, 'f', -1, 64)
|
||||||
|
case bool:
|
||||||
|
if v {
|
||||||
|
return "true"
|
||||||
|
}
|
||||||
|
return "false"
|
||||||
|
default:
|
||||||
|
return strings.TrimSpace(fmt.Sprint(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func looksLikeQueryPayload(raw string) bool {
|
||||||
|
trimmed := strings.TrimSpace(raw)
|
||||||
|
if trimmed == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(trimmed, "{") || strings.HasPrefix(trimmed, "[") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return strings.Contains(trimmed, "=")
|
||||||
|
}
|
||||||
@@ -60,12 +60,14 @@ func (c *BaseCommController) CreateTransaction(ctx echo.Context) (err error) {
|
|||||||
|
|
||||||
// SwitchNetwork 切换支付网络,创建或返回子订单
|
// SwitchNetwork 切换支付网络,创建或返回子订单
|
||||||
// @Summary Switch payment network
|
// @Summary Switch payment network
|
||||||
// @Description Switch to a different payment network, creating or returning a sub-order
|
// @Description Switch to a different payment target, creating or returning a sub-order.
|
||||||
|
// @Description Normal values such as tron/solana/ethereum create on-chain child orders.
|
||||||
|
// @Description The special value okpay creates or reuses an OkPay-hosted child order and returns its payment_url.
|
||||||
// @Tags Payment
|
// @Tags Payment
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Param request body request.SwitchNetworkRequest true "Switch network payload"
|
// @Param request body request.SwitchNetworkRequest true "Switch network payload"
|
||||||
// @Success 200 {object} response.ApiResponse
|
// @Success 200 {object} response.ApiResponse{data=response.CheckoutCounterResponse}
|
||||||
// @Failure 400 {object} response.ApiResponse
|
// @Failure 400 {object} response.ApiResponse
|
||||||
// @Router /pay/switch-network [post]
|
// @Router /pay/switch-network [post]
|
||||||
func (c *BaseCommController) SwitchNetwork(ctx echo.Context) (err error) {
|
func (c *BaseCommController) SwitchNetwork(ctx echo.Context) (err error) {
|
||||||
|
|||||||
@@ -5,38 +5,24 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/middleware"
|
||||||
"github.com/GMWalletApp/epusdt/model/data"
|
"github.com/GMWalletApp/epusdt/model/data"
|
||||||
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
"github.com/GMWalletApp/epusdt/model/response"
|
"github.com/GMWalletApp/epusdt/model/response"
|
||||||
"github.com/GMWalletApp/epusdt/util/constant"
|
"github.com/GMWalletApp/epusdt/util/constant"
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetSupportedAssets 对外公开可用链与 token 列表。数据源是管理后台
|
func buildSupportedAssets() ([]response.NetworkTokenSupport, error) {
|
||||||
// 的 chains + chain_tokens + wallet_address 三张表的实时查询,admin
|
|
||||||
// 启用/禁用链或代币后,这个接口在下次调用时就会反映新状态(无缓存)。
|
|
||||||
// 仅返回:链 enabled=true、代币 enabled=true、且该链上至少有一个可用
|
|
||||||
// 钱包地址的组合。
|
|
||||||
// @Summary List supported (network, tokens) groupings
|
|
||||||
// @Description Public endpoint, Auth required in /admin/api/v1/supported-assets
|
|
||||||
// @Tags Supported Assets
|
|
||||||
// @Produce json
|
|
||||||
// @Success 200 {object} response.ApiResponse{data=response.SupportedAssetsResponse}
|
|
||||||
// @Failure 400 {object} response.ApiResponse
|
|
||||||
// @Router /payments/gmpay/v1/supported-assets [get]
|
|
||||||
// @Router /admin/api/v1/supported-assets [get]
|
|
||||||
func (c *BaseCommController) GetSupportedAssets(ctx echo.Context) error {
|
|
||||||
chains, err := data.ListEnabledChains()
|
chains, err := data.ListEnabledChains()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.FailJson(ctx, err)
|
return nil, err
|
||||||
}
|
}
|
||||||
wallets, err := data.GetAvailableWalletAddress()
|
wallets, err := data.GetAvailableWalletAddress()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.FailJson(ctx, err)
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// A chain only qualifies if it has at least one wallet available —
|
|
||||||
// without a recipient address, payments on that chain can't be
|
|
||||||
// processed even if the chain + token config says "enabled".
|
|
||||||
networkHasWallet := make(map[string]struct{})
|
networkHasWallet := make(map[string]struct{})
|
||||||
for _, w := range wallets {
|
for _, w := range wallets {
|
||||||
networkHasWallet[strings.ToLower(w.Network)] = struct{}{}
|
networkHasWallet[strings.ToLower(w.Network)] = struct{}{}
|
||||||
@@ -50,7 +36,7 @@ func (c *BaseCommController) GetSupportedAssets(ctx echo.Context) error {
|
|||||||
}
|
}
|
||||||
tokens, err := data.ListEnabledChainTokensByNetwork(network)
|
tokens, err := data.ListEnabledChainTokensByNetwork(network)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.FailJson(ctx, err)
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(tokens) == 0 {
|
if len(tokens) == 0 {
|
||||||
continue
|
continue
|
||||||
@@ -73,18 +59,51 @@ func (c *BaseCommController) GetSupportedAssets(ctx echo.Context) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.SucJson(ctx, response.SupportedAssetsResponse{Supports: supports})
|
return supports, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListSupportedAssetRecords 查询支持项明细(无需鉴权)。
|
// GetPublicConfig returns payment config consumed by cashier/frontends.
|
||||||
// @Summary List supported asset records
|
// The public route returns only non-sensitive epay/okpay knobs, while the
|
||||||
// @Description Public endpoint. Returns enabled chain_tokens, optionally filtered by network.
|
// authenticated admin route also includes OkPay credentials and internal URLs.
|
||||||
// @Tags Supported Assets
|
// @Summary Get public payment config
|
||||||
|
// @Description Returns supported_assets and epay/okpay config used by cashier/frontends.
|
||||||
|
// @Description The authenticated admin variant (/admin/api/v1/config) also includes OkPay shop credentials and internal callback settings.
|
||||||
|
// @Tags Payment Config
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Param network query string false "Network filter (e.g. tron, ethereum)"
|
// @Success 200 {object} response.ApiResponse{data=response.PublicConfigResponse}
|
||||||
// @Success 200 {object} response.ApiResponse{data=[]mdb.ChainToken}
|
|
||||||
// @Failure 400 {object} response.ApiResponse
|
// @Failure 400 {object} response.ApiResponse
|
||||||
// @Router /payments/gmpay/v1/supported-assets/records [get]
|
// @Router /payments/gmpay/v1/config [get]
|
||||||
|
// @Router /admin/api/v1/config [get]
|
||||||
|
func (c *BaseCommController) GetPublicConfig(ctx echo.Context) error {
|
||||||
|
supports, err := buildSupportedAssets()
|
||||||
|
if err != nil {
|
||||||
|
return c.FailJson(ctx, err)
|
||||||
|
}
|
||||||
|
okpay := response.OkPayPublicConfig{
|
||||||
|
Enabled: data.GetOkPayEnabled(),
|
||||||
|
AllowTokens: data.GetOkPayAllowTokens(),
|
||||||
|
}
|
||||||
|
if ctx.Get(middleware.AdminUserIDKey) != nil {
|
||||||
|
okpay.ShopID = data.GetOkPayShopID()
|
||||||
|
okpay.ShopToken = data.GetOkPayShopToken()
|
||||||
|
okpay.APIURL = data.GetOkPayAPIURL()
|
||||||
|
okpay.CallbackURL = data.GetOkPayCallbackURL()
|
||||||
|
okpay.ReturnURL = data.GetOkPayReturnURL()
|
||||||
|
okpay.TimeoutSeconds = data.GetOkPayTimeoutSeconds()
|
||||||
|
}
|
||||||
|
return c.SucJson(ctx, response.PublicConfigResponse{
|
||||||
|
SupportedAssets: supports,
|
||||||
|
Epay: response.EpayPublicConfig{
|
||||||
|
DefaultToken: data.GetSettingString(mdb.SettingKeyEpayDefaultToken, "usdt"),
|
||||||
|
DefaultCurrency: data.GetSettingString(mdb.SettingKeyEpayDefaultCurrency, "cny"),
|
||||||
|
DefaultNetwork: data.GetSettingString(mdb.SettingKeyEpayDefaultNetwork, "tron"),
|
||||||
|
},
|
||||||
|
OkPay: okpay,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListSupportedAssetRecords is currently not wired to a public route.
|
||||||
|
// Kept as an internal helper candidate for future admin/debug use.
|
||||||
func (c *BaseCommController) ListSupportedAssetRecords(ctx echo.Context) error {
|
func (c *BaseCommController) ListSupportedAssetRecords(ctx echo.Context) error {
|
||||||
network := ctx.QueryParam("network")
|
network := ctx.QueryParam("network")
|
||||||
list, err := data.ListEnabledChainTokens(network)
|
list, err := data.ListEnabledChainTokens(network)
|
||||||
@@ -94,15 +113,8 @@ func (c *BaseCommController) ListSupportedAssetRecords(ctx echo.Context) error {
|
|||||||
return c.SucJson(ctx, list)
|
return c.SucJson(ctx, list)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSupportedAsset 查询单条支持项(无需鉴权)。
|
// GetSupportedAsset is currently not wired to a public route.
|
||||||
// @Summary Get a supported asset
|
// Kept as an internal helper candidate for future admin/debug use.
|
||||||
// @Description Public endpoint. Returns one chain_token row by ID. Returns 404 if the token is disabled.
|
|
||||||
// @Tags Supported Assets
|
|
||||||
// @Produce json
|
|
||||||
// @Param id path int true "ChainToken ID"
|
|
||||||
// @Success 200 {object} response.ApiResponse{data=mdb.ChainToken}
|
|
||||||
// @Failure 400 {object} response.ApiResponse
|
|
||||||
// @Router /payments/gmpay/v1/supported-assets/{id} [get]
|
|
||||||
func (c *BaseCommController) GetSupportedAsset(ctx echo.Context) error {
|
func (c *BaseCommController) GetSupportedAsset(ctx echo.Context) error {
|
||||||
id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
|
id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ func SetupTestDatabases(t testing.TB) func() {
|
|||||||
|
|
||||||
mustMigrate(t, mainDB,
|
mustMigrate(t, mainDB,
|
||||||
&mdb.Orders{},
|
&mdb.Orders{},
|
||||||
|
&mdb.ProviderOrder{},
|
||||||
&mdb.WalletAddress{},
|
&mdb.WalletAddress{},
|
||||||
&mdb.ApiKey{},
|
&mdb.ApiKey{},
|
||||||
&mdb.Setting{},
|
&mdb.Setting{},
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/config"
|
||||||
"github.com/GMWalletApp/epusdt/model/mdb"
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
"github.com/gookit/color"
|
"github.com/gookit/color"
|
||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
@@ -35,6 +36,7 @@ func MdbTableInit() {
|
|||||||
{"Chain", &mdb.Chain{}},
|
{"Chain", &mdb.Chain{}},
|
||||||
{"ChainToken", &mdb.ChainToken{}},
|
{"ChainToken", &mdb.ChainToken{}},
|
||||||
{"RpcNode", &mdb.RpcNode{}},
|
{"RpcNode", &mdb.RpcNode{}},
|
||||||
|
{"ProviderOrder", &mdb.ProviderOrder{}},
|
||||||
}
|
}
|
||||||
for _, m := range migrations {
|
for _, m := range migrations {
|
||||||
if err := Mdb.AutoMigrate(m.model); err != nil {
|
if err := Mdb.AutoMigrate(m.model); err != nil {
|
||||||
@@ -132,10 +134,19 @@ func seedRpcNodes() {
|
|||||||
// seedDefaultSettings inserts built-in default settings.
|
// seedDefaultSettings inserts built-in default settings.
|
||||||
// Uses ON CONFLICT DO NOTHING so admin edits persist across restarts.
|
// Uses ON CONFLICT DO NOTHING so admin edits persist across restarts.
|
||||||
func seedDefaultSettings() {
|
func seedDefaultSettings() {
|
||||||
|
okPayCallbackURL := strings.TrimRight(strings.TrimSpace(config.GetAppUri()), "/")
|
||||||
|
if okPayCallbackURL != "" {
|
||||||
|
okPayCallbackURL += "/payments/okpay/v1/notify"
|
||||||
|
}
|
||||||
defaults := []mdb.Setting{
|
defaults := []mdb.Setting{
|
||||||
{Group: mdb.SettingGroupEpay, Key: mdb.SettingKeyEpayDefaultToken, Value: "usdt", Type: mdb.SettingTypeString},
|
{Group: mdb.SettingGroupEpay, Key: mdb.SettingKeyEpayDefaultToken, Value: "usdt", Type: mdb.SettingTypeString},
|
||||||
{Group: mdb.SettingGroupEpay, Key: mdb.SettingKeyEpayDefaultCurrency, Value: "cny", Type: mdb.SettingTypeString},
|
{Group: mdb.SettingGroupEpay, Key: mdb.SettingKeyEpayDefaultCurrency, Value: "cny", Type: mdb.SettingTypeString},
|
||||||
{Group: mdb.SettingGroupEpay, Key: mdb.SettingKeyEpayDefaultNetwork, Value: "tron", Type: mdb.SettingTypeString},
|
{Group: mdb.SettingGroupEpay, Key: mdb.SettingKeyEpayDefaultNetwork, Value: "tron", Type: mdb.SettingTypeString},
|
||||||
|
{Group: mdb.SettingGroupOkPay, Key: mdb.SettingKeyOkPayEnabled, Value: "false", Type: mdb.SettingTypeBool},
|
||||||
|
{Group: mdb.SettingGroupOkPay, Key: mdb.SettingKeyOkPayAPIURL, Value: "https://api.okaypay.me/shop/", Type: mdb.SettingTypeString},
|
||||||
|
{Group: mdb.SettingGroupOkPay, Key: mdb.SettingKeyOkPayCallbackURL, Value: okPayCallbackURL, Type: mdb.SettingTypeString},
|
||||||
|
{Group: mdb.SettingGroupOkPay, Key: mdb.SettingKeyOkPayTimeoutSeconds, Value: "10", Type: mdb.SettingTypeInt},
|
||||||
|
{Group: mdb.SettingGroupOkPay, Key: mdb.SettingKeyOkPayAllowTokens, Value: "USDT,TRX", Type: mdb.SettingTypeString},
|
||||||
}
|
}
|
||||||
if err := Mdb.Clauses(clause.OnConflict{DoNothing: true}).Create(&defaults).Error; err != nil {
|
if err := Mdb.Clauses(clause.OnConflict{DoNothing: true}).Create(&defaults).Error; err != nil {
|
||||||
color.Red.Printf("[store_db] seed default settings err=%s\n", err)
|
color.Red.Printf("[store_db] seed default settings err=%s\n", err)
|
||||||
|
|||||||
@@ -202,6 +202,18 @@ func MarkOrderSelected(tradeId string) error {
|
|||||||
Update("is_selected", true).Error
|
Update("is_selected", true).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExpireOrderByTradeID marks a waiting order as expired. Used to retire failed
|
||||||
|
// child-order attempts that should not remain selectable/reusable.
|
||||||
|
func ExpireOrderByTradeID(tradeId string) error {
|
||||||
|
return dao.Mdb.Model(&mdb.Orders{}).
|
||||||
|
Where("trade_id = ?", tradeId).
|
||||||
|
Where("status = ?", mdb.StatusWaitPay).
|
||||||
|
Updates(map[string]interface{}{
|
||||||
|
"status": mdb.StatusExpired,
|
||||||
|
"is_selected": false,
|
||||||
|
}).Error
|
||||||
|
}
|
||||||
|
|
||||||
// RefreshOrderExpiration resets created_at to now so the expiration timer restarts.
|
// RefreshOrderExpiration resets created_at to now so the expiration timer restarts.
|
||||||
// Called on the parent order when a sub-order is created or returned.
|
// Called on the parent order when a sub-order is created or returned.
|
||||||
func RefreshOrderExpiration(tradeId string) error {
|
func RefreshOrderExpiration(tradeId string) error {
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package data
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/GMWalletApp/epusdt/model/dao"
|
||||||
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetProviderOrderByTradeIDAndProvider(tradeID string, provider string) (*mdb.ProviderOrder, error) {
|
||||||
|
row := new(mdb.ProviderOrder)
|
||||||
|
err := dao.Mdb.Model(row).
|
||||||
|
Where("trade_id = ?", tradeID).
|
||||||
|
Where("provider = ?", provider).
|
||||||
|
Limit(1).
|
||||||
|
Find(row).Error
|
||||||
|
return row, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateProviderOrderWithTransaction(tx *gorm.DB, row *mdb.ProviderOrder) error {
|
||||||
|
return tx.Model(row).Create(row).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateProviderOrderCreated(tradeID string, provider string, providerOrderID string, payURL string) error {
|
||||||
|
return dao.Mdb.Model(&mdb.ProviderOrder{}).
|
||||||
|
Where("trade_id = ?", tradeID).
|
||||||
|
Where("provider = ?", provider).
|
||||||
|
Updates(map[string]interface{}{
|
||||||
|
"provider_order_id": providerOrderID,
|
||||||
|
"pay_url": payURL,
|
||||||
|
"status": mdb.ProviderOrderStatusPending,
|
||||||
|
}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func MarkProviderOrderFailed(tradeID string, provider string) error {
|
||||||
|
return dao.Mdb.Model(&mdb.ProviderOrder{}).
|
||||||
|
Where("trade_id = ?", tradeID).
|
||||||
|
Where("provider = ?", provider).
|
||||||
|
Update("status", mdb.ProviderOrderStatusFailed).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func SaveProviderOrderNotify(tradeID string, provider string, notifyRaw string) error {
|
||||||
|
return dao.Mdb.Model(&mdb.ProviderOrder{}).
|
||||||
|
Where("trade_id = ?", tradeID).
|
||||||
|
Where("provider = ?", provider).
|
||||||
|
Update("notify_raw", notifyRaw).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func MarkProviderOrderPaid(tradeID string, provider string, notifyRaw string) error {
|
||||||
|
return dao.Mdb.Model(&mdb.ProviderOrder{}).
|
||||||
|
Where("trade_id = ?", tradeID).
|
||||||
|
Where("provider = ?", provider).
|
||||||
|
Updates(map[string]interface{}{
|
||||||
|
"status": mdb.ProviderOrderStatusPaid,
|
||||||
|
"notify_raw": notifyRaw,
|
||||||
|
}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func MarkProviderOrderExpired(tradeID string, provider string) error {
|
||||||
|
return dao.Mdb.Model(&mdb.ProviderOrder{}).
|
||||||
|
Where("trade_id = ?", tradeID).
|
||||||
|
Where("provider = ?", provider).
|
||||||
|
Where("status IN ?", []string{mdb.ProviderOrderStatusCreating, mdb.ProviderOrderStatusPending}).
|
||||||
|
Update("status", mdb.ProviderOrderStatusExpired).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSubOrderByTokenPayProvider(parentTradeID string, token string, payProvider string) (*mdb.Orders, error) {
|
||||||
|
order := new(mdb.Orders)
|
||||||
|
err := dao.Mdb.Model(order).
|
||||||
|
Where("parent_trade_id = ?", parentTradeID).
|
||||||
|
Where("token = ?", token).
|
||||||
|
Where("pay_provider = ?", payProvider).
|
||||||
|
Where("status = ?", mdb.StatusWaitPay).
|
||||||
|
Limit(1).
|
||||||
|
Find(order).Error
|
||||||
|
return order, err
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/config"
|
||||||
"github.com/GMWalletApp/epusdt/model/dao"
|
"github.com/GMWalletApp/epusdt/model/dao"
|
||||||
"github.com/GMWalletApp/epusdt/model/mdb"
|
"github.com/GMWalletApp/epusdt/model/mdb"
|
||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
@@ -157,6 +158,63 @@ var sensitiveSettingKeys = []string{
|
|||||||
mdb.SettingKeyInitAdminPasswordChanged,
|
mdb.SettingKeyInitAdminPasswordChanged,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OkPay settings helpers keep the provider-specific defaults in one place so
|
||||||
|
// business logic does not need to repeat raw settings keys.
|
||||||
|
func GetOkPayEnabled() bool {
|
||||||
|
return GetSettingBool(mdb.SettingKeyOkPayEnabled, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOkPayShopID() string {
|
||||||
|
return strings.TrimSpace(GetSettingString(mdb.SettingKeyOkPayShopID, ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOkPayShopToken() string {
|
||||||
|
return strings.TrimSpace(GetSettingString(mdb.SettingKeyOkPayShopToken, ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOkPayAPIURL() string {
|
||||||
|
return strings.TrimSpace(GetSettingString(mdb.SettingKeyOkPayAPIURL, "https://api.okaypay.me/shop/"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOkPayCallbackURL() string {
|
||||||
|
if configured := strings.TrimSpace(GetSettingString(mdb.SettingKeyOkPayCallbackURL, "")); configured != "" {
|
||||||
|
return configured
|
||||||
|
}
|
||||||
|
appURI := strings.TrimSpace(config.GetAppUri())
|
||||||
|
if appURI == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return strings.TrimRight(appURI, "/") + "/payments/okpay/v1/notify"
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOkPayReturnURL() string {
|
||||||
|
return strings.TrimSpace(GetSettingString(mdb.SettingKeyOkPayReturnURL, ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOkPayTimeoutSeconds() int {
|
||||||
|
return GetSettingInt(mdb.SettingKeyOkPayTimeoutSeconds, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOkPayAllowTokens() []string {
|
||||||
|
raw := GetSettingString(mdb.SettingKeyOkPayAllowTokens, "USDT,TRX")
|
||||||
|
if strings.TrimSpace(raw) == "" {
|
||||||
|
return []string{"USDT", "TRX"}
|
||||||
|
}
|
||||||
|
parts := strings.Split(raw, ",")
|
||||||
|
out := make([]string, 0, len(parts))
|
||||||
|
for _, part := range parts {
|
||||||
|
token := strings.ToUpper(strings.TrimSpace(part))
|
||||||
|
if token == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out = append(out, token)
|
||||||
|
}
|
||||||
|
if len(out) == 0 {
|
||||||
|
return []string{"USDT", "TRX"}
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
// ListSettingsByGroup returns all rows for a given group (empty group = all),
|
// ListSettingsByGroup returns all rows for a given group (empty group = all),
|
||||||
// excluding any keys in sensitiveSettingKeys.
|
// excluding any keys in sensitiveSettingKeys.
|
||||||
func ListSettingsByGroup(group string) ([]mdb.Setting, error) {
|
func ListSettingsByGroup(group string) ([]mdb.Setting, error) {
|
||||||
|
|||||||
@@ -12,6 +12,19 @@ const (
|
|||||||
PaymentTypeEpay = "Epay"
|
PaymentTypeEpay = "Epay"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PaymentProviderOnChain means this concrete order record is settled by
|
||||||
|
// sending funds to a directly assigned wallet address on a supported chain.
|
||||||
|
PaymentProviderOnChain = "on_chain"
|
||||||
|
// PaymentProviderOkPay means this concrete order record is settled through
|
||||||
|
// the third-party OkayPay/OkPay hosted checkout flow.
|
||||||
|
//
|
||||||
|
// In the current design this is typically used by a switch-network-created
|
||||||
|
// child order, while the parent order keeps its original merchant-facing
|
||||||
|
// semantics and callback behavior.
|
||||||
|
PaymentProviderOkPay = "okpay"
|
||||||
|
)
|
||||||
|
|
||||||
type Orders struct {
|
type Orders struct {
|
||||||
TradeId string `gorm:"column:trade_id;uniqueIndex:orders_trade_id_uindex" json:"trade_id" example:"T2026041612345678"`
|
TradeId string `gorm:"column:trade_id;uniqueIndex:orders_trade_id_uindex" json:"trade_id" example:"T2026041612345678"`
|
||||||
OrderId string `gorm:"column:order_id;uniqueIndex:orders_order_id_uindex" json:"order_id" example:"ORD20260416001"`
|
OrderId string `gorm:"column:order_id;uniqueIndex:orders_order_id_uindex" json:"order_id" example:"ORD20260416001"`
|
||||||
@@ -33,6 +46,16 @@ type Orders struct {
|
|||||||
CallBackConfirm int `gorm:"column:callback_confirm;default:2" json:"callback_confirm" enums:"1,2" example:"2"`
|
CallBackConfirm int `gorm:"column:callback_confirm;default:2" json:"callback_confirm" enums:"1,2" example:"2"`
|
||||||
IsSelected bool `gorm:"column:is_selected;default:false" json:"is_selected" example:"false"`
|
IsSelected bool `gorm:"column:is_selected;default:false" json:"is_selected" example:"false"`
|
||||||
PaymentType string `gorm:"column:payment_type" json:"payment_type" example:"Epay"`
|
PaymentType string `gorm:"column:payment_type" json:"payment_type" example:"Epay"`
|
||||||
|
// PayProvider identifies how this specific order row is collected.
|
||||||
|
//
|
||||||
|
// Semantics:
|
||||||
|
// - parent orders and regular chain child orders use on_chain
|
||||||
|
// - third-party hosted checkout child orders use their provider name
|
||||||
|
// (for example okpay)
|
||||||
|
//
|
||||||
|
// Existing rows default to on_chain for backward compatibility so upgrades
|
||||||
|
// can rely on AutoMigrate without rewriting old orders.
|
||||||
|
PayProvider string `gorm:"column:pay_provider;size:32;default:on_chain;index:orders_pay_provider_index" json:"pay_provider" example:"on_chain"`
|
||||||
ApiKeyID uint64 `gorm:"column:api_key_id;default:0;index:orders_api_key_id_index" json:"api_key_id" example:"1"`
|
ApiKeyID uint64 `gorm:"column:api_key_id;default:0;index:orders_api_key_id_index" json:"api_key_id" example:"1"`
|
||||||
// PayBySubId holds the primary-key ID of the sub-order that settled this parent order.
|
// PayBySubId holds the primary-key ID of the sub-order that settled this parent order.
|
||||||
// Zero when the parent order was paid directly (no sub-order involved).
|
// Zero when the parent order was paid directly (no sub-order involved).
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package mdb
|
||||||
|
|
||||||
|
const (
|
||||||
|
ProviderOrderStatusCreating = "creating"
|
||||||
|
ProviderOrderStatusPending = "pending"
|
||||||
|
ProviderOrderStatusPaid = "paid"
|
||||||
|
ProviderOrderStatusFailed = "failed"
|
||||||
|
ProviderOrderStatusExpired = "expired"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ProviderOrder stores provider-specific checkout data for one internal order
|
||||||
|
// row. For OkPay this is expected to bind to the concrete child order created
|
||||||
|
// by switch-network, not to the parent merchant order.
|
||||||
|
//
|
||||||
|
// Binding rules:
|
||||||
|
// - trade_id always points to orders.trade_id
|
||||||
|
// - the bound orders row should use the same pay_provider value
|
||||||
|
// - provider identifies which downstream checkout created the provider row
|
||||||
|
// - provider_order_id is the provider's own order number (for OkPay this is
|
||||||
|
// the returned order_id from /payLink)
|
||||||
|
// - pay_url is the hosted payment URL returned by the provider
|
||||||
|
//
|
||||||
|
// The main orders table remains the source of truth for merchant-facing state,
|
||||||
|
// while this table keeps provider-specific identifiers and callback payloads.
|
||||||
|
type ProviderOrder struct {
|
||||||
|
TradeId string `gorm:"column:trade_id;size:32;not null;uniqueIndex:provider_orders_trade_id_provider_uindex,priority:1;index:provider_orders_trade_id_index" json:"trade_id" example:"T2026041612345678"`
|
||||||
|
// Provider values should match the bound Orders.PayProvider value.
|
||||||
|
Provider string `gorm:"column:provider;size:32;not null;uniqueIndex:provider_orders_trade_id_provider_uindex,priority:2;index:provider_orders_provider_status_index,priority:1" json:"provider" example:"okpay"`
|
||||||
|
// ProviderOrderID is the downstream provider's own order identifier for the
|
||||||
|
// bound concrete order row.
|
||||||
|
ProviderOrderID string `gorm:"column:provider_order_id;size:128;not null;default:'';index:provider_orders_provider_order_id_index" json:"provider_order_id" example:"ac7b86615fdb137576ae35879f7ed844"`
|
||||||
|
// PayURL is the hosted checkout URL returned by the downstream provider for
|
||||||
|
// the bound concrete order row.
|
||||||
|
PayURL string `gorm:"column:pay_url;size:512;not null;default:''" json:"pay_url" example:"https://pay.example.com/checkout/abc123"`
|
||||||
|
// Amount/Coin mirror the exact payload submitted to the provider, which may
|
||||||
|
// be useful when validating callbacks and troubleshooting mismatches.
|
||||||
|
Amount float64 `gorm:"column:amount" json:"amount" example:"14.2857"`
|
||||||
|
Coin string `gorm:"column:coin;size:16;not null;default:''" json:"coin" example:"USDT"`
|
||||||
|
Status string `gorm:"column:status;size:32;not null;default:pending;index:provider_orders_provider_status_index,priority:2" json:"status" example:"pending"`
|
||||||
|
// NotifyRaw stores the original provider callback payload for auditing and
|
||||||
|
// replay/debug use. It is provider-specific and intentionally opaque here.
|
||||||
|
NotifyRaw string `gorm:"column:notify_raw;type:text" json:"notify_raw"`
|
||||||
|
BaseModel
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProviderOrder) TableName() string {
|
||||||
|
return "provider_orders"
|
||||||
|
}
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
package mdb
|
package mdb
|
||||||
|
|
||||||
// Setting stores non-credential runtime configuration as key/value pairs.
|
// Setting stores non-credential runtime configuration as key/value pairs.
|
||||||
// Groups: brand, rate, system, epay. Merchant credentials (pid + secret_key)
|
// Groups: brand, rate, system, epay, okpay. Merchant credentials (pid +
|
||||||
// live in the api_keys table; notification configs live in NotificationChannel.
|
// secret_key) live in the api_keys table; notification configs live in
|
||||||
// Default rows for the epay group are seeded on first startup (see
|
// NotificationChannel.
|
||||||
|
// Default rows for the epay/okpay groups are seeded on first startup (see
|
||||||
// model/dao/mdb_table_init.go seedDefaultSettings). All other groups start
|
// model/dao/mdb_table_init.go seedDefaultSettings). All other groups start
|
||||||
// empty and fall back to hardcoded defaults until an admin sets them.
|
// empty and fall back to hardcoded defaults until an admin sets them.
|
||||||
// Only exception: system.jwt_secret is auto-generated on first startup.
|
// Only exception: system.jwt_secret is auto-generated on first startup.
|
||||||
@@ -12,6 +13,7 @@ const (
|
|||||||
SettingGroupRate = "rate"
|
SettingGroupRate = "rate"
|
||||||
SettingGroupSystem = "system"
|
SettingGroupSystem = "system"
|
||||||
SettingGroupEpay = "epay"
|
SettingGroupEpay = "epay"
|
||||||
|
SettingGroupOkPay = "okpay"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -42,10 +44,20 @@ const (
|
|||||||
SettingKeyEpayDefaultToken = "epay.default_token"
|
SettingKeyEpayDefaultToken = "epay.default_token"
|
||||||
SettingKeyEpayDefaultCurrency = "epay.default_currency"
|
SettingKeyEpayDefaultCurrency = "epay.default_currency"
|
||||||
SettingKeyEpayDefaultNetwork = "epay.default_network"
|
SettingKeyEpayDefaultNetwork = "epay.default_network"
|
||||||
|
|
||||||
|
// OkPay hosted-checkout settings.
|
||||||
|
SettingKeyOkPayEnabled = "okpay.enabled"
|
||||||
|
SettingKeyOkPayShopID = "okpay.shop_id"
|
||||||
|
SettingKeyOkPayShopToken = "okpay.shop_token"
|
||||||
|
SettingKeyOkPayAPIURL = "okpay.api_url"
|
||||||
|
SettingKeyOkPayCallbackURL = "okpay.callback_url"
|
||||||
|
SettingKeyOkPayReturnURL = "okpay.return_url"
|
||||||
|
SettingKeyOkPayTimeoutSeconds = "okpay.timeout_seconds"
|
||||||
|
SettingKeyOkPayAllowTokens = "okpay.allow_tokens"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Setting struct {
|
type Setting struct {
|
||||||
Group string `gorm:"column:group;size:32;index:settings_group_index" json:"group" enums:"brand,rate,system" example:"rate"`
|
Group string `gorm:"column:group;size:32;index:settings_group_index" json:"group" enums:"brand,rate,system,epay,okpay" example:"rate"`
|
||||||
Key string `gorm:"column:key;uniqueIndex:settings_key_uindex;size:128" json:"key" example:"rate.forced_usdt_rate"`
|
Key string `gorm:"column:key;uniqueIndex:settings_key_uindex;size:128" json:"key" example:"rate.forced_usdt_rate"`
|
||||||
Value string `gorm:"column:value;type:text" json:"value" example:"7.2"`
|
Value string `gorm:"column:value;type:text" json:"value" example:"7.2"`
|
||||||
Type string `gorm:"column:type;size:16;default:string" json:"type" enums:"string,int,bool,json" example:"string"`
|
Type string `gorm:"column:type;size:16;default:string" json:"type" enums:"string,int,bool,json" example:"string"`
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ type OrderProcessingRequest struct {
|
|||||||
type SwitchNetworkRequest struct {
|
type SwitchNetworkRequest struct {
|
||||||
TradeId string `json:"trade_id" validate:"required" example:"T2026041612345678"`
|
TradeId string `json:"trade_id" validate:"required" example:"T2026041612345678"`
|
||||||
Token string `json:"token" validate:"required" example:"USDT"`
|
Token string `json:"token" validate:"required" example:"USDT"`
|
||||||
Network string `json:"network" validate:"required" example:"ethereum"`
|
Network string `json:"network" validate:"required" example:"okpay,tron,solana,ethereum"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r SwitchNetworkRequest) Translates() map[string]string {
|
func (r SwitchNetworkRequest) Translates() map[string]string {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ type CheckoutCounterResponse struct {
|
|||||||
Network string `json:"network" example:"tron"` // 网络 TRON ETH ...
|
Network string `json:"network" example:"tron"` // 网络 TRON ETH ...
|
||||||
ExpirationTime int64 `json:"expiration_time" example:"1713264600"` // 过期时间 时间戳
|
ExpirationTime int64 `json:"expiration_time" example:"1713264600"` // 过期时间 时间戳
|
||||||
RedirectUrl string `json:"redirect_url" example:"https://example.com/success"`
|
RedirectUrl string `json:"redirect_url" example:"https://example.com/success"`
|
||||||
|
PaymentUrl string `json:"payment_url" example:"https://pay.example.com/checkout/T2026041612345678"` // 支付链接;链上订单通常为本地收银台,OkPay 子订单为第三方 payLink
|
||||||
CreatedAt int64 `json:"created_at" example:"1713264000"` // 订单创建时间 时间戳
|
CreatedAt int64 `json:"created_at" example:"1713264000"` // 订单创建时间 时间戳
|
||||||
IsSelected bool `json:"is_selected" example:"false"`
|
IsSelected bool `json:"is_selected" example:"false"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,25 @@ type NetworkTokenSupport struct {
|
|||||||
Tokens []string `json:"tokens" example:"USDT,USDC"`
|
Tokens []string `json:"tokens" example:"USDT,USDC"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SupportedAssetsResponse struct {
|
type EpayPublicConfig struct {
|
||||||
Supports []NetworkTokenSupport `json:"supports"`
|
DefaultToken string `json:"default_token" example:"usdt"`
|
||||||
|
DefaultCurrency string `json:"default_currency" example:"cny"`
|
||||||
|
DefaultNetwork string `json:"default_network" example:"tron"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type OkPayPublicConfig struct {
|
||||||
|
Enabled bool `json:"enabled" example:"true"`
|
||||||
|
AllowTokens []string `json:"allow_tokens" example:"USDT,TRX"`
|
||||||
|
ShopID string `json:"shop_id,omitempty" example:"okpay-shop-test"`
|
||||||
|
ShopToken string `json:"shop_token,omitempty" example:"secret-token"`
|
||||||
|
APIURL string `json:"api_url,omitempty" example:"https://api.okaypay.me/shop/"`
|
||||||
|
CallbackURL string `json:"callback_url,omitempty" example:"https://pay.example.com/payments/okpay/v1/notify"`
|
||||||
|
ReturnURL string `json:"return_url,omitempty" example:"https://pay.example.com/success"`
|
||||||
|
TimeoutSeconds int `json:"timeout_seconds,omitempty" example:"10"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PublicConfigResponse struct {
|
||||||
|
SupportedAssets []NetworkTokenSupport `json:"supported_assets"`
|
||||||
|
Epay EpayPublicConfig `json:"epay"`
|
||||||
|
OkPay OkPayPublicConfig `json:"okpay"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,278 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"path"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/GMWalletApp/epusdt/model/data"
|
||||||
|
"github.com/GMWalletApp/epusdt/model/request"
|
||||||
|
"github.com/GMWalletApp/epusdt/util/constant"
|
||||||
|
"github.com/GMWalletApp/epusdt/util/http_client"
|
||||||
|
"github.com/GMWalletApp/epusdt/util/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type okPayCreateDepositResponse struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Code int `json:"code"`
|
||||||
|
Data struct {
|
||||||
|
OrderID string `json:"order_id"`
|
||||||
|
PayURL string `json:"pay_url"`
|
||||||
|
} `json:"data"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type okPayDepositOrder struct {
|
||||||
|
ProviderOrderID string
|
||||||
|
PayURL string
|
||||||
|
}
|
||||||
|
|
||||||
|
type okPayNotifyPayload struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Code string `json:"code"`
|
||||||
|
OrderID string `json:"order_id"`
|
||||||
|
UniqueID string `json:"unique_id"`
|
||||||
|
PayUserID string `json:"pay_user_id"`
|
||||||
|
Amount string `json:"amount"`
|
||||||
|
Coin string `json:"coin"`
|
||||||
|
PayStatus string `json:"pay_status"`
|
||||||
|
NotifyType string `json:"notify_type"`
|
||||||
|
Sign string `json:"sign"`
|
||||||
|
RawFormData string `json:"raw_form_data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func okPaySign(form map[string]string, shopID string, shopToken string) map[string]string {
|
||||||
|
values := url.Values{}
|
||||||
|
for key, value := range form {
|
||||||
|
if strings.TrimSpace(value) == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
values.Set(key, value)
|
||||||
|
}
|
||||||
|
values.Set("id", shopID)
|
||||||
|
query, _ := url.QueryUnescape(values.Encode())
|
||||||
|
sum := md5.Sum([]byte(query + "&token=" + shopToken))
|
||||||
|
|
||||||
|
signed := make(map[string]string, len(values)+1)
|
||||||
|
for key, vals := range values {
|
||||||
|
if len(vals) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
signed[key] = vals[0]
|
||||||
|
}
|
||||||
|
signed["sign"] = strings.ToUpper(hex.EncodeToString(sum[:]))
|
||||||
|
return signed
|
||||||
|
}
|
||||||
|
|
||||||
|
func createOkPayDepositOrder(uniqueID string, amount float64, coin string, returnURL string) (*okPayDepositOrder, error) {
|
||||||
|
shopID := data.GetOkPayShopID()
|
||||||
|
shopToken := data.GetOkPayShopToken()
|
||||||
|
apiURL := strings.TrimSpace(data.GetOkPayAPIURL())
|
||||||
|
callbackURL := data.GetOkPayCallbackURL()
|
||||||
|
if shopID == "" || shopToken == "" || apiURL == "" || callbackURL == "" {
|
||||||
|
return nil, fmt.Errorf("okpay config incomplete")
|
||||||
|
}
|
||||||
|
|
||||||
|
if returnURL == "" {
|
||||||
|
returnURL = data.GetOkPayReturnURL()
|
||||||
|
}
|
||||||
|
|
||||||
|
form := map[string]string{
|
||||||
|
"unique_id": uniqueID,
|
||||||
|
"name": uniqueID,
|
||||||
|
"amount": fmt.Sprintf("%.2f", amount),
|
||||||
|
"coin": strings.ToUpper(strings.TrimSpace(coin)),
|
||||||
|
"callback_url": callbackURL,
|
||||||
|
"return_url": returnURL,
|
||||||
|
}
|
||||||
|
form = okPaySign(form, shopID, shopToken)
|
||||||
|
|
||||||
|
base, err := url.Parse(apiURL)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
base.Path = path.Join(base.Path, "payLink")
|
||||||
|
|
||||||
|
client := http_client.GetHttpClient()
|
||||||
|
client.SetTimeout(time.Duration(data.GetOkPayTimeoutSeconds()) * time.Second)
|
||||||
|
|
||||||
|
var payload okPayCreateDepositResponse
|
||||||
|
resp, err := client.R().
|
||||||
|
SetFormData(form).
|
||||||
|
SetResult(&payload).
|
||||||
|
Post(base.String())
|
||||||
|
if err != nil {
|
||||||
|
log.Sugar.Warnf("[okpay] create order request failed unique_id=%s api_url=%s callback_url=%s return_url=%s err=%v", uniqueID, base.String(), callbackURL, returnURL, err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if resp.StatusCode() >= 400 {
|
||||||
|
log.Sugar.Warnf("[okpay] create order http error unique_id=%s status=%s api_url=%s callback_url=%s return_url=%s body=%s", uniqueID, resp.Status(), base.String(), callbackURL, returnURL, resp.String())
|
||||||
|
return nil, fmt.Errorf("okpay http status: %s", resp.Status())
|
||||||
|
}
|
||||||
|
if payload.Data.OrderID == "" || payload.Data.PayURL == "" {
|
||||||
|
log.Sugar.Warnf("[okpay] create order rejected unique_id=%s api_url=%s callback_url=%s return_url=%s status=%s code=%d msg=%s", uniqueID, base.String(), callbackURL, returnURL, payload.Status, payload.Code, payload.Msg)
|
||||||
|
if payload.Msg != "" {
|
||||||
|
return nil, fmt.Errorf("okpay create order failed: %s (callback_url=%s)", payload.Msg, callbackURL)
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("okpay create order failed (callback_url=%s)", callbackURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &okPayDepositOrder{
|
||||||
|
ProviderOrderID: payload.Data.OrderID,
|
||||||
|
PayURL: payload.Data.PayURL,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyOkPayNotify(form map[string]string) bool {
|
||||||
|
shopID := data.GetOkPayShopID()
|
||||||
|
shopToken := data.GetOkPayShopToken()
|
||||||
|
signature := strings.TrimSpace(form["sign"])
|
||||||
|
if shopID == "" || shopToken == "" || signature == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected := okPayNotifySign(form, shopToken); expected != "" && strings.EqualFold(expected, signature) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned := make(map[string]string, len(form))
|
||||||
|
for key, value := range form {
|
||||||
|
if strings.EqualFold(key, "sign") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
unsigned[key] = value
|
||||||
|
}
|
||||||
|
signed := okPaySign(unsigned, shopID, shopToken)
|
||||||
|
return strings.EqualFold(strings.TrimSpace(signed["sign"]), signature)
|
||||||
|
}
|
||||||
|
|
||||||
|
func okPayNotifySign(form map[string]string, shopToken string) string {
|
||||||
|
orderedKeys := []string{
|
||||||
|
"code",
|
||||||
|
"data[order_id]",
|
||||||
|
"data[unique_id]",
|
||||||
|
"data[pay_user_id]",
|
||||||
|
"data[amount]",
|
||||||
|
"data[coin]",
|
||||||
|
"data[status]",
|
||||||
|
"data[type]",
|
||||||
|
"id",
|
||||||
|
"status",
|
||||||
|
}
|
||||||
|
|
||||||
|
pairs := make([]string, 0, len(orderedKeys))
|
||||||
|
for _, key := range orderedKeys {
|
||||||
|
value := strings.TrimSpace(form[key])
|
||||||
|
if value == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pairs = append(pairs, url.QueryEscape(key)+"="+url.QueryEscape(value))
|
||||||
|
}
|
||||||
|
if len(pairs) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
query, err := url.QueryUnescape(strings.Join(pairs, "&"))
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
sum := md5.Sum([]byte(query + "&token=" + shopToken))
|
||||||
|
return strings.ToUpper(hex.EncodeToString(sum[:]))
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseOkPayNotify(form map[string]string, rawFormData string) *okPayNotifyPayload {
|
||||||
|
return &okPayNotifyPayload{
|
||||||
|
ID: strings.TrimSpace(form["id"]),
|
||||||
|
Status: strings.TrimSpace(form["status"]),
|
||||||
|
Code: strings.TrimSpace(form["code"]),
|
||||||
|
OrderID: strings.TrimSpace(form["data[order_id]"]),
|
||||||
|
UniqueID: strings.TrimSpace(form["data[unique_id]"]),
|
||||||
|
PayUserID: strings.TrimSpace(form["data[pay_user_id]"]),
|
||||||
|
Amount: strings.TrimSpace(form["data[amount]"]),
|
||||||
|
Coin: strings.TrimSpace(form["data[coin]"]),
|
||||||
|
PayStatus: strings.TrimSpace(form["data[status]"]),
|
||||||
|
NotifyType: strings.TrimSpace(form["data[type]"]),
|
||||||
|
Sign: strings.TrimSpace(form["sign"]),
|
||||||
|
RawFormData: rawFormData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandleOkPayNotify(form map[string]string, rawFormData string) error {
|
||||||
|
if !verifyOkPayNotify(form) {
|
||||||
|
return fmt.Errorf("invalid okpay notify sign")
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := parseOkPayNotify(form, rawFormData)
|
||||||
|
|
||||||
|
if payload.ID == "" || payload.ID != data.GetOkPayShopID() {
|
||||||
|
return fmt.Errorf("okpay notify shop id mismatch: %s", payload.ID)
|
||||||
|
}
|
||||||
|
if payload.UniqueID == "" || payload.OrderID == "" {
|
||||||
|
return fmt.Errorf("missing okpay notify identifiers")
|
||||||
|
}
|
||||||
|
|
||||||
|
order, err := data.GetOrderInfoByTradeId(payload.UniqueID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if order.ID <= 0 {
|
||||||
|
return fmt.Errorf("okpay notify order not found: %s", payload.UniqueID)
|
||||||
|
}
|
||||||
|
if order.PayProvider != "okpay" {
|
||||||
|
return fmt.Errorf("okpay notify order provider mismatch: %s", payload.UniqueID)
|
||||||
|
}
|
||||||
|
|
||||||
|
providerRow, err := data.GetProviderOrderByTradeIDAndProvider(payload.UniqueID, order.PayProvider)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if providerRow.ID <= 0 {
|
||||||
|
return fmt.Errorf("okpay provider order not found: %s", payload.UniqueID)
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = data.SaveProviderOrderNotify(payload.UniqueID, order.PayProvider, payload.RawFormData)
|
||||||
|
|
||||||
|
if !strings.EqualFold(payload.Status, "success") || !strings.EqualFold(payload.NotifyType, "deposit") || payload.PayStatus != "1" {
|
||||||
|
log.Sugar.Infof("[okpay] notify ignored trade_id=%s status=%s pay_status=%s type=%s", payload.UniqueID, payload.Status, payload.PayStatus, payload.NotifyType)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if providerRow.ProviderOrderID != "" && providerRow.ProviderOrderID != payload.OrderID {
|
||||||
|
return fmt.Errorf("okpay provider order id mismatch: got=%s want=%s", payload.OrderID, providerRow.ProviderOrderID)
|
||||||
|
}
|
||||||
|
if !strings.EqualFold(strings.TrimSpace(order.Token), strings.TrimSpace(payload.Coin)) {
|
||||||
|
return fmt.Errorf("okpay coin mismatch: got=%s want=%s", payload.Coin, order.Token)
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyAmount, err := strconv.ParseFloat(payload.Amount, 64)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("invalid okpay amount: %w", err)
|
||||||
|
}
|
||||||
|
if fmt.Sprintf("%.2f", notifyAmount) != fmt.Sprintf("%.2f", order.ActualAmount) {
|
||||||
|
return fmt.Errorf("okpay amount mismatch: got=%.2f want=%.2f", notifyAmount, order.ActualAmount)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = OrderProcessing(&request.OrderProcessingRequest{
|
||||||
|
ReceiveAddress: order.ReceiveAddress,
|
||||||
|
Currency: order.Currency,
|
||||||
|
Token: order.Token,
|
||||||
|
Network: order.Network,
|
||||||
|
Amount: order.ActualAmount,
|
||||||
|
TradeId: order.TradeId,
|
||||||
|
BlockTransactionId: payload.OrderID,
|
||||||
|
})
|
||||||
|
if err != nil && err != constant.OrderBlockAlreadyProcess {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = data.MarkProviderOrderPaid(payload.UniqueID, order.PayProvider, payload.RawFormData); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -120,6 +120,7 @@ func CreateTransaction(req *request.CreateTransactionRequest, apiKey *mdb.ApiKey
|
|||||||
RedirectUrl: req.RedirectUrl,
|
RedirectUrl: req.RedirectUrl,
|
||||||
Name: req.Name,
|
Name: req.Name,
|
||||||
PaymentType: req.PaymentType,
|
PaymentType: req.PaymentType,
|
||||||
|
PayProvider: mdb.PaymentProviderOnChain,
|
||||||
ApiKeyID: apiKeyID(apiKey),
|
ApiKeyID: apiKeyID(apiKey),
|
||||||
}
|
}
|
||||||
if err = data.CreateOrderWithTransaction(tx, order); err != nil {
|
if err = data.CreateOrderWithTransaction(tx, order); err != nil {
|
||||||
@@ -199,6 +200,11 @@ func OrderProcessing(req *request.OrderProcessingRequest) error {
|
|||||||
if err = data.ExpireOrderByTradeId(sub.TradeId); err != nil {
|
if err = data.ExpireOrderByTradeId(sub.TradeId); err != nil {
|
||||||
log.Sugar.Warnf("[order] expire sub-order failed, trade_id=%s, err=%v", sub.TradeId, err)
|
log.Sugar.Warnf("[order] expire sub-order failed, trade_id=%s, err=%v", sub.TradeId, err)
|
||||||
}
|
}
|
||||||
|
if sub.PayProvider != "" && sub.PayProvider != mdb.PaymentProviderOnChain {
|
||||||
|
if err = data.MarkProviderOrderExpired(sub.TradeId, sub.PayProvider); err != nil {
|
||||||
|
log.Sugar.Warnf("[order] expire provider order failed, trade_id=%s, provider=%s, err=%v", sub.TradeId, sub.PayProvider, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
if err = data.UnLockTransaction(sub.Network, sub.ReceiveAddress, sub.Token, sub.ActualAmount); err != nil {
|
if err = data.UnLockTransaction(sub.Network, sub.ReceiveAddress, sub.Token, sub.ActualAmount); err != nil {
|
||||||
log.Sugar.Warnf("[order] unlock sub-order transaction failed, trade_id=%s, err=%v", sub.TradeId, err)
|
log.Sugar.Warnf("[order] unlock sub-order transaction failed, trade_id=%s, err=%v", sub.TradeId, err)
|
||||||
}
|
}
|
||||||
@@ -257,6 +263,11 @@ func OrderProcessing(req *request.OrderProcessingRequest) error {
|
|||||||
|
|
||||||
// Release sibling locks after their status transitions commit.
|
// Release sibling locks after their status transitions commit.
|
||||||
for _, sib := range siblings {
|
for _, sib := range siblings {
|
||||||
|
if sib.PayProvider != "" && sib.PayProvider != mdb.PaymentProviderOnChain {
|
||||||
|
if err = data.MarkProviderOrderExpired(sib.TradeId, sib.PayProvider); err != nil {
|
||||||
|
log.Sugar.Warnf("[order] expire sibling provider order failed, trade_id=%s, provider=%s, err=%v", sib.TradeId, sib.PayProvider, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
if err = data.UnLockTransaction(sib.Network, sib.ReceiveAddress, sib.Token, sib.ActualAmount); err != nil {
|
if err = data.UnLockTransaction(sib.Network, sib.ReceiveAddress, sib.Token, sib.ActualAmount); err != nil {
|
||||||
log.Sugar.Warnf("[order] unlock sibling transaction failed, trade_id=%s, err=%v", sib.TradeId, err)
|
log.Sugar.Warnf("[order] unlock sibling transaction failed, trade_id=%s, err=%v", sib.TradeId, err)
|
||||||
}
|
}
|
||||||
@@ -346,6 +357,10 @@ func SwitchNetwork(req *request.SwitchNetworkRequest) (*response.CheckoutCounter
|
|||||||
return nil, constant.OrderNotWaitPay
|
return nil, constant.OrderNotWaitPay
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if network == mdb.PaymentProviderOkPay {
|
||||||
|
return switchToOkPay(parent, token)
|
||||||
|
}
|
||||||
|
|
||||||
// 2. Same token+network as parent → mark selected and return
|
// 2. Same token+network as parent → mark selected and return
|
||||||
if strings.EqualFold(parent.Token, token) && strings.EqualFold(parent.Network, network) {
|
if strings.EqualFold(parent.Token, token) && strings.EqualFold(parent.Network, network) {
|
||||||
_ = data.MarkOrderSelected(parent.TradeId)
|
_ = data.MarkOrderSelected(parent.TradeId)
|
||||||
@@ -427,6 +442,7 @@ func SwitchNetwork(req *request.SwitchNetworkRequest) (*response.CheckoutCounter
|
|||||||
Name: parent.Name,
|
Name: parent.Name,
|
||||||
CallBackConfirm: mdb.CallBackConfirmOk, // don't trigger callback on sub-order
|
CallBackConfirm: mdb.CallBackConfirmOk, // don't trigger callback on sub-order
|
||||||
PaymentType: parent.PaymentType,
|
PaymentType: parent.PaymentType,
|
||||||
|
PayProvider: mdb.PaymentProviderOnChain,
|
||||||
ApiKeyID: parent.ApiKeyID, // inherit from parent so resolveOrderApiKey never fails
|
ApiKeyID: parent.ApiKeyID, // inherit from parent so resolveOrderApiKey never fails
|
||||||
}
|
}
|
||||||
if err = data.CreateOrderWithTransaction(tx, subOrder); err != nil {
|
if err = data.CreateOrderWithTransaction(tx, subOrder); err != nil {
|
||||||
@@ -458,7 +474,140 @@ func buildCheckoutResponse(order *mdb.Orders) *response.CheckoutCounterResponse
|
|||||||
Network: order.Network,
|
Network: order.Network,
|
||||||
ExpirationTime: order.CreatedAt.AddMinutes(config.GetOrderExpirationTime()).TimestampMilli(),
|
ExpirationTime: order.CreatedAt.AddMinutes(config.GetOrderExpirationTime()).TimestampMilli(),
|
||||||
RedirectUrl: order.RedirectUrl,
|
RedirectUrl: order.RedirectUrl,
|
||||||
|
PaymentUrl: fmt.Sprintf("%s/pay/checkout-counter/%s", config.GetAppUri(), order.TradeId),
|
||||||
CreatedAt: order.CreatedAt.TimestampMilli(),
|
CreatedAt: order.CreatedAt.TimestampMilli(),
|
||||||
IsSelected: order.IsSelected,
|
IsSelected: order.IsSelected,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func switchToOkPay(parent *mdb.Orders, token string) (*response.CheckoutCounterResponse, error) {
|
||||||
|
if !data.GetOkPayEnabled() {
|
||||||
|
return nil, constant.PaymentProviderNotEnabled
|
||||||
|
}
|
||||||
|
if data.GetOkPayShopID() == "" || data.GetOkPayShopToken() == "" || data.GetOkPayAPIURL() == "" || data.GetOkPayCallbackURL() == "" {
|
||||||
|
return nil, constant.PaymentProviderConfigErr
|
||||||
|
}
|
||||||
|
if !okPayTokenAllowed(token) {
|
||||||
|
return nil, constant.PaymentProviderNotSupport
|
||||||
|
}
|
||||||
|
|
||||||
|
existing, err := data.GetSubOrderByTokenPayProvider(parent.TradeId, token, mdb.PaymentProviderOkPay)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if existing.ID > 0 {
|
||||||
|
providerRow, err := data.GetProviderOrderByTradeIDAndProvider(existing.TradeId, mdb.PaymentProviderOkPay)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if providerRow.ID == 0 || strings.TrimSpace(providerRow.PayURL) == "" {
|
||||||
|
return nil, constant.SystemErr
|
||||||
|
}
|
||||||
|
_ = data.MarkOrderSelected(parent.TradeId)
|
||||||
|
_ = data.MarkOrderSelected(existing.TradeId)
|
||||||
|
_ = data.RefreshOrderExpiration(parent.TradeId)
|
||||||
|
existing.IsSelected = true
|
||||||
|
resp := buildCheckoutResponse(existing)
|
||||||
|
resp.PaymentUrl = providerRow.PayURL
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
count, err := data.CountActiveSubOrders(parent.TradeId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if count >= MaxSubOrders {
|
||||||
|
return nil, constant.SubOrderLimitExceeded
|
||||||
|
}
|
||||||
|
|
||||||
|
rate := config.GetRateForCoin(strings.ToLower(token), strings.ToLower(parent.Currency))
|
||||||
|
if rate <= 0 {
|
||||||
|
return nil, constant.RateAmountErr
|
||||||
|
}
|
||||||
|
decimalPayAmount := decimal.NewFromFloat(parent.Amount)
|
||||||
|
decimalTokenAmount := decimalPayAmount.Mul(decimal.NewFromFloat(rate))
|
||||||
|
if decimalTokenAmount.Cmp(decimal.NewFromFloat(UsdtMinimumPaymentAmount)) == -1 {
|
||||||
|
return nil, constant.PayAmountErr
|
||||||
|
}
|
||||||
|
|
||||||
|
subTradeID := GenerateCode()
|
||||||
|
amount := math.MustParsePrecFloat64(decimalTokenAmount.InexactFloat64(), 2)
|
||||||
|
returnURL := strings.TrimSpace(parent.RedirectUrl)
|
||||||
|
if returnURL == "" {
|
||||||
|
returnURL = data.GetOkPayReturnURL()
|
||||||
|
}
|
||||||
|
if returnURL == "" {
|
||||||
|
returnURL = fmt.Sprintf("%s/pay/checkout-counter/%s", config.GetAppUri(), parent.TradeId)
|
||||||
|
}
|
||||||
|
|
||||||
|
tx := dao.Mdb.Begin()
|
||||||
|
subOrder := &mdb.Orders{
|
||||||
|
TradeId: subTradeID,
|
||||||
|
OrderId: subTradeID,
|
||||||
|
ParentTradeId: parent.TradeId,
|
||||||
|
Amount: parent.Amount,
|
||||||
|
Currency: parent.Currency,
|
||||||
|
ActualAmount: amount,
|
||||||
|
ReceiveAddress: "OKPAY",
|
||||||
|
Token: token,
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
Status: mdb.StatusWaitPay,
|
||||||
|
IsSelected: true,
|
||||||
|
NotifyUrl: "",
|
||||||
|
RedirectUrl: parent.RedirectUrl,
|
||||||
|
Name: parent.Name,
|
||||||
|
CallBackConfirm: mdb.CallBackConfirmOk,
|
||||||
|
PaymentType: parent.PaymentType,
|
||||||
|
PayProvider: mdb.PaymentProviderOkPay,
|
||||||
|
ApiKeyID: parent.ApiKeyID,
|
||||||
|
}
|
||||||
|
if err = data.CreateOrderWithTransaction(tx, subOrder); err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
providerRow := &mdb.ProviderOrder{
|
||||||
|
TradeId: subTradeID,
|
||||||
|
Provider: mdb.PaymentProviderOkPay,
|
||||||
|
ProviderOrderID: "",
|
||||||
|
PayURL: "",
|
||||||
|
Amount: amount,
|
||||||
|
Coin: token,
|
||||||
|
Status: mdb.ProviderOrderStatusCreating,
|
||||||
|
}
|
||||||
|
if err = data.CreateProviderOrderWithTransaction(tx, providerRow); err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = tx.Commit().Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
okpayOrder, err := createOkPayDepositOrder(subTradeID, amount, token, returnURL)
|
||||||
|
if err != nil {
|
||||||
|
_ = data.MarkProviderOrderFailed(subTradeID, mdb.PaymentProviderOkPay)
|
||||||
|
_ = data.ExpireOrderByTradeID(subTradeID)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = data.UpdateProviderOrderCreated(subTradeID, mdb.PaymentProviderOkPay, okpayOrder.ProviderOrderID, okpayOrder.PayURL); err != nil {
|
||||||
|
_ = data.MarkProviderOrderFailed(subTradeID, mdb.PaymentProviderOkPay)
|
||||||
|
_ = data.ExpireOrderByTradeID(subTradeID)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = data.MarkOrderSelected(parent.TradeId)
|
||||||
|
_ = data.RefreshOrderExpiration(parent.TradeId)
|
||||||
|
|
||||||
|
resp := buildCheckoutResponse(subOrder)
|
||||||
|
resp.PaymentUrl = okpayOrder.PayURL
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func okPayTokenAllowed(token string) bool {
|
||||||
|
for _, item := range data.GetOkPayAllowTokens() {
|
||||||
|
if strings.EqualFold(item, token) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
@@ -612,6 +612,81 @@ func TestOrderProcessingSubOrderPaidParentKeepsOwnFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOrderProcessingParentDirectPayExpiresOkPayProviderOrder(t *testing.T) {
|
||||||
|
cleanup := testutil.SetupTestDatabases(t)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
if _, err := data.AddWalletAddress("TTestTronAddress001"); err != nil {
|
||||||
|
t.Fatalf("add tron wallet: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
parentReq := newCreateTransactionRequest("order_parent_direct_okpay_expire", 1)
|
||||||
|
parentReq.Network = mdb.NetworkTron
|
||||||
|
parentResp, err := CreateTransaction(parentReq, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("create parent order: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
subOrder := &mdb.Orders{
|
||||||
|
TradeId: "okpay_sub_parent_direct_expire",
|
||||||
|
OrderId: "okpay_sub_parent_direct_expire",
|
||||||
|
ParentTradeId: parentResp.TradeId,
|
||||||
|
Amount: parentResp.Amount,
|
||||||
|
Currency: parentResp.Currency,
|
||||||
|
ActualAmount: 0.15,
|
||||||
|
ReceiveAddress: "OKPAY",
|
||||||
|
Token: "USDT",
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
Status: mdb.StatusWaitPay,
|
||||||
|
NotifyUrl: "",
|
||||||
|
CallBackConfirm: mdb.CallBackConfirmOk,
|
||||||
|
PayProvider: mdb.PaymentProviderOkPay,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(subOrder).Error; err != nil {
|
||||||
|
t.Fatalf("create okpay sub-order: %v", err)
|
||||||
|
}
|
||||||
|
providerRow := &mdb.ProviderOrder{
|
||||||
|
TradeId: subOrder.TradeId,
|
||||||
|
Provider: mdb.PaymentProviderOkPay,
|
||||||
|
ProviderOrderID: "okp-parent-direct-expire",
|
||||||
|
PayURL: "https://t.me/ExampleWalletBot?start=shop_deposit--okpay-order-parent-direct-expire",
|
||||||
|
Amount: subOrder.ActualAmount,
|
||||||
|
Coin: subOrder.Token,
|
||||||
|
Status: mdb.ProviderOrderStatusPending,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(providerRow).Error; err != nil {
|
||||||
|
t.Fatalf("create provider row: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = OrderProcessing(&request.OrderProcessingRequest{
|
||||||
|
ReceiveAddress: parentResp.ReceiveAddress,
|
||||||
|
Token: strings.ToUpper(parentResp.Token),
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
TradeId: parentResp.TradeId,
|
||||||
|
Amount: parentResp.ActualAmount,
|
||||||
|
BlockTransactionId: "block_parent_direct_okpay_expire",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("order processing parent direct pay: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expiredSub, err := data.GetOrderInfoByTradeId(subOrder.TradeId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("reload sub-order: %v", err)
|
||||||
|
}
|
||||||
|
if expiredSub.Status != mdb.StatusExpired {
|
||||||
|
t.Fatalf("sub-order status = %d, want %d", expiredSub.Status, mdb.StatusExpired)
|
||||||
|
}
|
||||||
|
|
||||||
|
expiredProviderRow, err := data.GetProviderOrderByTradeIDAndProvider(subOrder.TradeId, mdb.PaymentProviderOkPay)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("reload provider row: %v", err)
|
||||||
|
}
|
||||||
|
if expiredProviderRow.Status != mdb.ProviderOrderStatusExpired {
|
||||||
|
t.Fatalf("provider row status = %q, want %q", expiredProviderRow.Status, mdb.ProviderOrderStatusExpired)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestOrderProcessingSubOrderExpiresSiblingsAndReleasesLocks verifies that when one
|
// TestOrderProcessingSubOrderExpiresSiblingsAndReleasesLocks verifies that when one
|
||||||
// sub-order is paid all sibling sub-orders are expired and their runtime locks (as
|
// sub-order is paid all sibling sub-orders are expired and their runtime locks (as
|
||||||
// well as the parent's lock) are released.
|
// well as the parent's lock) are released.
|
||||||
|
|||||||
@@ -682,10 +682,31 @@ func TestAdminDashboard_AllRoutes(t *testing.T) {
|
|||||||
func TestAdminSettings_ListAndUpsert(t *testing.T) {
|
func TestAdminSettings_ListAndUpsert(t *testing.T) {
|
||||||
e, token := setupAdminTestEnv(t)
|
e, token := setupAdminTestEnv(t)
|
||||||
|
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopToken, "token-visible-in-settings", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_token: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// List settings.
|
// List settings.
|
||||||
rec := doGetAdmin(e, "/admin/api/v1/settings", token)
|
rec := doGetAdmin(e, "/admin/api/v1/settings", token)
|
||||||
t.Logf("ListSettings: %s", rec.Body.String())
|
t.Logf("ListSettings: %s", rec.Body.String())
|
||||||
assertOK(t, rec)
|
resp := assertOK(t, rec)
|
||||||
|
rows, ok := resp["data"].([]interface{})
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("expected settings array, got %T", resp["data"])
|
||||||
|
}
|
||||||
|
foundToken := false
|
||||||
|
for _, row := range rows {
|
||||||
|
item, _ := row.(map[string]interface{})
|
||||||
|
if item["key"] == mdb.SettingKeyOkPayShopToken {
|
||||||
|
foundToken = true
|
||||||
|
if item["value"] != "token-visible-in-settings" {
|
||||||
|
t.Fatalf("okpay.shop_token value = %v, want token-visible-in-settings", item["value"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !foundToken {
|
||||||
|
t.Fatalf("expected admin settings list to expose %s", mdb.SettingKeyOkPayShopToken)
|
||||||
|
}
|
||||||
|
|
||||||
// Upsert a setting.
|
// Upsert a setting.
|
||||||
rec = doPutAdmin(e, "/admin/api/v1/settings", map[string]interface{}{
|
rec = doPutAdmin(e, "/admin/api/v1/settings", map[string]interface{}{
|
||||||
@@ -708,6 +729,39 @@ func TestAdminSettings_DeleteNonExistent(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAdminConfig_ExposesOkPayCredentials(t *testing.T) {
|
||||||
|
e, token := setupAdminTestEnv(t)
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayEnabled, "true", mdb.SettingTypeBool); err != nil {
|
||||||
|
t.Fatalf("seed okpay.enabled: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopID, "shop-admin-1", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_id: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopToken, "token-admin-1", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_token: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayCallbackURL, "https://example.com/notify", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.callback_url: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rec := doGetAdmin(e, "/admin/api/v1/config", token)
|
||||||
|
resp := assertOK(t, rec)
|
||||||
|
dataObj, _ := resp["data"].(map[string]interface{})
|
||||||
|
okpay, ok := dataObj["okpay"].(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("expected okpay object, got %T", dataObj["okpay"])
|
||||||
|
}
|
||||||
|
if okpay["shop_id"] != "shop-admin-1" {
|
||||||
|
t.Fatalf("shop_id = %v, want shop-admin-1", okpay["shop_id"])
|
||||||
|
}
|
||||||
|
if okpay["shop_token"] != "token-admin-1" {
|
||||||
|
t.Fatalf("shop_token = %v, want token-admin-1", okpay["shop_token"])
|
||||||
|
}
|
||||||
|
if okpay["callback_url"] != "https://example.com/notify" {
|
||||||
|
t.Fatalf("callback_url = %v", okpay["callback_url"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ─── Notification Channels ───────────────────────────────────────────────────
|
// ─── Notification Channels ───────────────────────────────────────────────────
|
||||||
|
|
||||||
// TestAdminNotificationChannels_CRUD verifies notification channel routes.
|
// TestAdminNotificationChannels_CRUD verifies notification channel routes.
|
||||||
|
|||||||
+6
-5
@@ -45,9 +45,11 @@ func RegisterRoute(e *echo.Echo) {
|
|||||||
// gmpay v1 routes
|
// gmpay v1 routes
|
||||||
gmpayV1 := paymentRoute.Group("/gmpay/v1")
|
gmpayV1 := paymentRoute.Group("/gmpay/v1")
|
||||||
gmpayV1.POST("/order/create-transaction", comm.Ctrl.CreateTransaction, middleware.CheckApiSign())
|
gmpayV1.POST("/order/create-transaction", comm.Ctrl.CreateTransaction, middleware.CheckApiSign())
|
||||||
gmpayV1.GET("/supported-assets", comm.Ctrl.GetSupportedAssets)
|
gmpayV1.GET("/config", comm.Ctrl.GetPublicConfig)
|
||||||
// gmpayV1.GET("/supported-assets/records", comm.Ctrl.ListSupportedAssetRecords)
|
|
||||||
// gmpayV1.GET("/supported-assets/:id", comm.Ctrl.GetSupportedAsset)
|
// okpay v1 routes
|
||||||
|
okpayV1 := paymentRoute.Group("/okpay/v1")
|
||||||
|
okpayV1.POST("/notify", comm.Ctrl.OkPayNotify)
|
||||||
|
|
||||||
// epay v1 routes
|
// epay v1 routes
|
||||||
//
|
//
|
||||||
@@ -222,8 +224,7 @@ func registerAdminRoutes(e *echo.Echo) {
|
|||||||
authed.POST("/notification-channels/:id/status", admin.Ctrl.ChangeNotificationChannelStatus)
|
authed.POST("/notification-channels/:id/status", admin.Ctrl.ChangeNotificationChannelStatus)
|
||||||
authed.DELETE("/notification-channels/:id", admin.Ctrl.DeleteNotificationChannel)
|
authed.DELETE("/notification-channels/:id", admin.Ctrl.DeleteNotificationChannel)
|
||||||
|
|
||||||
// gmpayV1.GET("/supported-assets", comm.Ctrl.GetSupportedAssets)
|
authed.GET("/config", comm.Ctrl.GetPublicConfig) // wrap for admin console, same payload as public endpoint
|
||||||
authed.GET("/supported-assets", comm.Ctrl.GetSupportedAssets) // wrap for admin console, same handler as public endpoint
|
|
||||||
|
|
||||||
// Chains
|
// Chains
|
||||||
authed.GET("/chains", admin.Ctrl.ListChains)
|
authed.GET("/chains", admin.Ctrl.ListChains)
|
||||||
|
|||||||
+549
-14
@@ -1,8 +1,11 @@
|
|||||||
package route
|
package route
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"net/url"
|
"net/url"
|
||||||
@@ -14,8 +17,10 @@ import (
|
|||||||
"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"
|
||||||
|
"github.com/GMWalletApp/epusdt/util/http_client"
|
||||||
"github.com/GMWalletApp/epusdt/util/log"
|
"github.com/GMWalletApp/epusdt/util/log"
|
||||||
"github.com/GMWalletApp/epusdt/util/sign"
|
"github.com/GMWalletApp/epusdt/util/sign"
|
||||||
|
"github.com/go-resty/resty/v2"
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
@@ -64,6 +69,7 @@ func setupTestEnv(t *testing.T) *echo.Echo {
|
|||||||
&mdb.Chain{},
|
&mdb.Chain{},
|
||||||
&mdb.ChainToken{},
|
&mdb.ChainToken{},
|
||||||
&mdb.RpcNode{},
|
&mdb.RpcNode{},
|
||||||
|
&mdb.ProviderOrder{},
|
||||||
)
|
)
|
||||||
|
|
||||||
// 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
|
||||||
@@ -136,6 +142,47 @@ func signBody(body map[string]interface{}) map[string]interface{} {
|
|||||||
return body
|
return body
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func signOkPayNotifyPayload(shopToken string, body map[string]interface{}) string {
|
||||||
|
data, _ := body["data"].(map[string]interface{})
|
||||||
|
ordered := []struct {
|
||||||
|
key string
|
||||||
|
value string
|
||||||
|
}{
|
||||||
|
{"code", stringifyOkPayTestValue(body["code"])},
|
||||||
|
{"data[order_id]", stringifyOkPayTestValue(data["order_id"])},
|
||||||
|
{"data[unique_id]", stringifyOkPayTestValue(data["unique_id"])},
|
||||||
|
{"data[pay_user_id]", stringifyOkPayTestValue(data["pay_user_id"])},
|
||||||
|
{"data[amount]", stringifyOkPayTestValue(data["amount"])},
|
||||||
|
{"data[coin]", stringifyOkPayTestValue(data["coin"])},
|
||||||
|
{"data[status]", stringifyOkPayTestValue(data["status"])},
|
||||||
|
{"data[type]", stringifyOkPayTestValue(data["type"])},
|
||||||
|
{"id", stringifyOkPayTestValue(body["id"])},
|
||||||
|
{"status", stringifyOkPayTestValue(body["status"])},
|
||||||
|
}
|
||||||
|
|
||||||
|
pairs := make([]string, 0, len(ordered))
|
||||||
|
for _, item := range ordered {
|
||||||
|
if item.value == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pairs = append(pairs, url.QueryEscape(item.key)+"="+url.QueryEscape(item.value))
|
||||||
|
}
|
||||||
|
query, _ := url.QueryUnescape(strings.Join(pairs, "&"))
|
||||||
|
sum := md5.Sum([]byte(query + "&token=" + shopToken))
|
||||||
|
return strings.ToUpper(hex.EncodeToString(sum[:]))
|
||||||
|
}
|
||||||
|
|
||||||
|
func stringifyOkPayTestValue(value interface{}) string {
|
||||||
|
switch v := value.(type) {
|
||||||
|
case nil:
|
||||||
|
return ""
|
||||||
|
case string:
|
||||||
|
return strings.TrimSpace(v)
|
||||||
|
default:
|
||||||
|
return strings.TrimSpace(fmt.Sprint(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func doPost(e *echo.Echo, path string, body map[string]interface{}) *httptest.ResponseRecorder {
|
func doPost(e *echo.Echo, path string, body map[string]interface{}) *httptest.ResponseRecorder {
|
||||||
jsonBytes, _ := json.Marshal(body)
|
jsonBytes, _ := json.Marshal(body)
|
||||||
req := httptest.NewRequest(http.MethodPost, path, strings.NewReader(string(jsonBytes)))
|
req := httptest.NewRequest(http.MethodPost, path, strings.NewReader(string(jsonBytes)))
|
||||||
@@ -311,11 +358,11 @@ func TestCreateOrderGmpayV1FormData(t *testing.T) {
|
|||||||
t.Logf("Form-data order created: trade_id=%v", data["trade_id"])
|
t.Logf("Form-data order created: trade_id=%v", data["trade_id"])
|
||||||
}
|
}
|
||||||
|
|
||||||
// getSupportedNetworks is a helper that calls GET /payments/gmpay/v1/supported-assets
|
// getSupportedNetworks is a helper that calls GET /payments/gmpay/v1/config
|
||||||
// and returns a map of network → []token for easy assertions.
|
// and returns a map of network → []token for easy assertions.
|
||||||
func getSupportedNetworks(t *testing.T, e *echo.Echo) map[string][]string {
|
func getSupportedNetworks(t *testing.T, e *echo.Echo) map[string][]string {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
req := httptest.NewRequest(http.MethodGet, "/payments/gmpay/v1/supported-assets", nil)
|
req := httptest.NewRequest(http.MethodGet, "/payments/gmpay/v1/config", nil)
|
||||||
rec := httptest.NewRecorder()
|
rec := httptest.NewRecorder()
|
||||||
e.ServeHTTP(rec, req)
|
e.ServeHTTP(rec, req)
|
||||||
if rec.Code != http.StatusOK {
|
if rec.Code != http.StatusOK {
|
||||||
@@ -323,7 +370,7 @@ func getSupportedNetworks(t *testing.T, e *echo.Echo) map[string][]string {
|
|||||||
}
|
}
|
||||||
resp := parseResp(t, rec)
|
resp := parseResp(t, rec)
|
||||||
rawData, _ := resp["data"].(map[string]interface{})
|
rawData, _ := resp["data"].(map[string]interface{})
|
||||||
rawSupports, _ := rawData["supports"].([]interface{})
|
rawSupports, _ := rawData["supported_assets"].([]interface{})
|
||||||
result := make(map[string][]string, len(rawSupports))
|
result := make(map[string][]string, len(rawSupports))
|
||||||
for _, item := range rawSupports {
|
for _, item := range rawSupports {
|
||||||
row := item.(map[string]interface{})
|
row := item.(map[string]interface{})
|
||||||
@@ -340,7 +387,7 @@ func getSupportedNetworks(t *testing.T, e *echo.Echo) map[string][]string {
|
|||||||
|
|
||||||
// TestGetSupportedAssets_ChainTokenToggle verifies that:
|
// TestGetSupportedAssets_ChainTokenToggle verifies that:
|
||||||
// - disabling a chain_token removes that token (and possibly the whole network)
|
// - disabling a chain_token removes that token (and possibly the whole network)
|
||||||
// from the /supported-assets response
|
// from the /config supported_assets response
|
||||||
// - re-enabling it brings it back
|
// - re-enabling it brings it back
|
||||||
func TestGetSupportedAssets_ChainTokenToggle(t *testing.T) {
|
func TestGetSupportedAssets_ChainTokenToggle(t *testing.T) {
|
||||||
e := setupTestEnv(t)
|
e := setupTestEnv(t)
|
||||||
@@ -348,7 +395,7 @@ func TestGetSupportedAssets_ChainTokenToggle(t *testing.T) {
|
|||||||
// Baseline: tron should appear with USDT and TRX.
|
// Baseline: tron should appear with USDT and TRX.
|
||||||
before := getSupportedNetworks(t, e)
|
before := getSupportedNetworks(t, e)
|
||||||
if _, ok := before["tron"]; !ok {
|
if _, ok := before["tron"]; !ok {
|
||||||
t.Fatal("expected tron in baseline supported-assets")
|
t.Fatal("expected tron in baseline config.supported_assets")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable the tron USDT chain_token.
|
// Disable the tron USDT chain_token.
|
||||||
@@ -372,7 +419,7 @@ func TestGetSupportedAssets_ChainTokenToggle(t *testing.T) {
|
|||||||
|
|
||||||
afterAllDisabled := getSupportedNetworks(t, e)
|
afterAllDisabled := getSupportedNetworks(t, e)
|
||||||
if _, ok := afterAllDisabled["tron"]; ok {
|
if _, ok := afterAllDisabled["tron"]; ok {
|
||||||
t.Fatal("tron should disappear from supported-assets when all its chain_tokens are disabled")
|
t.Fatal("tron should disappear from config.supported_assets when all its chain_tokens are disabled")
|
||||||
}
|
}
|
||||||
t.Logf("After disabling all tron tokens: networks = %v", afterAllDisabled)
|
t.Logf("After disabling all tron tokens: networks = %v", afterAllDisabled)
|
||||||
|
|
||||||
@@ -400,7 +447,7 @@ func TestGetSupportedAssets_ChainTokenToggle(t *testing.T) {
|
|||||||
|
|
||||||
// TestGetSupportedAssets_WalletAddressToggle verifies that:
|
// TestGetSupportedAssets_WalletAddressToggle verifies that:
|
||||||
// - disabling ALL wallet addresses for a network removes that network from
|
// - disabling ALL wallet addresses for a network removes that network from
|
||||||
// the /supported-assets response (even if chain + tokens are still enabled)
|
// the /config supported_assets response (even if chain + tokens are still enabled)
|
||||||
// - re-enabling any address brings the network back
|
// - re-enabling any address brings the network back
|
||||||
func TestGetSupportedAssets_WalletAddressToggle(t *testing.T) {
|
func TestGetSupportedAssets_WalletAddressToggle(t *testing.T) {
|
||||||
e := setupTestEnv(t)
|
e := setupTestEnv(t)
|
||||||
@@ -408,7 +455,7 @@ func TestGetSupportedAssets_WalletAddressToggle(t *testing.T) {
|
|||||||
// Baseline: solana should be present.
|
// Baseline: solana should be present.
|
||||||
before := getSupportedNetworks(t, e)
|
before := getSupportedNetworks(t, e)
|
||||||
if _, ok := before["solana"]; !ok {
|
if _, ok := before["solana"]; !ok {
|
||||||
t.Fatal("expected solana in baseline supported-assets")
|
t.Fatal("expected solana in baseline config.supported_assets")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable the only solana wallet address.
|
// Disable the only solana wallet address.
|
||||||
@@ -418,7 +465,7 @@ func TestGetSupportedAssets_WalletAddressToggle(t *testing.T) {
|
|||||||
|
|
||||||
after := getSupportedNetworks(t, e)
|
after := getSupportedNetworks(t, e)
|
||||||
if _, ok := after["solana"]; ok {
|
if _, ok := after["solana"]; ok {
|
||||||
t.Fatal("solana should disappear from supported-assets when all its wallet addresses are disabled")
|
t.Fatal("solana should disappear from config.supported_assets when all its wallet addresses are disabled")
|
||||||
}
|
}
|
||||||
t.Logf("After disabling solana wallets: networks = %v", after)
|
t.Logf("After disabling solana wallets: networks = %v", after)
|
||||||
|
|
||||||
@@ -434,10 +481,10 @@ func TestGetSupportedAssets_WalletAddressToggle(t *testing.T) {
|
|||||||
t.Logf("After re-enabling solana wallets: solana tokens = %v", restored["solana"])
|
t.Logf("After re-enabling solana wallets: solana tokens = %v", restored["solana"])
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetSupportedAssetsPublic(t *testing.T) {
|
func TestGetPublicConfig(t *testing.T) {
|
||||||
e := setupTestEnv(t)
|
e := setupTestEnv(t)
|
||||||
|
|
||||||
req := httptest.NewRequest(http.MethodGet, "/payments/gmpay/v1/supported-assets", nil)
|
req := httptest.NewRequest(http.MethodGet, "/payments/gmpay/v1/config", nil)
|
||||||
rec := httptest.NewRecorder()
|
rec := httptest.NewRecorder()
|
||||||
e.ServeHTTP(rec, req)
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
@@ -450,17 +497,41 @@ func TestGetSupportedAssetsPublic(t *testing.T) {
|
|||||||
t.Fatalf("expected status_code=200, got %v", resp["status_code"])
|
t.Fatalf("expected status_code=200, got %v", resp["status_code"])
|
||||||
}
|
}
|
||||||
|
|
||||||
data, ok := resp["data"].(map[string]interface{})
|
respData, ok := resp["data"].(map[string]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Fatalf("expected object data, got %T", resp["data"])
|
t.Fatalf("expected object data, got %T", resp["data"])
|
||||||
}
|
}
|
||||||
supports, ok := data["supports"].([]interface{})
|
supports, ok := respData["supported_assets"].([]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Fatalf("expected supports array, got %T", data["supports"])
|
t.Fatalf("expected supported_assets array, got %T", respData["supported_assets"])
|
||||||
}
|
}
|
||||||
if len(supports) < 2 {
|
if len(supports) < 2 {
|
||||||
t.Fatalf("expected >= 2 network supports, got %d", len(supports))
|
t.Fatalf("expected >= 2 network supports, got %d", len(supports))
|
||||||
}
|
}
|
||||||
|
epay, ok := respData["epay"].(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("expected epay object, got %T", respData["epay"])
|
||||||
|
}
|
||||||
|
if epay["default_network"] != "tron" {
|
||||||
|
t.Fatalf("epay.default_network = %v, want tron", epay["default_network"])
|
||||||
|
}
|
||||||
|
okpay, ok := respData["okpay"].(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("expected okpay object, got %T", respData["okpay"])
|
||||||
|
}
|
||||||
|
if okpay["enabled"] != false {
|
||||||
|
t.Fatalf("okpay.enabled = %v, want false", okpay["enabled"])
|
||||||
|
}
|
||||||
|
allowTokens, ok := okpay["allow_tokens"].([]interface{})
|
||||||
|
if !ok || len(allowTokens) != 2 {
|
||||||
|
t.Fatalf("expected okpay.allow_tokens array, got %T %#v", okpay["allow_tokens"], okpay["allow_tokens"])
|
||||||
|
}
|
||||||
|
if _, exists := okpay["shop_id"]; exists {
|
||||||
|
t.Fatalf("public config should not expose okpay.shop_id: %#v", okpay)
|
||||||
|
}
|
||||||
|
if _, exists := okpay["shop_token"]; exists {
|
||||||
|
t.Fatalf("public config should not expose okpay.shop_token: %#v", okpay)
|
||||||
|
}
|
||||||
|
|
||||||
seen := map[string]bool{}
|
seen := map[string]bool{}
|
||||||
for _, item := range supports {
|
for _, item := range supports {
|
||||||
@@ -473,6 +544,282 @@ func TestGetSupportedAssetsPublic(t *testing.T) {
|
|||||||
t.Fatalf("missing network support: %s", n)
|
t.Fatalf("missing network support: %s", n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if got := data.GetOkPayCallbackURL(); got != "http://localhost:8080/payments/okpay/v1/notify" {
|
||||||
|
t.Fatalf("default okpay callback_url = %q, want %q", got, "http://localhost:8080/payments/okpay/v1/notify")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOkPayNotifyRouteExists(t *testing.T) {
|
||||||
|
e := setupTestEnv(t)
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodPost, "/payments/okpay/v1/notify", strings.NewReader(""))
|
||||||
|
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationForm)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code == http.StatusNotFound {
|
||||||
|
t.Fatalf("expected okpay notify route to exist, got 404")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type okPayNotifyFixture struct {
|
||||||
|
Parent *mdb.Orders
|
||||||
|
Child *mdb.Orders
|
||||||
|
ProviderRow *mdb.ProviderOrder
|
||||||
|
Payload map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func seedOkPayNotifyFixture(t *testing.T) *okPayNotifyFixture {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayEnabled, "true", mdb.SettingTypeBool); err != nil {
|
||||||
|
t.Fatalf("seed okpay.enabled: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopID, "okpay-shop-test", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_id: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopToken, "token-1", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_token: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
parent := &mdb.Orders{
|
||||||
|
TradeId: "parent-okpay-notify-001",
|
||||||
|
OrderId: "merchant-okpay-notify-001",
|
||||||
|
Amount: 1,
|
||||||
|
Currency: "CNY",
|
||||||
|
ActualAmount: 0.15,
|
||||||
|
ReceiveAddress: "TTestTronAddress001",
|
||||||
|
Token: "USDT",
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
Status: mdb.StatusWaitPay,
|
||||||
|
NotifyUrl: "http://localhost/notify",
|
||||||
|
PaymentType: mdb.PaymentTypeEpay,
|
||||||
|
PayProvider: mdb.PaymentProviderOnChain,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(parent).Error; err != nil {
|
||||||
|
t.Fatalf("create parent order: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
child := &mdb.Orders{
|
||||||
|
TradeId: "okpay-unique-test-001",
|
||||||
|
ParentTradeId: parent.TradeId,
|
||||||
|
OrderId: "merchant-okpay-notify-001-sub",
|
||||||
|
Amount: 1,
|
||||||
|
Currency: "CNY",
|
||||||
|
ActualAmount: 0.15,
|
||||||
|
ReceiveAddress: "OKPAY",
|
||||||
|
Token: "USDT",
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
Status: mdb.StatusWaitPay,
|
||||||
|
NotifyUrl: "",
|
||||||
|
PaymentType: mdb.PaymentTypeEpay,
|
||||||
|
PayProvider: mdb.PaymentProviderOkPay,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(child).Error; err != nil {
|
||||||
|
t.Fatalf("create child order: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
providerRow := &mdb.ProviderOrder{
|
||||||
|
TradeId: child.TradeId,
|
||||||
|
Provider: mdb.PaymentProviderOkPay,
|
||||||
|
ProviderOrderID: "okpay-order-test-001",
|
||||||
|
PayURL: "https://t.me/ExampleWalletBot?start=shop_deposit--okpay-order-test-001",
|
||||||
|
Amount: 0.15,
|
||||||
|
Coin: "USDT",
|
||||||
|
Status: mdb.ProviderOrderStatusPending,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(providerRow).Error; err != nil {
|
||||||
|
t.Fatalf("create provider row: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := map[string]interface{}{
|
||||||
|
"code": 200,
|
||||||
|
"id": "okpay-shop-test",
|
||||||
|
"status": "success",
|
||||||
|
"data": map[string]interface{}{
|
||||||
|
"order_id": providerRow.ProviderOrderID,
|
||||||
|
"unique_id": child.TradeId,
|
||||||
|
"pay_user_id": 1234567890,
|
||||||
|
"amount": "0.15000000",
|
||||||
|
"coin": "USDT",
|
||||||
|
"status": 1,
|
||||||
|
"type": "deposit",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
payload["sign"] = signOkPayNotifyPayload("token-1", payload)
|
||||||
|
|
||||||
|
return &okPayNotifyFixture{
|
||||||
|
Parent: parent,
|
||||||
|
Child: child,
|
||||||
|
ProviderRow: providerRow,
|
||||||
|
Payload: payload,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildOkPayNotifyFormValues(payload map[string]interface{}) url.Values {
|
||||||
|
values := url.Values{}
|
||||||
|
values.Set("code", stringifyOkPayTestValue(payload["code"]))
|
||||||
|
values.Set("id", stringifyOkPayTestValue(payload["id"]))
|
||||||
|
values.Set("status", stringifyOkPayTestValue(payload["status"]))
|
||||||
|
values.Set("sign", stringifyOkPayTestValue(payload["sign"]))
|
||||||
|
|
||||||
|
dataMap, _ := payload["data"].(map[string]interface{})
|
||||||
|
values.Set("data[order_id]", stringifyOkPayTestValue(dataMap["order_id"]))
|
||||||
|
values.Set("data[unique_id]", stringifyOkPayTestValue(dataMap["unique_id"]))
|
||||||
|
values.Set("data[pay_user_id]", stringifyOkPayTestValue(dataMap["pay_user_id"]))
|
||||||
|
values.Set("data[amount]", stringifyOkPayTestValue(dataMap["amount"]))
|
||||||
|
values.Set("data[coin]", stringifyOkPayTestValue(dataMap["coin"]))
|
||||||
|
values.Set("data[status]", stringifyOkPayTestValue(dataMap["status"]))
|
||||||
|
values.Set("data[type]", stringifyOkPayTestValue(dataMap["type"]))
|
||||||
|
return values
|
||||||
|
}
|
||||||
|
|
||||||
|
func assertOkPayNotifyProcessed(t *testing.T, fixture *okPayNotifyFixture) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
paidChild, err := data.GetOrderInfoByTradeId(fixture.Child.TradeId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("load paid child: %v", err)
|
||||||
|
}
|
||||||
|
if paidChild.Status != mdb.StatusPaySuccess {
|
||||||
|
t.Fatalf("child status = %d, want %d", paidChild.Status, mdb.StatusPaySuccess)
|
||||||
|
}
|
||||||
|
if paidChild.BlockTransactionId != fixture.ProviderRow.ProviderOrderID {
|
||||||
|
t.Fatalf("child block_transaction_id = %q, want %q", paidChild.BlockTransactionId, fixture.ProviderRow.ProviderOrderID)
|
||||||
|
}
|
||||||
|
|
||||||
|
paidParent, err := data.GetOrderInfoByTradeId(fixture.Parent.TradeId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("load paid parent: %v", err)
|
||||||
|
}
|
||||||
|
if paidParent.Status != mdb.StatusPaySuccess {
|
||||||
|
t.Fatalf("parent status = %d, want %d", paidParent.Status, mdb.StatusPaySuccess)
|
||||||
|
}
|
||||||
|
if paidParent.PayBySubId != paidChild.ID {
|
||||||
|
t.Fatalf("parent pay_by_sub_id = %d, want %d", paidParent.PayBySubId, paidChild.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
savedProviderRow, err := data.GetProviderOrderByTradeIDAndProvider(fixture.Child.TradeId, mdb.PaymentProviderOkPay)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("load provider row: %v", err)
|
||||||
|
}
|
||||||
|
if savedProviderRow.Status != mdb.ProviderOrderStatusPaid {
|
||||||
|
t.Fatalf("provider row status = %q, want %q", savedProviderRow.Status, mdb.ProviderOrderStatusPaid)
|
||||||
|
}
|
||||||
|
if savedProviderRow.NotifyRaw == "" {
|
||||||
|
t.Fatal("provider row notify_raw should be saved")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOkPayNotify_JSONPayloadMarksOrdersPaid(t *testing.T) {
|
||||||
|
e := setupTestEnv(t)
|
||||||
|
fixture := seedOkPayNotifyFixture(t)
|
||||||
|
|
||||||
|
rawBody, err := json.Marshal(fixture.Payload)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("marshal payload: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodPost, "/payments/okpay/v1/notify", strings.NewReader(string(rawBody)))
|
||||||
|
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("okpay notify failed: %d %s", rec.Code, rec.Body.String())
|
||||||
|
}
|
||||||
|
if strings.TrimSpace(rec.Body.String()) != "success" {
|
||||||
|
t.Fatalf("okpay notify response = %q, want success", rec.Body.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
assertOkPayNotifyProcessed(t, fixture)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOkPayNotify_FormPayloadMarksOrdersPaid(t *testing.T) {
|
||||||
|
e := setupTestEnv(t)
|
||||||
|
fixture := seedOkPayNotifyFixture(t)
|
||||||
|
|
||||||
|
formValues := buildOkPayNotifyFormValues(fixture.Payload)
|
||||||
|
req := httptest.NewRequest(http.MethodPost, "/payments/okpay/v1/notify", strings.NewReader(formValues.Encode()))
|
||||||
|
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationForm)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("okpay form notify failed: %d %s", rec.Code, rec.Body.String())
|
||||||
|
}
|
||||||
|
if strings.TrimSpace(rec.Body.String()) != "success" {
|
||||||
|
t.Fatalf("okpay form notify response = %q, want success", rec.Body.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
assertOkPayNotifyProcessed(t, fixture)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOkPayNotify_ExpiresSiblingOkPayProviderOrder(t *testing.T) {
|
||||||
|
e := setupTestEnv(t)
|
||||||
|
fixture := seedOkPayNotifyFixture(t)
|
||||||
|
|
||||||
|
sibling := &mdb.Orders{
|
||||||
|
TradeId: "okpay-unique-test-002",
|
||||||
|
ParentTradeId: fixture.Parent.TradeId,
|
||||||
|
OrderId: "merchant-okpay-notify-001-sibling",
|
||||||
|
Amount: 1,
|
||||||
|
Currency: "CNY",
|
||||||
|
ActualAmount: 0.15,
|
||||||
|
ReceiveAddress: "OKPAY",
|
||||||
|
Token: "USDT",
|
||||||
|
Network: mdb.NetworkTron,
|
||||||
|
Status: mdb.StatusWaitPay,
|
||||||
|
NotifyUrl: "",
|
||||||
|
PaymentType: mdb.PaymentTypeEpay,
|
||||||
|
PayProvider: mdb.PaymentProviderOkPay,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(sibling).Error; err != nil {
|
||||||
|
t.Fatalf("create sibling order: %v", err)
|
||||||
|
}
|
||||||
|
siblingProvider := &mdb.ProviderOrder{
|
||||||
|
TradeId: sibling.TradeId,
|
||||||
|
Provider: mdb.PaymentProviderOkPay,
|
||||||
|
ProviderOrderID: "okpay-order-test-002",
|
||||||
|
PayURL: "https://t.me/ExampleWalletBot?start=shop_deposit--okpay-order-test-002",
|
||||||
|
Amount: 0.15,
|
||||||
|
Coin: "USDT",
|
||||||
|
Status: mdb.ProviderOrderStatusPending,
|
||||||
|
}
|
||||||
|
if err := dao.Mdb.Create(siblingProvider).Error; err != nil {
|
||||||
|
t.Fatalf("create sibling provider row: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rawBody, err := json.Marshal(fixture.Payload)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("marshal payload: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodPost, "/payments/okpay/v1/notify", strings.NewReader(string(rawBody)))
|
||||||
|
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("okpay notify failed: %d %s", rec.Code, rec.Body.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
expiredSibling, err := data.GetOrderInfoByTradeId(sibling.TradeId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("reload sibling order: %v", err)
|
||||||
|
}
|
||||||
|
if expiredSibling.Status != mdb.StatusExpired {
|
||||||
|
t.Fatalf("sibling status = %d, want %d", expiredSibling.Status, mdb.StatusExpired)
|
||||||
|
}
|
||||||
|
|
||||||
|
expiredSiblingProvider, err := data.GetProviderOrderByTradeIDAndProvider(sibling.TradeId, mdb.PaymentProviderOkPay)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("reload sibling provider row: %v", err)
|
||||||
|
}
|
||||||
|
if expiredSiblingProvider.Status != mdb.ProviderOrderStatusExpired {
|
||||||
|
t.Fatalf("sibling provider status = %q, want %q", expiredSiblingProvider.Status, mdb.ProviderOrderStatusExpired)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestCreateOrderNetworkIsolation verifies tron and solana wallets don't mix.
|
// TestCreateOrderNetworkIsolation verifies tron and solana wallets don't mix.
|
||||||
@@ -709,3 +1056,191 @@ func TestSwitchNetwork_WithOrder(t *testing.T) {
|
|||||||
t.Fatal("expected data in switch-network response")
|
t.Fatal("expected data in switch-network response")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type roundTripFunc func(*http.Request) (*http.Response, error)
|
||||||
|
|
||||||
|
func (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||||
|
return f(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func stubRestyClient(fn roundTripFunc) *resty.Client {
|
||||||
|
return resty.NewWithClient(&http.Client{Transport: fn})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSwitchNetwork_OkPayCreatesProviderSubOrder(t *testing.T) {
|
||||||
|
e := setupTestEnv(t)
|
||||||
|
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayEnabled, "true", mdb.SettingTypeBool); err != nil {
|
||||||
|
t.Fatalf("seed okpay.enabled: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopID, "shop-1", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_id: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopToken, "token-1", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_token: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayCallbackURL, "https://example.com/okpay/notify", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.callback_url: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
origFactory := http_client.ClientFactory
|
||||||
|
http_client.ClientFactory = func() *resty.Client {
|
||||||
|
return stubRestyClient(func(req *http.Request) (*http.Response, error) {
|
||||||
|
if req.URL.String() != "https://api.okaypay.me/shop/payLink" {
|
||||||
|
t.Fatalf("unexpected okpay URL: %s", req.URL.String())
|
||||||
|
}
|
||||||
|
if err := req.ParseForm(); err != nil {
|
||||||
|
t.Fatalf("parse form: %v", err)
|
||||||
|
}
|
||||||
|
if got := req.Form.Get("coin"); got != "USDT" {
|
||||||
|
t.Fatalf("coin = %q, want USDT", got)
|
||||||
|
}
|
||||||
|
if req.Form.Get("callback_url") == "" {
|
||||||
|
t.Fatal("callback_url should be set")
|
||||||
|
}
|
||||||
|
body := `{"status":"success","code":200,"data":{"order_id":"okp-order-1","pay_url":"https://pay.okaypay.test/abc"}}`
|
||||||
|
header := make(http.Header)
|
||||||
|
header.Set("Content-Type", "application/json")
|
||||||
|
return &http.Response{
|
||||||
|
StatusCode: http.StatusOK,
|
||||||
|
Status: "200 OK",
|
||||||
|
Header: header,
|
||||||
|
Body: io.NopCloser(strings.NewReader(body)),
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
t.Cleanup(func() {
|
||||||
|
http_client.ClientFactory = origFactory
|
||||||
|
})
|
||||||
|
|
||||||
|
createBody := signBody(map[string]interface{}{
|
||||||
|
"order_id": "switch-okpay-parent-001",
|
||||||
|
"amount": 1.00,
|
||||||
|
"token": "usdt",
|
||||||
|
"currency": "cny",
|
||||||
|
"network": "solana",
|
||||||
|
"notify_url": "http://localhost/notify",
|
||||||
|
})
|
||||||
|
createRec := doPost(e, "/payments/gmpay/v1/order/create-transaction", createBody)
|
||||||
|
if createRec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("create parent order failed: %d %s", createRec.Code, createRec.Body.String())
|
||||||
|
}
|
||||||
|
createResp := parseResp(t, createRec)
|
||||||
|
tradeID, _ := createResp["data"].(map[string]interface{})["trade_id"].(string)
|
||||||
|
if tradeID == "" {
|
||||||
|
t.Fatal("missing parent trade_id")
|
||||||
|
}
|
||||||
|
|
||||||
|
rec := doPost(e, "/pay/switch-network", map[string]interface{}{
|
||||||
|
"trade_id": tradeID,
|
||||||
|
"token": "USDT",
|
||||||
|
"network": "okpay",
|
||||||
|
})
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("switch-network okpay failed: %d %s", rec.Code, rec.Body.String())
|
||||||
|
}
|
||||||
|
resp := parseResp(t, rec)
|
||||||
|
dataMap, _ := resp["data"].(map[string]interface{})
|
||||||
|
if dataMap["payment_url"] != "https://pay.okaypay.test/abc" {
|
||||||
|
t.Fatalf("payment_url = %v, want okpay url", dataMap["payment_url"])
|
||||||
|
}
|
||||||
|
if dataMap["network"] != "tron" {
|
||||||
|
t.Fatalf("network = %v, want tron", dataMap["network"])
|
||||||
|
}
|
||||||
|
if dataMap["receive_address"] != "OKPAY" {
|
||||||
|
t.Fatalf("receive_address = %v, want OKPAY", dataMap["receive_address"])
|
||||||
|
}
|
||||||
|
|
||||||
|
subTradeID, _ := dataMap["trade_id"].(string)
|
||||||
|
if subTradeID == "" || subTradeID == tradeID {
|
||||||
|
t.Fatalf("expected child trade_id, got %q", subTradeID)
|
||||||
|
}
|
||||||
|
subOrder, err := data.GetOrderInfoByTradeId(subTradeID)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("load sub-order: %v", err)
|
||||||
|
}
|
||||||
|
if subOrder.PayProvider != mdb.PaymentProviderOkPay {
|
||||||
|
t.Fatalf("pay_provider = %q, want %q", subOrder.PayProvider, mdb.PaymentProviderOkPay)
|
||||||
|
}
|
||||||
|
providerRow, err := data.GetProviderOrderByTradeIDAndProvider(subTradeID, mdb.PaymentProviderOkPay)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("load provider row: %v", err)
|
||||||
|
}
|
||||||
|
if providerRow.ProviderOrderID != "okp-order-1" {
|
||||||
|
t.Fatalf("provider_order_id = %q, want okp-order-1", providerRow.ProviderOrderID)
|
||||||
|
}
|
||||||
|
if providerRow.PayURL != "https://pay.okaypay.test/abc" {
|
||||||
|
t.Fatalf("pay_url = %q", providerRow.PayURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSwitchNetwork_OkPayIntegration(t *testing.T) {
|
||||||
|
shopID := strings.TrimSpace(os.Getenv("EPUSDT_OKPAY_ID"))
|
||||||
|
if shopID == "" {
|
||||||
|
shopID = strings.TrimSpace(os.Getenv("OKPAY_ID"))
|
||||||
|
}
|
||||||
|
if shopID == "" {
|
||||||
|
shopID = strings.TrimSpace(os.Getenv("EPUSDT_OKPAY_TEST_SHOP_ID"))
|
||||||
|
}
|
||||||
|
shopToken := strings.TrimSpace(os.Getenv("EPUSDT_OKPAY_TOKEN"))
|
||||||
|
if shopToken == "" {
|
||||||
|
shopToken = strings.TrimSpace(os.Getenv("OKPAY_TOKEN"))
|
||||||
|
}
|
||||||
|
if shopToken == "" {
|
||||||
|
shopToken = strings.TrimSpace(os.Getenv("EPUSDT_OKPAY_TEST_SHOP_TOKEN"))
|
||||||
|
}
|
||||||
|
if shopID == "" || shopToken == "" {
|
||||||
|
t.Skip("set EPUSDT_OKPAY_ID/EPUSDT_OKPAY_TOKEN (or OKPAY_ID/OKPAY_TOKEN) to run OkPay integration test")
|
||||||
|
}
|
||||||
|
|
||||||
|
e := setupTestEnv(t)
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayEnabled, "true", mdb.SettingTypeBool); err != nil {
|
||||||
|
t.Fatalf("seed okpay.enabled: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopID, shopID, mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_id: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayShopToken, shopToken, mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.shop_token: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayCallbackURL, "https://example.com/okpay-notify", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.callback_url: %v", err)
|
||||||
|
}
|
||||||
|
if err := data.SetSetting(mdb.SettingGroupOkPay, mdb.SettingKeyOkPayReturnURL, "https://example.com/okpay-return", mdb.SettingTypeString); err != nil {
|
||||||
|
t.Fatalf("seed okpay.return_url: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
createBody := signBody(map[string]interface{}{
|
||||||
|
"order_id": "switch-okpay-live-001",
|
||||||
|
"amount": 1.00,
|
||||||
|
"token": "usdt",
|
||||||
|
"currency": "cny",
|
||||||
|
"network": "solana",
|
||||||
|
"notify_url": "http://localhost/notify",
|
||||||
|
})
|
||||||
|
createRec := doPost(e, "/payments/gmpay/v1/order/create-transaction", createBody)
|
||||||
|
if createRec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("create parent order failed: %d %s", createRec.Code, createRec.Body.String())
|
||||||
|
}
|
||||||
|
createResp := parseResp(t, createRec)
|
||||||
|
tradeID, _ := createResp["data"].(map[string]interface{})["trade_id"].(string)
|
||||||
|
if tradeID == "" {
|
||||||
|
t.Fatal("missing parent trade_id")
|
||||||
|
}
|
||||||
|
|
||||||
|
rec := doPost(e, "/pay/switch-network", map[string]interface{}{
|
||||||
|
"trade_id": tradeID,
|
||||||
|
"token": "USDT",
|
||||||
|
"network": "okpay",
|
||||||
|
})
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("switch-network okpay failed: %d %s", rec.Code, rec.Body.String())
|
||||||
|
}
|
||||||
|
resp := parseResp(t, rec)
|
||||||
|
dataMap, _ := resp["data"].(map[string]interface{})
|
||||||
|
paymentURL, _ := dataMap["payment_url"].(string)
|
||||||
|
if paymentURL == "" {
|
||||||
|
t.Fatalf("missing payment_url in response: %v", dataMap)
|
||||||
|
}
|
||||||
|
t.Logf("OkPay payment_url=%s", paymentURL)
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ var Errno = map[int]string{
|
|||||||
10013: "order is not awaiting payment",
|
10013: "order is not awaiting payment",
|
||||||
10014: "chain is not enabled",
|
10014: "chain is not enabled",
|
||||||
10016: "supported asset not found",
|
10016: "supported asset not found",
|
||||||
|
10017: "payment provider is not enabled",
|
||||||
|
10018: "payment provider configuration is incomplete",
|
||||||
|
10019: "payment provider does not support this token or network",
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -38,6 +41,9 @@ var (
|
|||||||
OrderNotWaitPay = Err(10013)
|
OrderNotWaitPay = Err(10013)
|
||||||
ChainNotEnabled = Err(10014)
|
ChainNotEnabled = Err(10014)
|
||||||
SupportedAssetNotFound = Err(10016)
|
SupportedAssetNotFound = Err(10016)
|
||||||
|
PaymentProviderNotEnabled = Err(10017)
|
||||||
|
PaymentProviderConfigErr = Err(10018)
|
||||||
|
PaymentProviderNotSupport = Err(10019)
|
||||||
)
|
)
|
||||||
|
|
||||||
type RspError struct {
|
type RspError struct {
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./unauthorized-error-DKwsOXnK.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./unauthorized-error-C93JvVE9.js";var t=e;export{t as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./forbidden-s6H4egxL.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./forbidden-fXbRG7fv.js";var t=e;export{t as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./not-found-error-D9glqlci.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./not-found-error-B1Beub-Y.js";var t=e;export{t as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./general-error-Cwxn1dbd.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./general-error-DAfi35Qo.js";var t=e;export{t as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./maintenance-error-_xUDTkL_.js";var t=e;export{t as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./maintenance-error-BD0W89T5.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{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{o as r,s as i,t as a}from"./useRouter-IcH5TSf9.js";import{t as o}from"./useStore-DdaKVvoY.js";import{f as s}from"./ClientOnly-FdPNE-Ha.js";import"./redirect-dE0wk0WH.js";import{a as c,i as l,r as u,s as d,t as f}from"./Match-BoLpbSXg.js";import{n as p}from"./matchContext-ByMpvvGc.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=t(n(),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=e();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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";import{o as r,s as i,t as a}from"./useRouter-BFyZZPZT.js";import{t as o}from"./useStore-CeCuHskv.js";import{f as s}from"./ClientOnly-CEQ7CN5e.js";import"./redirect-dE0wk0WH.js";import{a as c,i as l,r as u,s as d,t as f}from"./Match-CPO_gNAr.js";import{n as p}from"./matchContext-D8TuF1Yk.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(t(),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=e();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};
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_error-CXsY92Y9.js","assets/messages-Dl4DZ3oF.js","assets/search-provider-Dk6zM33K.js","assets/dist-BOyWZkOA.js","assets/dist-Ds1v3I9p.js","assets/confirm-dialog-DFd4KVcE.js","assets/button-C1yViT6u.js","assets/dist-CrfY77Qc.js","assets/dist-Cr8qDd7n.js","assets/dist-CaGmm2qw.js","assets/dist-CROr6eOn.js","assets/es2015-DRifBy_0.js","assets/dist-Dx9W1rl0.js","assets/dist-Ch1dnD1W.js","assets/dist-wyYOJtCF.js","assets/dist-QsdwBO-8.js","assets/dist-By9FXWhp.js","assets/dist-B9fsj1Qo.js","assets/separator-CAjHh97K.js","assets/tooltip-Bcsw5y67.js","assets/dist-DimKfatS.js","assets/dist-Bh5oBF4Y.js","assets/auth-store-CjAlzl54.js","assets/dist-i7zhhmGc.js","assets/with-selector-FG0JYm06.js","assets/cookies-C6BqVyqT.js","assets/useRouter-BFyZZPZT.js","assets/useNavigate-hT9V_ax6.js","assets/useStore-CeCuHskv.js","assets/command-C0-Plw5V.js","assets/createLucideIcon-hPVpkWEs.js","assets/x-p2l9lCR9.js","assets/skeleton-k7KW9xiL.js","assets/circle-check-CqLqP63C.js","assets/sun-kV8PgEwT.js","assets/shield-check-Cfk9D1of.js","assets/wallet-CbRAZ33B.js","assets/logo-eXfXberA.js","assets/input-CrVZiDFH.js","assets/font-provider-CmkWXyQc.js","assets/theme-provider-CfQosMJm.js","assets/theme-switch-B1xKuEXR.js","assets/dropdown-menu-BXLS2jhv.js","assets/check-CRQnCBtP.js","assets/header-DSmWDJt_.js","assets/link-BFlRyrCf.js","assets/ClientOnly-CEQ7CN5e.js","assets/forbidden-fXbRG7fv.js","assets/general-error-DAfi35Qo.js","assets/maintenance-error-BD0W89T5.js","assets/not-found-error-B1Beub-Y.js","assets/unauthorized-error-C93JvVE9.js"])))=>i.map(i=>d[i]);
|
||||||
|
import{n as e,r as t,t as n}from"./preload-helper-BLoHyGg7.js";var r=t(`/_authenticated/errors/$error`)({component:e(()=>n(()=>import(`./_error-CXsY92Y9.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,48,49,50,51])),`component`)});export{r as t};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Xd as e}from"./messages-Dl4DZ3oF.js";import{m as t}from"./search-provider-Dk6zM33K.js";import{n,t as r}from"./theme-switch-B1xKuEXR.js";import{t as i}from"./general-error-DAfi35Qo.js";import{t as a}from"./not-found-error-B1Beub-Y.js";import{t as o}from"./_error-B-2C3kWd.js";import{t as s}from"./unauthorized-error-C93JvVE9.js";import{t as c}from"./forbidden-fXbRG7fv.js";import{t as l}from"./maintenance-error-BD0W89T5.js";import{n as u,r as d,t as f}from"./header-DSmWDJt_.js";var p=e();function m(){let{error:e}=o.useParams(),m={unauthorized:s,forbidden:c,"not-found":a,"internal-server-error":i,"maintenance-error":l}[e]||a;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)(n,{}),(0,p.jsx)(r,{}),(0,p.jsx)(t,{}),(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 +0,0 @@
|
|||||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_error-aP8WfZ0L.js","assets/messages-Bhh1Viqz.js","assets/search-provider-Decv_5jQ.js","assets/dist-BTQ1T4Z1.js","assets/dist-DfdMgsbg.js","assets/confirm-dialog-DEI3bDRD.js","assets/button-CMgGM5Zo.js","assets/dist-DCwMhmtb.js","assets/dist-BOgRCYiY.js","assets/dist-BcPwnnrp.js","assets/dist-q78A-MEc.js","assets/es2015-DPp95FAP.js","assets/dist-8IaROFd6.js","assets/dist-DYutcIDs.js","assets/dist-CFWQDH7X.js","assets/dist-LQc8uwm4.js","assets/dist-CBPejFXg.js","assets/dist-CYYy0EBp.js","assets/dist-DB9dWkN8.js","assets/separator-Dp_coI-W.js","assets/tooltip-BmTb484u.js","assets/dist-aKZxtpke.js","assets/dist-Bofa-lcL.js","assets/auth-store-B0MXCdkM.js","assets/dist-bcH04SHd.js","assets/with-selector-Cn8s6enx.js","assets/cookies-DtK8C3EL.js","assets/useRouter-IcH5TSf9.js","assets/useNavigate-BAxMzgsd.js","assets/useStore-DdaKVvoY.js","assets/command-DZRbaUDS.js","assets/createLucideIcon-B033Mmf5.js","assets/x-ZpCeFU3T.js","assets/skeleton-BJZJu227.js","assets/circle-check-BFJeWPCP.js","assets/sun-TG0uyxhT.js","assets/shield-check-CJEjPJqE.js","assets/wallet-BHv0jBxM.js","assets/logo-B5lF0pzp.js","assets/input-BRm9segX.js","assets/font-provider-DlVfsvee.js","assets/theme-provider-BIsY189-.js","assets/theme-switch-D8VX-5g_.js","assets/dropdown-menu-DkKDP9Gn.js","assets/check-BrSI5FnG.js","assets/header-DZp29x0-.js","assets/link-cKoSDPwi.js","assets/ClientOnly-FdPNE-Ha.js","assets/forbidden-s6H4egxL.js","assets/general-error-Cwxn1dbd.js","assets/maintenance-error-_xUDTkL_.js","assets/not-found-error-D9glqlci.js","assets/unauthorized-error-DKwsOXnK.js"])))=>i.map(i=>d[i]);
|
|
||||||
import{n as e,r as t,t as n}from"./preload-helper-B2PzqQRQ.js";var r=t(`/_authenticated/errors/$error`)({component:e(()=>n(()=>import(`./_error-aP8WfZ0L.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,48,49,50,51,52])),`component`)});export{r as t};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{Cd as e}from"./messages-Bhh1Viqz.js";import{m as t}from"./search-provider-Decv_5jQ.js";import{n,t as r}from"./theme-switch-D8VX-5g_.js";import{t as i}from"./general-error-Cwxn1dbd.js";import{t as a}from"./not-found-error-D9glqlci.js";import{t as o}from"./_error-DcF4FKJZ.js";import{t as s}from"./unauthorized-error-DKwsOXnK.js";import{t as c}from"./forbidden-s6H4egxL.js";import{t as l}from"./maintenance-error-_xUDTkL_.js";import{n as u,r as d,t as f}from"./header-DZp29x0-.js";var p=e();function m(){let{error:e}=o.useParams(),m={unauthorized:s,forbidden:c,"not-found":a,"internal-server-error":i,"maintenance-error":l}[e]||a;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)(n,{}),(0,p.jsx)(r,{}),(0,p.jsx)(t,{}),(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,2 +0,0 @@
|
|||||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_trade_id-CN7o2QQi.js","assets/messages-Bhh1Viqz.js","assets/button-CMgGM5Zo.js","assets/select-CiLcNbAG.js","assets/dist-aKZxtpke.js","assets/dist-DfdMgsbg.js","assets/dist-BcPwnnrp.js","assets/dist-q78A-MEc.js","assets/dist-DB9dWkN8.js","assets/dist-BTQ1T4Z1.js","assets/dist-CBPejFXg.js","assets/dist-DYutcIDs.js","assets/dist-BOgRCYiY.js","assets/es2015-DPp95FAP.js","assets/dist-CYYy0EBp.js","assets/dist-Bofa-lcL.js","assets/createLucideIcon-B033Mmf5.js","assets/check-BrSI5FnG.js","assets/chevron-down-Bp5qPJdK.js","assets/auth-store-B0MXCdkM.js","assets/dist-bcH04SHd.js","assets/with-selector-Cn8s6enx.js","assets/cookies-DtK8C3EL.js","assets/useNavigate-BAxMzgsd.js","assets/useRouter-IcH5TSf9.js","assets/copy-to-clipboard-BF7uZfYk.js","assets/loader-circle-USrlthPz.js","assets/x-ZpCeFU3T.js"])))=>i.map(i=>d[i]);
|
|
||||||
import{n as e,r as t,t as n}from"./preload-helper-B2PzqQRQ.js";import{t as r}from"./createLucideIcon-B033Mmf5.js";var i=r(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),a=t(`/cashier/$trade_id/`)({component:e(()=>n(()=>import(`./_trade_id-CN7o2QQi.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])),`component`)});export{i as n,a as t};
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_trade_id-Bdkg6Jp_.js","assets/messages-Dl4DZ3oF.js","assets/button-C1yViT6u.js","assets/select-7sJQPtVL.js","assets/dist-DimKfatS.js","assets/dist-Ds1v3I9p.js","assets/dist-CaGmm2qw.js","assets/dist-CROr6eOn.js","assets/dist-B9fsj1Qo.js","assets/dist-BOyWZkOA.js","assets/dist-QsdwBO-8.js","assets/dist-Ch1dnD1W.js","assets/dist-Cr8qDd7n.js","assets/es2015-DRifBy_0.js","assets/dist-By9FXWhp.js","assets/dist-Bh5oBF4Y.js","assets/createLucideIcon-hPVpkWEs.js","assets/check-CRQnCBtP.js","assets/chevron-down-DgKrNsKJ.js","assets/auth-store-CjAlzl54.js","assets/dist-i7zhhmGc.js","assets/with-selector-FG0JYm06.js","assets/cookies-C6BqVyqT.js","assets/useNavigate-hT9V_ax6.js","assets/useRouter-BFyZZPZT.js","assets/copy-to-clipboard-C9hLfXB3.js","assets/arrow-left-Cs7Umy4C.js","assets/radio-group-CvYFhXin.js","assets/dist-wyYOJtCF.js","assets/dist-Dx9W1rl0.js","assets/loader-circle-LlcmhRDr.js","assets/x-p2l9lCR9.js"])))=>i.map(i=>d[i]);
|
||||||
|
import{n as e,r as t,t as n}from"./preload-helper-BLoHyGg7.js";import{t as r}from"./createLucideIcon-hPVpkWEs.js";var i=r(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),a=t(`/cashier/$trade_id/`)({component:e(()=>n(()=>import(`./_trade_id-Bdkg6Jp_.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])),`component`)});export{i as n,a 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{Cd as e,Ft as t,It as n,Lt as r,Mt as i,Nt as a,Pt as o,Rt as s,dd as c,fd as l}from"./messages-Bhh1Viqz.js";import{i as u,n as d,t as f}from"./button-CMgGM5Zo.js";import{n as p,r as m}from"./font-provider-DlVfsvee.js";import{n as h}from"./theme-provider-BIsY189-.js";import{t as g}from"./chevron-down-Bp5qPJdK.js";import{n as _,t as v}from"./radio-group-BEhmAVSM.js";import{r as y,s as b}from"./zod-CqUOr1xx.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-By70kcBQ.js";import{t as A}from"./page-header-CBQ6sv9V.js";import{t as j}from"./show-submitted-data-C7180yzk.js";var M=e(),N=b({theme:y([`light`,`dark`]),font:y(m)});function P(){let{font:e,setFont:r}=p(),{theme:s,setTheme:y}=h(),b={theme:s,font:e},A=w({resolver:S(N),defaultValues:b});function P(t){t.font!==e&&r(t.font),t.theme!==s&&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:n()}),(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:t()}),(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:o()}),(0,M.jsx)(D,{children:a()}),(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:l()})]})}),(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:i()})]})})}function F(){return(0,M.jsx)(A,{description:r(),title:s(),variant:`section`,children:(0,M.jsx)(P,{})})}var I=F;export{I as component};
|
import{Rd as e,Xd as t,an as n,cn as r,dn as i,ln as a,on as o,sn as s,un as c,zd as l}from"./messages-Dl4DZ3oF.js";import{i as u,n as d,t as f}from"./button-C1yViT6u.js";import{n as p,r as m}from"./font-provider-CmkWXyQc.js";import{n as h}from"./theme-provider-CfQosMJm.js";import{t as g}from"./chevron-down-DgKrNsKJ.js";import{n as _,t as v}from"./radio-group-CvYFhXin.js";import{r as y,s as b}from"./zod-o7fWFSsj.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-B11xe3D_.js";import{t as A}from"./page-header-BQBo8kJV.js";import{t as j}from"./show-submitted-data-CjQF6NBv.js";var M=t(),N=b({theme:y([`light`,`dark`]),font:y(m)});function P(){let{font:t,setFont:i}=p(),{theme:c,setTheme:y}=h(),b={theme:c,font:t},A=w({resolver:S(N),defaultValues:b});function P(e){e.font!==t&&i(e.font),e.theme!==c&&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:a()}),(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:r()}),(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:s()}),(0,M.jsx)(D,{children:o()}),(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:l()})]})}),(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:n()})]})})}function F(){return(0,M.jsx)(A,{description:c(),title:i(),variant:`section`,children:(0,M.jsx)(P,{})})}var I=F;export{I as component};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as e}from"./createLucideIcon-B033Mmf5.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-hPVpkWEs.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{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";var r=t(n(),1),i=e(),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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";var r=n(t(),1),i=e(),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{Cd as e}from"./messages-Bhh1Viqz.js";import{i as t,r as n,s as r}from"./button-CMgGM5Zo.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{Xd as e}from"./messages-Dl4DZ3oF.js";import{i as t,r as n,s as r}from"./button-C1yViT6u.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{Cd as e}from"./messages-Bhh1Viqz.js";import{i as t}from"./button-CMgGM5Zo.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{Xd as e}from"./messages-Dl4DZ3oF.js";import{i as t}from"./button-C1yViT6u.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{Dd as e,wd as t}from"./messages-Bhh1Viqz.js";import{a as n,d as r,u as i}from"./auth-store-B0MXCdkM.js";import{t as a}from"./createLucideIcon-B033Mmf5.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=e(t(),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{Zd as e,ef as t}from"./messages-Dl4DZ3oF.js";import{a as n,d as r,u as i}from"./auth-store-CjAlzl54.js";import{t as a}from"./createLucideIcon-hPVpkWEs.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-B033Mmf5.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-hPVpkWEs.js";var t=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]);export{t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{t as r}from"./dist-q78A-MEc.js";import{d as i,i as a}from"./button-CMgGM5Zo.js";import{a as o,r as s,t as c}from"./dist-DfdMgsbg.js";import{t as l}from"./dist-8IaROFd6.js";import{t as u}from"./dist-CYYy0EBp.js";import{t as d}from"./dist-DB9dWkN8.js";import{t as f}from"./check-BrSI5FnG.js";var p=t(n(),1),m=e(),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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";import{t as r}from"./dist-CROr6eOn.js";import{d as i,i as a}from"./button-C1yViT6u.js";import{a as o,r as s,t as c}from"./dist-Ds1v3I9p.js";import{t as l}from"./dist-Dx9W1rl0.js";import{t as u}from"./dist-By9FXWhp.js";import{t as d}from"./dist-B9fsj1Qo.js";import{t as f}from"./check-CRQnCBtP.js";var p=n(t(),1),m=e(),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-B033Mmf5.js";var t=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]);export{t};
|
import{t as e}from"./createLucideIcon-hPVpkWEs.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-B033Mmf5.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-hPVpkWEs.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-B033Mmf5.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-hPVpkWEs.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-B033Mmf5.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-hPVpkWEs.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{Md as e,Nd as t,Xd as n,jd as r}from"./messages-Dl4DZ3oF.js";import{d as i,l as a,m as o,p as s,u as c}from"./command-C0-Plw5V.js";import{t as l}from"./telescope-DkxetWh5.js";var u=n();function d({open:n,onOpenChange:d}){return(0,u.jsx)(a,{onOpenChange:d,open:n,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:[e(),(0,u.jsx)(`br`,{}),(0,u.jsx)(`p`,{className:`mt-2 text-center`,children:r()})]})]})})})}export{d as t};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{Cd as e,ad as t,id as n,od as r}from"./messages-Bhh1Viqz.js";import{d as i,l as a,m as o,p as s,u as c}from"./command-DZRbaUDS.js";import{t as l}from"./telescope-C0wI0Fuj.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:r()}),(0,u.jsxs)(i,{children:[t(),(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
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
import{Cd as e,Dd as t,_d as n,vd as r,wd as i}from"./messages-Bhh1Viqz.js";import{d as a,i as o,l as s,t as c}from"./button-CMgGM5Zo.js";import{a as l,r as u}from"./dist-DfdMgsbg.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-DCwMhmtb.js";var b=t(i(),1),x=e(),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{Gd as e,Wd as t,Xd as n,Zd as r,ef as i}from"./messages-Dl4DZ3oF.js";import{d as a,i as o,l as s,t as c}from"./button-C1yViT6u.js";import{a as l,r as u}from"./dist-Ds1v3I9p.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-CrfY77Qc.js";var b=i(r(),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:i,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:i})})]}),a,(0,x.jsxs)($,{children:[(0,x.jsx)(le,{disabled:f,children:u??r()}),(0,x.jsx)(c,{disabled:p||f,form:m,onClick:h,type:m?`submit`:`button`,variant:d?`destructive`:`default`,children:l??n()})]})]})})}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(n){let{title:r,desc:i,children:a,className:s,confirmText:l,cancelBtnText:u,destructive:d,isLoading:f,disabled:p=!1,form:m,handleConfirm:h,...g}=n;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:r}),(0,x.jsx)(ce,{asChild:!0,children:(0,x.jsx)(`div`,{children:i})})]}),a,(0,x.jsxs)($,{children:[(0,x.jsx)(le,{disabled:f,children:u??e()}),(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{Td as e}from"./messages-Bhh1Viqz.js";import{t}from"./createLucideIcon-B033Mmf5.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{Qd as e}from"./messages-Dl4DZ3oF.js";import{t}from"./createLucideIcon-hPVpkWEs.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{Dd as e,wd as t}from"./messages-Bhh1Viqz.js";var n=e(t()),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{Zd as e,ef as t}from"./messages-Dl4DZ3oF.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{$t as e,Jt as t,Qt as n,Xd as r,Xt as i,Yt as a,Zt as o,en as s,in as c,nn as l,qt as u,rn as d,tn as f}from"./messages-Dl4DZ3oF.js";import{t as p}from"./button-C1yViT6u.js";import{t as m}from"./checkbox-B8djUknX.js";import{c as h,i as g,s as _}from"./zod-o7fWFSsj.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-B11xe3D_.js";import{t as D}from"./page-header-BQBo8kJV.js";import{t as O}from"./show-submitted-data-CjQF6NBv.js";var k=r(),A=[{id:`recents`,label:l()},{id:`home`,label:f()},{id:`applications`,label:s()},{id:`desktop`,label:e()},{id:`downloads`,label:n()},{id:`documents`,label:o()}],j=_({items:g(h()).refine(e=>e.some(e=>e),{message:i()})}),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:t()})]}),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:u()})]})})}function P(){return(0,k.jsx)(D,{description:d(),title:c(),variant:`section`,children:(0,k.jsx)(N,{})})}var F=P;export{F as component};
|
||||||
@@ -1 +0,0 @@
|
|||||||
import{At as e,Cd as t,Ct as n,Dt as r,Et as i,Ot as a,St as o,Tt as s,bt as c,jt as l,kt as u,wt as d,xt as f}from"./messages-Bhh1Viqz.js";import{t as p}from"./button-CMgGM5Zo.js";import{t as m}from"./checkbox-NsyByt55.js";import{c as h,i as g,s as _}from"./zod-CqUOr1xx.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-By70kcBQ.js";import{t as D}from"./page-header-CBQ6sv9V.js";import{t as O}from"./show-submitted-data-C7180yzk.js";var k=t(),A=[{id:`recents`,label:u()},{id:`home`,label:a()},{id:`applications`,label:r()},{id:`desktop`,label:i()},{id:`downloads`,label:s()},{id:`documents`,label:d()}],j=_({items:g(h()).refine(e=>e.some(e=>e),{message:n()})}),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:f()})]}),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:c()})]})})}function P(){return(0,k.jsx)(D,{description:e(),title:l(),variant:`section`,children:(0,k.jsx)(N,{})})}var F=P;export{F as component};
|
|
||||||
@@ -1 +1 @@
|
|||||||
import{Dd as e,wd as t}from"./messages-Bhh1Viqz.js";import{n}from"./dist-DfdMgsbg.js";var r=e(t(),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{Zd as e,ef as t}from"./messages-Dl4DZ3oF.js";import{n}from"./dist-Ds1v3I9p.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 +1 @@
|
|||||||
import{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{t as r}from"./dist-q78A-MEc.js";var i=t(n(),1),a=e(),o=Object.freeze({position:`absolute`,border:0,width:1,height:1,padding:0,margin:-1,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,whiteSpace:`nowrap`,wordWrap:`normal`}),s=`VisuallyHidden`,c=i.forwardRef((e,t)=>(0,a.jsx)(r.span,{...e,ref:t,style:{...o,...e.style}}));c.displayName=s;var l=c;export{o as n,l as t};
|
import{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";import{t as r}from"./dist-CROr6eOn.js";var i=n(t(),1),a=e(),o=Object.freeze({position:`absolute`,border:0,width:1,height:1,padding:0,margin:-1,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,whiteSpace:`nowrap`,wordWrap:`normal`}),s=`VisuallyHidden`,c=i.forwardRef((e,t)=>(0,a.jsx)(r.span,{...e,ref:t,style:{...o,...e.style}}));c.displayName=s;var l=c;export{o as n,l as t};
|
||||||
@@ -1 +1 @@
|
|||||||
import{Dd as e,wd as t}from"./messages-Bhh1Viqz.js";var n=e(t(),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{Zd as e,ef as t}from"./messages-Dl4DZ3oF.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 +0,0 @@
|
|||||||
import{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{c as r,d as i}from"./button-CMgGM5Zo.js";import{a}from"./dist-DfdMgsbg.js";var o=t(n(),1),s=e();function c(e){let t=e+`CollectionProvider`,[n,c]=a(t),[l,u]=n(t,{collectionRef:{current:null},itemMap:new Map}),d=e=>{let{scope:t,children:n}=e,r=o.useRef(null),i=o.useRef(new Map).current;return(0,s.jsx)(l,{scope:t,itemMap:i,collectionRef:r,children:n})};d.displayName=t;let f=e+`CollectionSlot`,p=r(f),m=o.forwardRef((e,t)=>{let{scope:n,children:r}=e;return(0,s.jsx)(p,{ref:i(t,u(f,n).collectionRef),children:r})});m.displayName=f;let h=e+`CollectionItemSlot`,g=`data-radix-collection-item`,_=r(h),v=o.forwardRef((e,t)=>{let{scope:n,children:r,...a}=e,c=o.useRef(null),l=i(t,c),d=u(h,n);return o.useEffect(()=>(d.itemMap.set(c,{ref:c,...a}),()=>void d.itemMap.delete(c))),(0,s.jsx)(_,{[g]:``,ref:l,children:r})});v.displayName=h;function y(t){let n=u(e+`CollectionConsumer`,t);return o.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:d,Slot:m,ItemSlot:v},y,c]}export{c as t};
|
|
||||||
@@ -1 +1 @@
|
|||||||
import{Cd as e,Dd as t,Td as n,wd as r}from"./messages-Bhh1Viqz.js";import{c as i}from"./button-CMgGM5Zo.js";var a=n((e=>{var t=r();function n(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(n(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=t.__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 r=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(n(299));return s(e,t,null,r)},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=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=t(r(),1),c=t(o(),1),l=e(),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{Qd as e,Xd as t,Zd as n,ef as r}from"./messages-Dl4DZ3oF.js";import{c as i}from"./button-C1yViT6u.js";var a=e((e=>{var t=n();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=t.__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(n(),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{Dd as e,wd as t}from"./messages-Bhh1Viqz.js";import{n}from"./dist-DfdMgsbg.js";var r=e(t(),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{Zd as e,ef as t}from"./messages-Dl4DZ3oF.js";import{n}from"./dist-Ds1v3I9p.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{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";var r=t(n(),1),i=e(),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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";var r=n(t(),1),i=e(),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{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{n as r,r as i,t as a}from"./dist-q78A-MEc.js";import{d as o}from"./button-CMgGM5Zo.js";import{n as s,r as c}from"./dist-DfdMgsbg.js";import{t as l}from"./dist-BcPwnnrp.js";var u=t(n(),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=e(),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=t(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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";import{n as r,r as i,t as a}from"./dist-CROr6eOn.js";import{d as o}from"./button-C1yViT6u.js";import{n as s,r as c}from"./dist-Ds1v3I9p.js";import{t as l}from"./dist-CaGmm2qw.js";var u=n(t(),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=e(),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,4 +1,4 @@
|
|||||||
import{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{t as r}from"./dist-q78A-MEc.js";import{c as i,d as a}from"./button-CMgGM5Zo.js";import{a as o,i as s,r as c,t as l}from"./dist-DfdMgsbg.js";import{t as u}from"./dist-8IaROFd6.js";import{n as d}from"./dist-BcPwnnrp.js";import{n as f,t as p}from"./dist-BOgRCYiY.js";import{i as m,n as h,r as g,t as _}from"./es2015-DPp95FAP.js";var v=t(n(),1),y=e(),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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";import{t as r}from"./dist-CROr6eOn.js";import{c as i,d as a}from"./button-C1yViT6u.js";import{a as o,i as s,r as c,t as l}from"./dist-Ds1v3I9p.js";import{t as u}from"./dist-Dx9W1rl0.js";import{n as d}from"./dist-CaGmm2qw.js";import{n as f,t as p}from"./dist-Cr8qDd7n.js";import{i as m,n as h,r as g,t as _}from"./es2015-DRifBy_0.js";var v=n(t(),1),y=e(),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.
|
||||||
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";var r=t(n(),1),i=e();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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";var r=n(t(),1),i=e();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{Dd as e,wd as t}from"./messages-Bhh1Viqz.js";import{d as n}from"./button-CMgGM5Zo.js";import{n as r}from"./dist-DfdMgsbg.js";var i=e(t(),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{Zd as e,ef as t}from"./messages-Dl4DZ3oF.js";import{d as n}from"./button-C1yViT6u.js";import{n as r}from"./dist-Ds1v3I9p.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 +0,0 @@
|
|||||||
import{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{t as r}from"./dist-q78A-MEc.js";import{d as i}from"./button-CMgGM5Zo.js";import{a,r as o,t as s}from"./dist-DfdMgsbg.js";import{t as c}from"./dist-CBPejFXg.js";import{n as l,t as u}from"./dist-BcPwnnrp.js";import{n as d}from"./dist-DYutcIDs.js";var f=t(n(),1),p=e(),m=`rovingFocusGroup.onEntryFocus`,h={bubbles:!1,cancelable:!0},g=`RovingFocusGroup`,[_,v,y]=c(g),[b,x]=a(g,[y]),[S,C]=b(g),w=f.forwardRef((e,t)=>(0,p.jsx)(_.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,p.jsx)(_.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,p.jsx)(T,{...e,ref:t})})}));w.displayName=g;var T=f.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:n,orientation:a,loop:c=!1,dir:l,currentTabStopId:_,defaultCurrentTabStopId:y,onCurrentTabStopIdChange:b,onEntryFocus:x,preventScrollOnEntryFocus:C=!1,...w}=e,T=f.useRef(null),E=i(t,T),D=d(l),[O,k]=s({prop:_,defaultProp:y??null,onChange:b,caller:g}),[A,M]=f.useState(!1),N=u(x),P=v(n),F=f.useRef(!1),[I,L]=f.useState(0);return f.useEffect(()=>{let e=T.current;if(e)return e.addEventListener(m,N),()=>e.removeEventListener(m,N)},[N]),(0,p.jsx)(S,{scope:n,orientation:a,dir:D,loop:c,currentTabStopId:O,onItemFocus:f.useCallback(e=>k(e),[k]),onItemShiftTab:f.useCallback(()=>M(!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":a,...w,ref:E,style:{outline:`none`,...e.style},onMouseDown:o(e.onMouseDown,()=>{F.current=!0}),onFocus:o(e.onFocus,e=>{let t=!F.current;if(e.target===e.currentTarget&&t&&!A){let t=new CustomEvent(m,h);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=P().filter(e=>e.focusable);j([e.find(e=>e.active),e.find(e=>e.id===O),...e].filter(Boolean).map(e=>e.ref.current),C)}}F.current=!1}),onBlur:o(e.onBlur,()=>M(!1))})})}),E=`RovingFocusGroupItem`,D=f.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:n,focusable:i=!0,active:a=!1,tabStopId:s,children:c,...u}=e,d=l(),m=s||d,h=C(E,n),g=h.currentTabStopId===m,y=v(n),{onFocusableItemAdd:b,onFocusableItemRemove:x,currentTabStopId:S}=h;return f.useEffect(()=>{if(i)return b(),()=>x()},[i,b,x]),(0,p.jsx)(_.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:o(e.onMouseDown,e=>{i?h.onItemFocus(m):e.preventDefault()}),onFocus:o(e.onFocus,()=>h.onItemFocus(m)),onKeyDown:o(e.onKeyDown,e=>{if(e.key===`Tab`&&e.shiftKey){h.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=A(e,h.orientation,h.dir);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let n=y().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?M(n,r+1):n.slice(r+1)}setTimeout(()=>j(n))}}),children:typeof c==`function`?c({isCurrentTabStop:g,hasTabStop:S!=null}):c})})});D.displayName=E;var O={ArrowLeft:`prev`,ArrowUp:`prev`,ArrowRight:`next`,ArrowDown:`next`,PageUp:`first`,Home:`first`,PageDown:`last`,End:`last`};function k(e,t){return t===`rtl`?e===`ArrowLeft`?`ArrowRight`:e===`ArrowRight`?`ArrowLeft`:e:e}function A(e,t,n){let r=k(e.key,n);if(!(t===`vertical`&&[`ArrowLeft`,`ArrowRight`].includes(r))&&!(t===`horizontal`&&[`ArrowUp`,`ArrowDown`].includes(r)))return O[r]}function j(e,t=!1){let n=document.activeElement;for(let r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}function M(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var N=w,P=D;export{N as n,x as r,P as t};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";import{t as r}from"./dist-CROr6eOn.js";import{c as i,d as a}from"./button-C1yViT6u.js";import{a as o,r as s,t as c}from"./dist-Ds1v3I9p.js";import{n as l,t as u}from"./dist-CaGmm2qw.js";import{n as d}from"./dist-Ch1dnD1W.js";var f=n(t(),1),p=e();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{Cd as e,Dd as t,wd as n}from"./messages-Bhh1Viqz.js";import{t as r}from"./dist-q78A-MEc.js";import{d as i}from"./button-CMgGM5Zo.js";import{a,r as o,t as s}from"./dist-DfdMgsbg.js";import{t as c}from"./dist-8IaROFd6.js";import{n as l}from"./dist-DYutcIDs.js";import{t as u}from"./dist-CYYy0EBp.js";import{t as d}from"./dist-DB9dWkN8.js";import{n as f,r as p,t as m}from"./dist-LQc8uwm4.js";var h=t(n(),1),g=e(),_=`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)(c,{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),f=u(n),p=d(t);return h.useEffect(()=>{let e=c.current;if(!e)return;let t=window.HTMLInputElement.prototype,r=Object.getOwnPropertyDescriptor(t,`checked`).set;if(f!==n&&r){let t=new Event(`click`,{bubbles:a});r.call(e,n),e.dispatchEvent(t)}},[f,n,a]),(0,g.jsx)(r.input,{type:`radio`,"aria-hidden":!0,defaultChecked:n,...o,tabIndex:-1,ref:l,style:{...o.style,...p,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,[p,y]),M=p(),N=y(),[P,F]=A(k),I=h.forwardRef((e,t)=>{let{__scopeRadioGroup:n,name:i,defaultValue:a,value:o,required:c=!1,disabled:u=!1,orientation:d,dir:p,loop:m=!0,onValueChange:h,..._}=e,v=M(n),y=l(p),[b,x]=s({prop:o,defaultProp:a??null,onChange:h,caller:k});return(0,g.jsx)(P,{scope:n,name:i,required:c,disabled:u,value:b,onValueChange:x,children:(0,g.jsx)(f,{asChild:!0,...v,orientation:d,dir:y,loop:m,children:(0,g.jsx)(r.div,{role:`radiogroup`,"aria-required":c,"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),u=N(n),d=h.useRef(null),f=i(t,d),p=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)(m,{asChild:!0,...l,focusable:!c,active:p,children:(0,g.jsx)(S,{disabled:c,required:s.required,checked:p,...u,...a,name:s.name,ref:f,onCheck:()=>s.onValueChange(a.value),onKeyDown:o(e=>{e.key===`Enter`&&e.preventDefault()}),onFocus:o(a.onFocus,()=>{_.current&&d.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{Xd as e,Zd as t,ef as n}from"./messages-Dl4DZ3oF.js";import{t as r}from"./dist-CROr6eOn.js";import{d as i}from"./button-C1yViT6u.js";import{a,r as o,t as s}from"./dist-Ds1v3I9p.js";import{n as c,r as l,t as u}from"./dist-QsdwBO-8.js";import{t as d}from"./dist-Dx9W1rl0.js";import{n as f}from"./dist-Ch1dnD1W.js";import{t as p}from"./dist-By9FXWhp.js";import{t as m}from"./dist-B9fsj1Qo.js";var h=n(t(),1),g=e(),_=`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{t as e}from"./createLucideIcon-B033Mmf5.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-hPVpkWEs.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-B033Mmf5.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-hPVpkWEs.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{Cd as e,O as t}from"./messages-Bhh1Viqz.js";import{i as n}from"./button-CMgGM5Zo.js";import{t as r}from"./createLucideIcon-B033Mmf5.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};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Xd as e,tt as t}from"./messages-Dl4DZ3oF.js";import{i as n}from"./button-C1yViT6u.js";import{t as r}from"./createLucideIcon-hPVpkWEs.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 +0,0 @@
|
|||||||
import{$l as e,Bt as t,Cd as n,Dd as r,Ql as i,Vt as a,eu as o,tu as s,wd as c,zt as l}from"./messages-Bhh1Viqz.js";import{t as u}from"./button-CMgGM5Zo.js";import{c as d,s as f}from"./zod-CqUOr1xx.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-By70kcBQ.js";import{t as x}from"./input-BRm9segX.js";import{t as S}from"./page-header-CBQ6sv9V.js";import{a as C,i as w,n as T,t as E}from"./lib-ByrEgu63.js";var D=r(c(),1),O=n(),k=f({defaultToken:d().min(1,o()),defaultCurrency:d().min(1,e()),defaultNetwork:d().min(1,i())});function A(){let n=w(`epay`),r=C(),a=g({resolver:m(k),defaultValues:{defaultToken:``,defaultCurrency:``,defaultNetwork:``}});(0,D.useEffect)(()=>{let e=n.data?.data;e&&a.reset({defaultToken:E(e,`epay.default_token`),defaultCurrency:E(e,`epay.default_currency`),defaultNetwork:E(e,`epay.default_network`)})},[n.data,a]);async function s(e){await T(r.mutateAsync,[{group:`epay`,key:`epay.default_token`,type:`string`,value:e.defaultToken},{group:`epay`,key:`epay.default_currency`,type:`string`,value:e.defaultCurrency},{group:`epay`,key:`epay.default_network`,type:`string`,value:e.defaultNetwork}],t()),await n.refetch()}return(0,O.jsx)(b,{...a,children:(0,O.jsxs)(`form`,{className:`space-y-6`,onSubmit:a.handleSubmit(s),children:[(0,O.jsx)(h,{control:a.control,name:`defaultToken`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:o()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`usdt`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:a.control,name:`defaultCurrency`,render:({field:t})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:e()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`cny`,...t})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:a.control,name:`defaultNetwork`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:i()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`tron`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(u,{disabled:r.isPending||n.isLoading,type:`submit`,children:l()})]})})}function j(){return(0,O.jsx)(S,{description:a(),title:s(),variant:`section`,children:(0,O.jsx)(A,{})})}var M=j;export{M as component};
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import{Du as e,Eu as t,Ou as n,Tu as r,Xd as i,Zd as a,ef as o,fn as s,mn as c,pn as l}from"./messages-Dl4DZ3oF.js";import{t as u}from"./button-C1yViT6u.js";import{c as d,s as f}from"./zod-o7fWFSsj.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-B11xe3D_.js";import{t as x}from"./input-CrVZiDFH.js";import{t as S}from"./page-header-BQBo8kJV.js";import{a as C,i as w,n as T,t as E}from"./lib-Bw_tXTOk.js";var D=o(a(),1),O=i(),k=f({defaultToken:d().min(1,e()),defaultCurrency:d().min(1,t()),defaultNetwork:d().min(1,r())});function A(){let n=w(`epay`),i=C(),a=g({resolver:m(k),defaultValues:{defaultToken:``,defaultCurrency:``,defaultNetwork:``}});(0,D.useEffect)(()=>{let e=n.data?.data;e&&a.reset({defaultToken:E(e,`epay.default_token`),defaultCurrency:E(e,`epay.default_currency`),defaultNetwork:E(e,`epay.default_network`)})},[n.data,a]);async function o(e){await T(i.mutateAsync,[{group:`epay`,key:`epay.default_token`,type:`string`,value:e.defaultToken},{group:`epay`,key:`epay.default_currency`,type:`string`,value:e.defaultCurrency},{group:`epay`,key:`epay.default_network`,type:`string`,value:e.defaultNetwork}],l()),await n.refetch()}return(0,O.jsx)(b,{...a,children:(0,O.jsxs)(`form`,{className:`space-y-6`,onSubmit:a.handleSubmit(o),children:[(0,O.jsx)(h,{control:a.control,name:`defaultToken`,render:({field:t})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:e()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`usdt`,...t})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:a.control,name:`defaultCurrency`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:t()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`cny`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(h,{control:a.control,name:`defaultNetwork`,render:({field:e})=>(0,O.jsxs)(p,{children:[(0,O.jsx)(v,{children:r()}),(0,O.jsx)(_,{children:(0,O.jsx)(x,{placeholder:`tron`,...e})}),(0,O.jsx)(y,{})]})}),(0,O.jsx)(u,{disabled:i.isPending||n.isLoading,type:`submit`,children:s()})]})})}function j(){return(0,O.jsx)(S,{description:c(),title:n(),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
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user