Skip to content

Commit 174791c

Browse files
committed
Add task streak multiplier
1 parent ff67cee commit 174791c

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

src/components/NewTodo.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export interface todoTask {
7474
newId: number; //task id
7575
completed: boolean; //task completed or not
7676
timesCompleted: number; //times task has been completed
77+
streak: number; //task completion streak
7778
originalDueDate: Date; //task original due date
7879
}
7980
const currentUtcDate: Date = new Date();
@@ -95,6 +96,7 @@ export default defineComponent({
9596
newId: 0, //initial task id is 0
9697
completed: false, //task not completed if task is created
9798
timesCompleted: 0,
99+
streak: 0, //set default task streak to 0
98100
originalDueDate: currentLocalDate.toISOString().split("T")[0], //set default original task due date to today
99101
};
100102
},
@@ -118,6 +120,7 @@ export default defineComponent({
118120
this.repeatFrequency = repeatFrequency.Once;
119121
this.completed = false;
120122
this.timesCompleted = 0;
123+
this.streak = 0;
121124
this.originalDueDate = currentLocalDate.toISOString().split("T")[0];
122125
},
123126
},

src/components/TodoList.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
v-bind:class="{
1515
overdue: new Date(todo.dueDate + ' 23:59:59.999') < new Date(),
1616
}"
17-
>{{ todo.task }}: Due {{ todo.dueDate }} Priority:
18-
{{ todo.priority }} Difficulty: {{ todo.difficulty }} Repeat:
17+
>{{ todo.task }}: Streak: {{ todo.streak }} Due
18+
{{ todo.dueDate }} Priority: {{ todo.priority }} Difficulty:
19+
{{ todo.difficulty }} Repeat:
1920
<span v-if="todo.repeatFrequency != 5">{{ todo.repeatOften }}</span
2021
>&nbsp;<span v-if="todo.repeatFrequency == 1">Day</span
2122
><span v-if="todo.repeatFrequency == 2">Week</span
@@ -74,6 +75,7 @@ export default defineComponent({
7475
xp: Number,
7576
completed: Boolean,
7677
timesCompleted: Number,
78+
streak: Number,
7779
originalDueDate: Date,
7880
},
7981
computed: {

src/store/index.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export default createStore({
3131
(1000 * 24 * 60 * 60); //calculate number of days until the task is due
3232
const dateMultiplier: number =
3333
daysToDue < 0 ? -3 / (daysToDue - 1) : 1 + 1 / (daysToDue + 1); //if task is overdue, xp multiplier is less than 1 that decreases over time when task is overdue, else xp multiplier bonus increases (more than 1) when task gets closer to due date
34+
let streakMultiplier: number; //calculate task streak multiplier based on task streak, if task is completed before the due date then the streak increases else if the task is completed overdue (after the due date) reset task streak to 0
3435
let repeatMultiplier: number; //calculate task repetition multiplier based on task repetition occurance and task repetition frequency
3536
if (task.repeatFrequency == 1) {
3637
//if task repetition is daily
@@ -72,9 +73,41 @@ export default createStore({
7273
//if task repetition is one-time
7374
repeatMultiplier = 5; //get 5x xp multiplier for one-time tasks
7475
}
76+
if (daysToDue < 0) {
77+
//if task is overdue
78+
task.streak = 0; //reset task streak to 0
79+
} else {
80+
//if task is completed before due date (not overdue)
81+
task.streak++; //increase task streak
82+
}
83+
if (task.streak == 0) {
84+
streakMultiplier = 1; //1x task streak multiplier
85+
} else if (task.streak < 5) {
86+
streakMultiplier = 1.1 + 0.05 * (task.streak - 1); //1.1x task streak multiplier from 1 streak plus 0.05x streak multiplier for each task streak
87+
} else if (task.streak < 10) {
88+
streakMultiplier = 1.3 + 0.04 * (task.streak - 5); //1.3x task streak multiplier from 5 streak plus 0.04x streak multiplier for each task streak
89+
} else if (task.streak < 20) {
90+
streakMultiplier = 1.5 + 0.02 * (task.streak - 10); //1.5x task streak multiplier from 10 streak plus 0.02x streak multiplier for each task streak
91+
} else if (task.streak < 50) {
92+
streakMultiplier = 1.7 + 0.01 * (task.streak - 20); //1.7x task streak multiplier from 20 streak plus 0.01x streak multiplier for each task streak
93+
} else if (task.streak < 100) {
94+
streakMultiplier = 2 + 0.005 * (task.streak - 50); //2x task streak multiplier from 50 streak plus 0.005x streak multiplier for each task streak
95+
} else if (task.streak < 200) {
96+
streakMultiplier = 2.25 + 0.0025 * (task.streak - 100); //2.25x task streak multiplier from 100 streak plus 0.0025x streak multiplier for each task streak
97+
} else if (task.streak < 500) {
98+
streakMultiplier = 2.5 + 0.001 * (task.streak - 200); //2.5x task streak multiplier from 200 streak plus 0.001x streak multiplier for each task streak
99+
} else if (task.streak < 1000) {
100+
streakMultiplier = 2.8 + 0.0004 * (task.streak - 500); //2.8x task streak multiplier from 500 task streak plus 0.0004x streak multiplier for each task streak
101+
} else {
102+
streakMultiplier = 3; //3x task streak multiplier from 1000 task streak
103+
}
75104
const xp: number = Math.max(
76105
Math.floor(
77-
task.difficulty * task.priority * dateMultiplier * repeatMultiplier
106+
task.difficulty *
107+
task.priority *
108+
dateMultiplier *
109+
repeatMultiplier *
110+
streakMultiplier
78111
),
79112
1
80113
); //get at least 1 xp when the task is completed
@@ -105,6 +138,7 @@ export default createStore({
105138
repeatOften: payload.repeatOften as number,
106139
repeatFrequency: payload.repeatFrequency as number,
107140
timesCompleted: payload.timesCompleted as number,
141+
streak: payload.streak as number,
108142
originalDueDate: payload.originalDueDate as Date,
109143
};
110144
state.todos.unshift(createTask);

0 commit comments

Comments
 (0)