Skip to content

Commit 76d375a

Browse files
committed
Add daily streak with XP multiplier
1 parent d43a96e commit 76d375a

File tree

4 files changed

+83
-22
lines changed

4 files changed

+83
-22
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "typescript-app",
3-
"version": "1.2.0",
3+
"version": "1.6.0",
44
"private": true,
55
"scripts": {
66
"serve": "vue-cli-service serve",

src/components/NewTodo.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export interface todoTask {
7575
completed: boolean; //task completed or not
7676
timesCompleted: number; //times task has been completed
7777
streak: number; //task completion streak
78-
originalDueDate: Date; //task original due date
78+
originalDueDate: Date; //task original due date in YYYY-MM-DD string
7979
}
8080
const currentUtcDate: Date = new Date();
8181
const currentLocalDate: Date = new Date(

src/components/TodoList.vue

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<div class="todo-app">
33
<p>Level: {{ levels.toLocaleString("en-US") }}</p>
44
<p>XP: {{ xps.toLocaleString("en-US") }}</p>
5+
<p>Daily Streak: {{ dailyStreaks.toLocaleString("en-US") }}</p>
56
<!--show circular progress bar filled with level progress--><ve-progress
67
:progress="progresses"
78
>Level {{ levels.toLocaleString("en-US") }}</ve-progress
@@ -14,10 +15,13 @@
1415
v-bind:class="{
1516
overdue: new Date(todo.dueDate + ' 23:59:59.999') < new Date(),
1617
}"
17-
>{{ todo.task }}: <br />Streak: {{ todo.streak }} <br />Due date:
18+
>{{ todo.task }} <br />Streak:
19+
{{ todo.streak.toLocaleString("en-US") }} <br />Due date:
1820
{{ todo.dueDate }} <br />Priority: {{ todo.priority }}
1921
<br />Difficulty: {{ todo.difficulty }} <br />Repeat:
20-
<span v-if="todo.repeatFrequency != 5">{{ todo.repeatOften }}</span
22+
<span v-if="todo.repeatFrequency != 5">{{
23+
todo.repeatOften.toLocaleString("en-US")
24+
}}</span
2125
>&nbsp;<span v-if="todo.repeatFrequency == 1">Day</span
2226
><span v-if="todo.repeatFrequency == 2">Week</span
2327
><span v-if="todo.repeatFrequency == 3">Month</span
@@ -76,6 +80,7 @@ export default defineComponent({
7680
completed: Boolean,
7781
timesCompleted: Number,
7882
streak: Number,
83+
dailyStreak: Number,
7984
originalDueDate: Date,
8085
},
8186
computed: {
@@ -92,7 +97,13 @@ export default defineComponent({
9297
return store.getters.getXp; //get current xp
9398
},
9499
progresses() {
95-
return store.getters.getProgress; //get curent progress
100+
return store.getters.getProgress; //get current progress
101+
},
102+
dailyStreaks() {
103+
return store.getters.getDailyStreak; //get current daily streak
104+
},
105+
lastCompletedDates() {
106+
return store.getters.getLastCompletionDate; //get current last completion date
96107
},
97108
},
98109
methods: {

src/store/index.ts

Lines changed: 67 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@ export default createStore({
99
level: 1 as number, //set level to 1 as total xp is 0 when state is created
1010
xp: 0 as number,
1111
progress: 0 as number,
12+
dailyStreak: 0 as number, //set daily streak to 0 and last completion date to undefined when state is created
13+
lastCompletionDate: undefined as string | undefined, //last completion date in YYYY-MM-DD string
1214
},
1315
},
1416
getters: {
1517
getTodos: (state) => state.todos, //get task list
1618
getXp: (state) => state.user.xp, //get user xp
1719
getLevel: (state) => state.user.level, //get user level
1820
getProgress: (state) => state.user.progress, //get user level progress
21+
getDailyStreak: (state) => state.user.dailyStreak, //get user daily streak
22+
getLastCompletionDate: (state) => state.user.lastCompletionDate, //get user last completion date
1923
},
2024
mutations: {
2125
/**
@@ -28,12 +32,13 @@ export default createStore({
2832
const daysToDue: number =
2933
(Number(new Date(task.dueDate + " 23:59:59.999")) -
3034
Number(new Date().setHours(23, 59, 59, 999))) /
31-
(1000 * 24 * 60 * 60); //calculate number of days until the task is due
35+
(1000 * 60 * 60 * 24); //calculate number of days until the task is due
3236
const dateMultiplier: number =
3337
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
35-
let repeatMultiplier: number; //calculate task repetition multiplier based on task repetition occurance and task repetition frequency
36-
//calculate task repeition multiplier
38+
let streakMultiplier: number; //calculate task streak xp 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
39+
let repeatMultiplier: number; //calculate task repetition xp multiplier based on task repetition occurance and task repetition frequency
40+
let dailyStreakMultiplier: number; //calculate daily streak xp multiplier based on daily streak
41+
//calculate task repetition xp multiplier
3742
if (task.repeatFrequency == 1) {
3843
//if task repetition is daily
3944
if (task.repeatOften < 7) {
@@ -82,27 +87,71 @@ export default createStore({
8287
//if task is completed before due date (not overdue)
8388
task.streak++; //increase task streak
8489
}
85-
//calculate task streak multiplier
86-
if (task.streak == 0 || task.repeatFreqnency == 5) {
90+
//calculate daily streak
91+
const currentDate: Date = new Date();
92+
if (
93+
state.user.lastCompletionDate == undefined ||
94+
new Date(currentDate.setDate(currentDate.getDate() - 1)) >
95+
new Date(state.user.lastCompletionDate + " 23:59:59.999")
96+
) {
97+
//if user last completion date is before yesterday or undefined (no user task completed yet)
98+
state.user.dailyStreak = 1; //reset daily streak to 1
99+
} else if (
100+
Number(new Date(currentDate.setHours(23, 59, 59, 999))) -
101+
Number(new Date(state.user.lastCompletionDate + " 23:59:59.999")) ==
102+
1000 * 60 * 60 * 24
103+
) {
104+
state.user.dailyStreak++; //increase daily streak
105+
}
106+
//calculate daily streak xp multiplier
107+
if (state.user.dailyStreak == (0 || 1)) {
108+
dailyStreakMultiplier = 1; //1x daily streak xp multiplier if daily streak is 0 or 1
109+
} else if (state.user.dailyStreak < 3) {
110+
dailyStreakMultiplier = 1 + 0.1 * (state.user.dailyStreak - 1); //1x daily streak xp multiplier from 1 streak plus 0.1x streak multiplier for each daily streak
111+
} else if (state.user.dailyStreak < 7) {
112+
dailyStreakMultiplier = 1.2 + 0.05 * (state.user.dailyStreak - 3); //1.2x daily streak xp multiplier from 3 streak plus 0.05x streak multiplier for each daily streak
113+
} else if (state.user.dailyStreak < 14) {
114+
dailyStreakMultiplier = 1.4 + 0.03 * (state.user.dailyStreak - 7); //1.4x daily streak xp multiplier from 7 streak plus 0.03x streak multiplier for each daily streak
115+
} else if (state.user.dailyStreak < 30) {
116+
dailyStreakMultiplier = 1.61 + 0.02 * (state.user.dailyStreak - 14); //1.61x daily streak xp multiplier from 14 streak plus 0.02x streak multiplier for each daily streak
117+
} else if (state.user.dailyStreak < 90) {
118+
dailyStreakMultiplier = 1.89 + 0.01 * (state.user.dailyStreak - 30); //1.89x daily streak xp multiplier from 30 streak plus 0.01x streak multiplier for each daily streak
119+
} else if (state.user.dailyStreak < 180) {
120+
dailyStreakMultiplier = 2.49 + 0.005 * (state.user.dailyStreak - 90); //2.49x daily streak xp multiplier from 90 streak plus 0.005x streak multiplier for each daily streak
121+
} else if (state.user.dailyStreak < 365) {
122+
dailyStreakMultiplier = 2.94 + 0.002 * (state.user.dailyStreak - 180); //2.94x daily streak xp multiplier from 30 streak plus 0.002x streak multiplier for each daily streak
123+
} else {
124+
dailyStreakMultiplier = 3.31; //3.31x daily streak xp multiplier from 365 daily streak
125+
}
126+
//set last completion date to today
127+
state.user.lastCompletionDate = new Date(
128+
currentDate.setMinutes(
129+
currentDate.getMinutes() - currentDate.getTimezoneOffset()
130+
)
131+
)
132+
.toISOString()
133+
.split("T")[0];
134+
//calculate task streak xp multiplier
135+
if (task.streak == 0 || task.repeatFrequency == 5) {
87136
streakMultiplier = 1; //1x task streak multiplier if task streak is 0 or completed a one-time task
88137
} else if (task.streak < 5) {
89-
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
138+
streakMultiplier = 1.1 + 0.05 * (task.streak - 1); //1.1x task streak xp multiplier from 1 streak plus 0.05x streak multiplier for each task streak
90139
} else if (task.streak < 10) {
91-
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
140+
streakMultiplier = 1.3 + 0.04 * (task.streak - 5); //1.3x task streak xp multiplier from 5 streak plus 0.04x streak multiplier for each task streak
92141
} else if (task.streak < 20) {
93-
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
142+
streakMultiplier = 1.5 + 0.02 * (task.streak - 10); //1.5x task streak xp multiplier from 10 streak plus 0.02x streak multiplier for each task streak
94143
} else if (task.streak < 50) {
95-
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
144+
streakMultiplier = 1.7 + 0.01 * (task.streak - 20); //1.7x task streak xp multiplier from 20 streak plus 0.01x streak multiplier for each task streak
96145
} else if (task.streak < 100) {
97-
streakMultiplier = 2 + 0.005 * (task.streak - 50); //2x task streak multiplier from 50 streak plus 0.005x streak multiplier for each task streak
146+
streakMultiplier = 2 + 0.005 * (task.streak - 50); //2x task streak xp multiplier from 50 streak plus 0.005x streak multiplier for each task streak
98147
} else if (task.streak < 200) {
99-
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
148+
streakMultiplier = 2.25 + 0.0025 * (task.streak - 100); //2.25x task streak xp multiplier from 100 streak plus 0.0025x streak multiplier for each task streak
100149
} else if (task.streak < 500) {
101-
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
150+
streakMultiplier = 2.5 + 0.001 * (task.streak - 200); //2.5x task streak xp multiplier from 200 streak plus 0.001x streak multiplier for each task streak
102151
} else if (task.streak < 1000) {
103-
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
152+
streakMultiplier = 2.8 + 0.0004 * (task.streak - 500); //2.8x task streak xp multiplier from 500 task streak plus 0.0004x streak multiplier for each task streak
104153
} else {
105-
streakMultiplier = 3; //3x task streak multiplier from 1000 task streak
154+
streakMultiplier = 3; //3x task streak xp multiplier from 1000 task streak
106155
}
107156
//calculate amount of xp earned when task is completed
108157
const xp: number = Math.max(
@@ -111,11 +160,12 @@ export default createStore({
111160
task.priority *
112161
dateMultiplier *
113162
repeatMultiplier *
114-
streakMultiplier
163+
streakMultiplier *
164+
dailyStreakMultiplier
115165
),
116166
1
117167
); //get at least 1 xp when the task is completed
118-
state.user.xp += xp; //get amount of xp earned based on task difficulty, task priority, task due date and task repetition
168+
state.user.xp += xp; //get amount of xp earned based on task difficulty, task priority, task due date, task repetition, task streak and daily streak multipliers
119169
state.user.level = Math.max(
120170
1,
121171
Math.floor(Math.pow(state.user.xp, 1 / 3 + 5e-16))

0 commit comments

Comments
 (0)