Files
browser-wakatime/src/wakatimeScript.ts

84 lines
1.8 KiB
TypeScript

import WakaTimeCore from './core/WakaTimeCore';
const twoMinutes = 120000;
interface DesignProject {
category: string;
editor: string;
language: string;
project: string;
}
const parseCanva = (): DesignProject | undefined => {
const canvaProject = document.getElementsByClassName('rF765A');
if (canvaProject.length === 0) return;
const projectName = (document.head.querySelector('meta[property="og:title"]') as HTMLMetaElement)
.content;
return {
category: 'Designing',
editor: 'Canva',
language: 'Canva Design',
project: projectName,
};
};
const parseFigma = (): DesignProject | undefined => {
const figmaProject = document.getElementsByClassName('gpu-view-content');
if (figmaProject.length === 0) return;
const projectName = (document.querySelector('span[data-testid="filename"]') as HTMLElement)
.innerText;
return {
category: 'Designing',
editor: 'Figma',
language: 'Figma Design',
project: projectName,
};
};
const getParser: {
[key: string]:
| (() => { editor: string; language: string; project: string } | undefined)
| undefined;
} = {
'www.canva.com': parseCanva,
'www.figma.com': parseFigma,
};
const init = async () => {
const { hostname } = document.location;
const projectDetails = getParser[hostname]?.();
if (projectDetails) {
await WakaTimeCore.recordHeartbeat(projectDetails);
}
};
function debounce(func: () => void, timeout = twoMinutes) {
let timer: NodeJS.Timeout | undefined;
return () => {
if (timer) {
return;
}
func();
timer = setTimeout(() => {
clearTimeout(timer);
timer = undefined;
}, timeout);
};
}
document.body.addEventListener(
'click',
debounce(() => init()),
true,
);
document.body.addEventListener(
'keypress',
debounce(() => init()),
true,
);