diff options
| author | xXJSONDeruloXx <danielhimebauch@gmail.com> | 2025-07-21 23:15:29 -0400 |
|---|---|---|
| committer | xXJSONDeruloXx <danielhimebauch@gmail.com> | 2025-07-21 23:15:29 -0400 |
| commit | 4112393b17d25e54f1b8822734210b045da97613 (patch) | |
| tree | 7fd335fb69fc7bf2260acd72a505ae5476bbd6b6 /src/utils/clipboardUtils.ts | |
| parent | e54b7e2c5f3a736f248353317007f922771ab0c7 (diff) | |
| download | decky-lsfg-vk-4112393b17d25e54f1b8822734210b045da97613.tar.gz decky-lsfg-vk-4112393b17d25e54f1b8822734210b045da97613.zip | |
dry up with py generators for ts backends
Diffstat (limited to 'src/utils/clipboardUtils.ts')
| -rw-r--r-- | src/utils/clipboardUtils.ts | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/utils/clipboardUtils.ts b/src/utils/clipboardUtils.ts new file mode 100644 index 0000000..2d480fc --- /dev/null +++ b/src/utils/clipboardUtils.ts @@ -0,0 +1,70 @@ +/** + * Clipboard utilities for reliable copy operations across different environments + */ + +/** + * Reliably copy text to clipboard using multiple fallback methods + * This is especially important in gaming mode where clipboard APIs may behave differently + */ +export async function copyToClipboard(text: string): Promise<boolean> { + // Use the proven input simulation method + const tempInput = document.createElement('input'); + tempInput.value = text; + tempInput.style.position = 'absolute'; + tempInput.style.left = '-9999px'; + document.body.appendChild(tempInput); + + try { + // Focus and select the text + tempInput.focus(); + tempInput.select(); + + // Try copying using execCommand first (most reliable in gaming mode) + let copySuccess = false; + try { + if (document.execCommand('copy')) { + copySuccess = true; + } + } catch (e) { + // If execCommand fails, try navigator.clipboard as fallback + try { + await navigator.clipboard.writeText(text); + copySuccess = true; + } catch (clipboardError) { + console.error('Both copy methods failed:', e, clipboardError); + } + } + + return copySuccess; + } finally { + // Clean up + document.body.removeChild(tempInput); + } +} + +/** + * Verify that text was successfully copied to clipboard + */ +export async function verifyCopy(expectedText: string): Promise<boolean> { + try { + const readBack = await navigator.clipboard.readText(); + return readBack === expectedText; + } catch (e) { + // Verification not available, assume success + return true; + } +} + +/** + * Copy text with verification and return success status + */ +export async function copyWithVerification(text: string): Promise<{ success: boolean; verified: boolean }> { + const copySuccess = await copyToClipboard(text); + + if (!copySuccess) { + return { success: false, verified: false }; + } + + const verified = await verifyCopy(text); + return { success: true, verified }; +} |
