mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 18:10:18 +05:30
88 lines
2.2 KiB
JavaScript
88 lines
2.2 KiB
JavaScript
const HISTORY_KEY = 'plugins.writing-studio.history';
|
|
|
|
class GoalTracker {
|
|
/**
|
|
* @param {object} store - { get(key), set(key, value) } settings backend
|
|
*/
|
|
constructor(store) {
|
|
this.store = store;
|
|
}
|
|
|
|
_getHistory() {
|
|
const raw = this.store.get(HISTORY_KEY);
|
|
return raw ? JSON.parse(raw) : {};
|
|
}
|
|
|
|
_setHistory(history) {
|
|
this.store.set(HISTORY_KEY, JSON.stringify(history));
|
|
}
|
|
|
|
_setHistoryDay(dateStr, data) {
|
|
const history = this._getHistory();
|
|
history[dateStr] = data;
|
|
this._setHistory(history);
|
|
}
|
|
|
|
addWords(count) {
|
|
const today = new Date().toISOString().split('T')[0];
|
|
const history = this._getHistory();
|
|
if (!history[today]) {
|
|
history[today] = { words: 0, sessions: 0 };
|
|
}
|
|
history[today].words += count;
|
|
history[today].sessions += 1;
|
|
this._setHistory(history);
|
|
}
|
|
|
|
getDailyProgress(goal) {
|
|
const today = new Date().toISOString().split('T')[0];
|
|
const history = this._getHistory();
|
|
const written = history[today]?.words || 0;
|
|
return { written, goal, pct: goal > 0 ? Math.min(100, Math.round((written / goal) * 100)) : 0 };
|
|
}
|
|
|
|
getStreak(goal) {
|
|
const history = this._getHistory();
|
|
let streak = 0;
|
|
const d = new Date();
|
|
for (let i = 0; i < 365; i++) {
|
|
const key = d.toISOString().split('T')[0];
|
|
const day = history[key];
|
|
if (day && day.words >= goal) {
|
|
streak++;
|
|
d.setDate(d.getDate() - 1);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
return streak;
|
|
}
|
|
|
|
getLast30Days() {
|
|
const history = this._getHistory();
|
|
const days = [];
|
|
const d = new Date();
|
|
for (let i = 0; i < 30; i++) {
|
|
const key = d.toISOString().split('T')[0];
|
|
const day = history[key];
|
|
days.push({ date: key, words: day?.words || 0 });
|
|
d.setDate(d.getDate() - 1);
|
|
}
|
|
return days.reverse();
|
|
}
|
|
|
|
getWeeklyTotal() {
|
|
const history = this._getHistory();
|
|
let total = 0;
|
|
const d = new Date();
|
|
for (let i = 0; i < 7; i++) {
|
|
const key = d.toISOString().split('T')[0];
|
|
if (history[key]) total += history[key].words || 0;
|
|
d.setDate(d.getDate() - 1);
|
|
}
|
|
return total;
|
|
}
|
|
}
|
|
|
|
module.exports = { GoalTracker };
|