From e3970c9f6e281234c41686858dd46ff3a037befc Mon Sep 17 00:00:00 2001 From: Zhang Minghan Date: Fri, 15 Dec 2023 17:32:05 +0800 Subject: [PATCH] fix: random seed seq --- admin/invitation.go | 10 ++ app/src/assets/admin/all.less | 26 ++++ app/src/assets/admin/charge.less | 26 ---- app/src/components/PopupDialog.tsx | 17 +-- app/src/components/admin/ChargeWidget.tsx | 10 +- app/src/components/admin/InvitationTable.tsx | 21 ++- .../admin/assemblies/ChannelEditor.tsx | 19 ++- .../components/home/ConversationSegment.tsx | 7 +- app/src/components/home/SideBar.tsx | 121 +++++++++--------- app/src/components/ui/button.tsx | 28 +++- app/src/i18n.ts | 3 + channel/system.go | 1 + utils/base.go | 15 +++ utils/char.go | 8 +- 14 files changed, 195 insertions(+), 117 deletions(-) create mode 100644 channel/system.go diff --git a/admin/invitation.go b/admin/invitation.go index 23e3edb..b4f9c84 100644 --- a/admin/invitation.go +++ b/admin/invitation.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "math" + "strings" ) func GetInvitationPagination(db *sql.DB, page int64) PaginationForm { @@ -62,12 +63,21 @@ func NewInvitationCode(db *sql.DB, code string, quota float32, t string) error { func GenerateInvitations(db *sql.DB, num int, quota float32, t string) InvitationGenerateResponse { arr := make([]string, 0) idx := 0 + retry := 0 for idx < num { code := fmt.Sprintf("%s-%s", t, utils.GenerateChar(24)) if err := NewInvitationCode(db, code, quota, t); err != nil { + // ignore duplicate code if errors.Is(err, sql.ErrNoRows) { continue } + + if retry < 100 && strings.Contains(err.Error(), "Duplicate entry") { + retry++ + continue + } + + retry = 0 return InvitationGenerateResponse{ Status: false, Message: err.Error(), diff --git a/app/src/assets/admin/all.less b/app/src/assets/admin/all.less index 6ad3bf5..96398b6 100644 --- a/app/src/assets/admin/all.less +++ b/app/src/assets/admin/all.less @@ -14,3 +14,29 @@ min-height: calc(100vh - 56px); height: max-content; } + +.object-id { + display: flex; + flex-direction: row; + align-items: center; + justify-items: center; + border-radius: var(--radius); + border: 1px solid hsl(var(--border)); + color: hsl(var(--text-secondary)); + user-select: none; + font-size: 0.75rem; + height: 2.5rem; + padding: 0.5rem 1.25rem; + cursor: pointer; + transition: 0.25s; + flex-shrink: 0; + + &:hover { + color: hsl(var(--text)); + border-color: hsl(var(--border-hover)); + } + + svg { + transform: translateY(1px); + } +} diff --git a/app/src/assets/admin/charge.less b/app/src/assets/admin/charge.less index d55a142..bbb740a 100644 --- a/app/src/assets/admin/charge.less +++ b/app/src/assets/admin/charge.less @@ -36,32 +36,6 @@ color: hsl(var(--text-secondary)); user-select: none; } - - .target { - display: flex; - flex-direction: row; - align-items: center; - justify-items: center; - border-radius: var(--radius); - border: 1px solid hsl(var(--border)); - color: hsl(var(--text-secondary)); - user-select: none; - font-size: 0.75rem; - height: 2.5rem; - padding: 0.5rem 1rem; - cursor: pointer; - transition: 0.25s; - flex-shrink: 0; - - &:hover { - color: hsl(var(--text)); - border-color: hsl(var(--border-hover)); - } - - svg { - transform: translateY(1px); - } - } } diff --git a/app/src/components/PopupDialog.tsx b/app/src/components/PopupDialog.tsx index 88584f0..47c4ad0 100644 --- a/app/src/components/PopupDialog.tsx +++ b/app/src/components/PopupDialog.tsx @@ -61,14 +61,15 @@ function PopupDialog({ {t("cancel")} - @@ -112,7 +117,13 @@ function GenerateDialog() { - + + diff --git a/app/src/components/admin/assemblies/ChannelEditor.tsx b/app/src/components/admin/assemblies/ChannelEditor.tsx index 8f07afb..0c63776 100644 --- a/app/src/components/admin/assemblies/ChannelEditor.tsx +++ b/app/src/components/admin/assemblies/ChannelEditor.tsx @@ -21,7 +21,7 @@ import { Button } from "@/components/ui/button.tsx"; import { useTranslation } from "react-i18next"; import { useMemo, useReducer, useState } from "react"; import Required from "@/components/Require.tsx"; -import { Search, X } from "lucide-react"; +import { Plus, Search, X } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, @@ -410,12 +410,25 @@ function ChannelEditor({ display, id, setEnabled }: ChannelEditorProps) { /> -
+
+
+ ID + {edit.id === -1 ? ( + + ) : ( + {edit.id} + )} +
-
diff --git a/app/src/components/home/ConversationSegment.tsx b/app/src/components/home/ConversationSegment.tsx index 7ff14c8..07e5782 100644 --- a/app/src/components/home/ConversationSegment.tsx +++ b/app/src/components/home/ConversationSegment.tsx @@ -58,7 +58,12 @@ function ConversationSegment({ if (state) setOffset(new Date().getTime()); }} > - + { + e.preventDefault(); + e.stopPropagation(); + }} + > diff --git a/app/src/components/home/SideBar.tsx b/app/src/components/home/SideBar.tsx index da6dff1..200db5c 100644 --- a/app/src/components/home/SideBar.tsx +++ b/app/src/components/home/SideBar.tsx @@ -2,7 +2,7 @@ import { useTranslation } from "react-i18next"; import { useDispatch, useSelector } from "react-redux"; import { selectAuthenticated, selectUsername } from "@/store/auth.ts"; import { closeMarket, selectCurrent, selectHistory } from "@/store/chat.ts"; -import { useRef, useState } from "react"; +import React, { useRef, useState } from "react"; import { ConversationInstance } from "@/api/types.ts"; import { useToast } from "@/components/ui/use-toast.ts"; import { extractMessage, filterMessage } from "@/utils/processor.ts"; @@ -65,6 +65,26 @@ function SidebarAction({ setOperateConversation }: SidebarActionProps) { const refresh = useRef(null); const [removeAll, setRemoveAll] = useState(false); + async function handleDeleteAll(e: React.MouseEvent) { + e.preventDefault(); + e.stopPropagation(); + + if (await deleteAllConversations(dispatch)) + toast({ + title: t("conversation.delete-success"), + description: t("conversation.delete-success-prompt"), + }); + else + toast({ + title: t("conversation.delete-failed"), + description: t("conversation.delete-failed-prompt"), + }); + + await updateConversationList(dispatch); + setOperateConversation({ target: null, type: "" }); + setRemoveAll(false); + } + return (