- Adicionados ícones SVG para ChatGPT, Claude, Gemini e OpenRouter - Implementados ícones para modos claro e escuro do ChatGPT - Criado script de inicialização para PostgreSQL com extensão pgcrypto - Adicionado script de configuração de ambiente que faz backup do .env - Configurado tsconfig.json para TypeScript com opções de compilação
95 lines
2.0 KiB
TypeScript
95 lines
2.0 KiB
TypeScript
import { useEffect } from "react";
|
|
|
|
type UseCalculatorKeyboardParams = {
|
|
canCopy: boolean;
|
|
onCopy: () => void | Promise<void>;
|
|
onPaste: () => void | Promise<void>;
|
|
};
|
|
|
|
function shouldIgnoreForEditableTarget(target: EventTarget | null): boolean {
|
|
if (!target || !(target instanceof HTMLElement)) {
|
|
return false;
|
|
}
|
|
|
|
const tagName = target.tagName;
|
|
return (
|
|
tagName === "INPUT" ||
|
|
tagName === "TEXTAREA" ||
|
|
target.isContentEditable
|
|
);
|
|
}
|
|
|
|
export function useCalculatorKeyboard({
|
|
canCopy,
|
|
onCopy,
|
|
onPaste,
|
|
}: UseCalculatorKeyboardParams) {
|
|
useEffect(() => {
|
|
if (!canCopy) {
|
|
return;
|
|
}
|
|
|
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
if (!(event.ctrlKey || event.metaKey)) {
|
|
return;
|
|
}
|
|
|
|
if (shouldIgnoreForEditableTarget(event.target)) {
|
|
return;
|
|
}
|
|
|
|
if (event.key.toLowerCase() !== "c") {
|
|
return;
|
|
}
|
|
|
|
const selection = window.getSelection();
|
|
if (selection && selection.toString().trim().length > 0) {
|
|
return;
|
|
}
|
|
|
|
event.preventDefault();
|
|
void onCopy();
|
|
};
|
|
|
|
document.addEventListener("keydown", handleKeyDown);
|
|
|
|
return () => {
|
|
document.removeEventListener("keydown", handleKeyDown);
|
|
};
|
|
}, [canCopy, onCopy]);
|
|
|
|
useEffect(() => {
|
|
const handlePasteShortcut = (event: KeyboardEvent) => {
|
|
if (!(event.ctrlKey || event.metaKey)) {
|
|
return;
|
|
}
|
|
|
|
if (event.key.toLowerCase() !== "v") {
|
|
return;
|
|
}
|
|
|
|
if (shouldIgnoreForEditableTarget(event.target)) {
|
|
return;
|
|
}
|
|
|
|
const selection = window.getSelection();
|
|
if (selection && selection.toString().trim().length > 0) {
|
|
return;
|
|
}
|
|
|
|
if (!navigator.clipboard?.readText) {
|
|
return;
|
|
}
|
|
|
|
event.preventDefault();
|
|
void onPaste();
|
|
};
|
|
|
|
document.addEventListener("keydown", handlePasteShortcut);
|
|
|
|
return () => {
|
|
document.removeEventListener("keydown", handlePasteShortcut);
|
|
};
|
|
}, [onPaste]);
|
|
}
|