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 }) { -
+
void }) {
+ {isResultOpen && resultLink && } +