diff --git a/docs/docs.go b/docs/docs.go
index cbb8e673..723e13f9 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1565,6 +1565,18 @@ const docTemplate = `{
"schema": {
"$ref": "#/definitions/util.ResponseAny"
}
+ },
+ "429": {
+ "description": "连续输入错误红包ID次数过多",
+ "schema": {
+ "$ref": "#/definitions/util.ResponseAny"
+ },
+ "headers": {
+ "Retry-After": {
+ "type": "integer",
+ "description": "再次尝试前需等待的秒数"
+ }
+ }
}
}
}
diff --git a/docs/swagger.json b/docs/swagger.json
index 003dc0fb..803d031a 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1556,6 +1556,18 @@
"schema": {
"$ref": "#/definitions/util.ResponseAny"
}
+ },
+ "429": {
+ "description": "连续输入错误红包ID次数过多",
+ "schema": {
+ "$ref": "#/definitions/util.ResponseAny"
+ },
+ "headers": {
+ "Retry-After": {
+ "type": "integer",
+ "description": "再次尝试前需等待的秒数"
+ }
+ }
}
}
}
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index f42a3d17..293554af 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -1578,6 +1578,14 @@ paths:
description: OK
schema:
$ref: '#/definitions/util.ResponseAny'
+ "429":
+ description: 连续输入错误红包ID次数过多
+ headers:
+ Retry-After:
+ description: 再次尝试前需等待的秒数
+ type: integer
+ schema:
+ $ref: '#/definitions/util.ResponseAny'
tags:
- redenvelope
/api/v1/redenvelope/covers:
diff --git a/frontend/components/common/redenvelope/red-envelope-card.tsx b/frontend/components/common/redenvelope/red-envelope-card.tsx
index b3903e49..eb1706dc 100644
--- a/frontend/components/common/redenvelope/red-envelope-card.tsx
+++ b/frontend/components/common/redenvelope/red-envelope-card.tsx
@@ -118,7 +118,7 @@ export function RedEnvelopeCard({
animate={status === "opening" ? {
scale: [1, 0.92, 0],
opacity: [1, 0]
- } : {}}
+ } : { scale: 1, opacity: 1 }}
transition={status === "opening" ? {
duration: 0.55,
ease: "easeInOut"
diff --git a/frontend/components/common/redenvelope/red-envelope-share.tsx b/frontend/components/common/redenvelope/red-envelope-share.tsx
new file mode 100644
index 00000000..b4d87437
--- /dev/null
+++ b/frontend/components/common/redenvelope/red-envelope-share.tsx
@@ -0,0 +1,70 @@
+"use client"
+
+import { useState } from "react"
+import Image from "next/image"
+import { motion, useReducedMotion } from "motion/react"
+import { QRCodeSVG } from "qrcode.react"
+
+export function RedEnvelopeShare({ link }: { link: string }) {
+ const [playing, setPlaying] = useState(false)
+ const [replay, setReplay] = useState(0)
+ const reduceMotion = useReducedMotion()
+
+ return (
+ <>
+
+ {
+ if (event.pointerType === "mouse") setPlaying(true)
+ }}
+ onPointerLeave={(event) => {
+ if (event.pointerType === "mouse") setPlaying(false)
+ }}
+ onFocus={() => setPlaying(true)}
+ onBlur={(event) => {
+ if (!event.currentTarget.contains(event.relatedTarget)) setPlaying(false)
+ }}
+ >
+ {
+ setPlaying(true)
+ setReplay(value => value + 1)
+ }}
+ >
+
+
+
+
+ {playing && (
+
+ )}
+
+
+ >
+ )
+}
diff --git a/frontend/components/common/trade/red-envelope.tsx b/frontend/components/common/trade/red-envelope.tsx
index f7527297..3aa4554c 100644
--- a/frontend/components/common/trade/red-envelope.tsx
+++ b/frontend/components/common/trade/red-envelope.tsx
@@ -4,7 +4,7 @@ import * as React from "react"
import { useState, useEffect } from "react"
import Image from "next/image"
import { toast } from "sonner"
-import { Gift, Copy, Check, ExternalLink, Pencil, X, ImagePlus, History } from "lucide-react"
+import { Gift, Copy, Check, Share2, Pencil, X, ImagePlus, History } from "lucide-react"
import type { UploadImageResponse } from "@/lib/services"
import { getFileUrl } from "@/lib/services/upload/upload.service"
import { Input } from "@/components/ui/input"
@@ -18,6 +18,7 @@ import { ListData } from "@/components/common/general/list-data"
import { ImageCropper } from "@/components/common/redenvelope/image-cropper"
import { motion } from "motion/react"
import { RedEnvelopeCard } from "@/components/common/redenvelope/red-envelope-card"
+import { RedEnvelopeShare } from "@/components/common/redenvelope/red-envelope-share"
import { useUser } from "@/contexts/user-context"
import services from "@/lib/services"
import type { RedEnvelopeType, CreateRedEnvelopeRequest, PublicConfigResponse, RedEnvelope, RedEnvelopeListResponse } from "@/lib/services"
@@ -696,7 +697,7 @@ export function RedEnvelope({ onSuccess }: { onSuccess?: () => void }) {
-
+
+ {isResultOpen && resultLink &&
}
+