This commit is contained in:
2025-10-05 01:40:12 +08:00
parent aa8fcccf7d
commit 41d3246246
4 changed files with 51 additions and 13 deletions

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import copyText from "copy-text-to-clipboard" import { copyToClipboard } from "~/utils/functions"
import { code, input, output } from "oj/composables/code" import { code, input, output } from "oj/composables/code"
import { problem } from "oj/composables/problem" import { problem } from "oj/composables/problem"
import { LANGUAGE_SHOW_VALUE, SOURCES, STORAGE_KEY } from "utils/constants" import { LANGUAGE_SHOW_VALUE, SOURCES, STORAGE_KEY } from "utils/constants"
@@ -57,9 +57,13 @@ const languageOptions: DropdownOption[] = problem.value!.languages.map((it) => (
value: it, value: it,
})) }))
const copy = () => { const copy = async () => {
copyText(code.value) const success = await copyToClipboard(code.value)
message.success("代码复制成功") if (success) {
message.success("代码复制成功")
} else {
message.error("代码复制失败")
}
} }
const reset = () => { const reset = () => {

View File

@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { Icon } from "@iconify/vue" import { Icon } from "@iconify/vue"
import copy from "copy-text-to-clipboard" import { copyToClipboard } from "~/utils/functions"
defineProps<{ value: string }>() defineProps<{ value: string }>()
const [copied, toggle] = useToggle() const [copied, toggle] = useToggle()
@@ -9,10 +9,12 @@ const { start } = useTimeoutFn(() => toggle(false), 1000, { immediate: false })
const COPY = h(Icon, { icon: "twemoji:clipboard" }) const COPY = h(Icon, { icon: "twemoji:clipboard" })
const OK = h(Icon, { icon: "twemoji:check-mark-button" }) const OK = h(Icon, { icon: "twemoji:check-mark-button" })
function handleClick(value: string) { async function handleClick(value: string) {
copy(value) const success = await copyToClipboard(value)
toggle(true) if (success) {
start() toggle(true)
start()
}
} }
</script> </script>
<template> <template>

View File

@@ -9,16 +9,20 @@
</n-tooltip> </n-tooltip>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import copyText from "copy-text-to-clipboard" import { copyToClipboard } from "~/utils/functions"
const message = useMessage() const message = useMessage()
const slots = useSlots() const slots = useSlots()
function handleClick() { async function handleClick() {
const textToCopy = getTextFromSlot() const textToCopy = getTextFromSlot()
copyText(textToCopy) const success = await copyToClipboard(textToCopy)
message.success("已复制") if (success) {
message.success("已复制")
} else {
message.error("复制失败")
}
} }
function getTextFromSlot() { function getTextFromSlot() {

View File

@@ -2,6 +2,7 @@ import { getTime, intervalToDuration, parseISO, type Duration } from "date-fns"
import { User } from "./types" import { User } from "./types"
import { USER_TYPE } from "./constants" import { USER_TYPE } from "./constants"
import { strFromU8, strToU8, unzlibSync, zlibSync } from "fflate" import { strFromU8, strToU8, unzlibSync, zlibSync } from "fflate"
import copyTextFallback from "copy-text-to-clipboard"
function calculateACRate(acCount: number, totalCount: number): string { function calculateACRate(acCount: number, totalCount: number): string {
if (totalCount === 0) return "0.00" if (totalCount === 0) return "0.00"
@@ -199,6 +200,33 @@ export function atou(base64: string): string {
return strFromU8(unzipped) return strFromU8(unzipped)
} }
/**
* 复制文本到剪贴板
* 优先使用 Clipboard API支持在 modal 中使用),失败时回退到 copy-text-to-clipboard
* @param text 要复制的文本
* @returns Promise<boolean> 复制是否成功
*/
export async function copyToClipboard(text: string): Promise<boolean> {
// 优先使用现代 Clipboard API
if (navigator.clipboard && window.isSecureContext) {
try {
await navigator.clipboard.writeText(text)
return true
} catch (error) {
console.warn("Clipboard API 复制失败,尝试使用回退方法:", error)
}
}
// 回退到 copy-text-to-clipboard
try {
const success = copyTextFallback(text)
return success
} catch (error) {
console.error("复制失败:", error)
return false
}
}
// function getChromeVersion() { // function getChromeVersion() {
// var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./) // var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)
// return raw ? parseInt(raw[2], 10) : 0 // return raw ? parseInt(raw[2], 10) : 0