diff --git a/client/src/components/NavBar.vue b/client/src/components/NavBar.vue
index 145a817..9a09c57 100644
--- a/client/src/components/NavBar.vue
+++ b/client/src/components/NavBar.vue
@@ -1,5 +1,6 @@
diff --git a/client/src/components/TickComponent.vue b/client/src/components/TickComponent.vue
index 47d57e0..8b1d863 100644
--- a/client/src/components/TickComponent.vue
+++ b/client/src/components/TickComponent.vue
@@ -15,8 +15,8 @@ const className = computed(() => isSet.value ? "button is-rounded is-info" : "bu
async function toggle() {
if (isSet.value) {
- await props.track.markIncomplete(props.date)
+ await state.taskMarkedIncomplete(props.track, props.date)
} else
- await props.track.markComplete(props.date)
+ await state.taskCompleted(props.track, props.date)
}
\ No newline at end of file
diff --git a/client/src/components/TrackIcon.vue b/client/src/components/TrackIcon.vue
index e5aeabf..273987e 100644
--- a/client/src/components/TrackIcon.vue
+++ b/client/src/components/TrackIcon.vue
@@ -1,12 +1,12 @@
diff --git a/client/src/state.ts b/client/src/state.ts
index 028ae4b..b0e94fa 100644
--- a/client/src/state.ts
+++ b/client/src/state.ts
@@ -11,6 +11,15 @@ enum State {
Fetched,
}
+function dateQuery(date: Date): URLSearchParams {
+ let query = new URLSearchParams()
+ query.set("year", date.getUTCFullYear().toString())
+ query.set("month", (date.getUTCMonth() + 1).toString())
+ // good thing I still had this ^^^^^^^^^^^^^^ in mind when I wrote this 😬
+ query.set("day", date.getUTCDate().toString())
+ return query
+}
+
interface LoggedInUser {
name: string
}
@@ -92,6 +101,36 @@ class AppState {
if (this.state != State.Unfetched) return
await this.repopulate()
}
+ async taskCompleted(track: Track, date: Date): Promise {
+ const query = dateQuery(date)
+ const response: Response = await fetch(`/api/v1/tracks/${track.id}/ticked?${query.toString()}`, { method: "PATCH" })
+ const body = await response.text()
+ if (!response.ok) {
+ error(body)
+ throw new Error(`error setting tick for track ${track.id} ("${track.name}"): ${response.status} ${response.statusText}`)
+ }
+ return JSON.parse(body)
+ }
+ async taskMarkedIncomplete(track: Track, date: Date) {
+ const query = dateQuery(date)
+ const { ok, status, statusText } = await fetch(`/api/v1/tracks/${track.id}/all-ticks?${query.toString()}`, { method: 'DELETE' })
+ if (!ok)
+ error(`error deleting ticks for ${track.id}: ${statusText} (${status})`)
+ }
+ async addTrack(track: Track): Promise {
+ const response = await fetch('/api/v1/tracks', {
+ method: "POST",
+ body: JSON.stringify(track),
+ headers: { "Content-Type": "application/json" }
+ })
+ if (!response.ok)
+ error(`error submitting track: ${track}: ${response.statusText} (${response.status})`)
+ return response.ok
+ }
+ async removeTrack(trackID: number) {
+ const response = await fetch(`/api/v1/tracks/${trackID}`, { method: "DELETE" })
+ if (!response.ok) error(`error deleting track with ID ${trackID}: ${response.statusText} (${response.status})`)
+ }
async logOut() {
const result = await fetch('/api/v1/auth', {method: 'DELETE'})
if(!result.ok) return error('failed to log out')
diff --git a/client/src/track.ts b/client/src/track.ts
index f7525ad..9893eca 100644
--- a/client/src/track.ts
+++ b/client/src/track.ts
@@ -1,6 +1,5 @@
import { error } from "./error"
import { Tick, ITick } from './ticks'
-import { dateQuery } from "./util"
export interface ITrack {
id?: number
@@ -49,34 +48,6 @@ export class Track implements ITrack {
this.fetchTicks = this.fetchTicks.bind(this)
}
- /**
- * Add this track to the database. A `TrackAdded` event should have been
- * received from the server on the event stream by the time this returns.
- *
- * @returns whether or not the query succeeded
- */
- async create(): Promise {
- // note that this.id is expected to be `undefined` here.
- const response = await fetch('/api/v1/tracks', {
- method: "POST",
- body: JSON.stringify(this),
- headers: { "Content-Type": "application/json" }
- })
- if (!response.ok)
- error(`error submitting track ${this.name}: ${response.statusText} (${response.status})`)
- return response.ok
- }
-
- async delete() {
- const id = this.id
- if (id) await Track.deleteById(id)
- }
-
- static async deleteById(id: number) {
- const response = await fetch(`/api/v1/tracks/${id}`, { method: "DELETE" })
- if (!response.ok) error(`error deleting track with ID ${id}: ${response.statusText} (${response.status})`)
- }
-
static fromJSON(track: ITrack): Track {
return new Track(track.id, track.name, track.description, track.icon, track.enabled, track.multiple_entries_per_day, track.color, track.order)
}
@@ -127,36 +98,4 @@ export class Track implements ITrack {
}
return []
}
- /**
- * Mark this track as being completed on the given date. A `TickAdded` event
- * should have been received from the server on the event stream by the time
- * this returns.
- *
- * @param date the date the task was completed
- * @returns the decoded server API response
- */
- async markComplete(date: Date) {
- const query = dateQuery(date)
- const response: Response = await fetch(`/api/v1/tracks/${this.id}/ticked?${query.toString()}`, { method: "PATCH" })
- const body = await response.text()
- if (!response.ok) {
- error(body)
- throw new Error(`error setting tick for track ${this.id} ("${this.name}"): ${response.status} ${response.statusText}`)
- }
- return JSON.parse(body)
- }
- /**
- * Mark this track as being incomplete on the given date. A `TickAdded` event
- * should have been received from the server on the event stream by the time
- * this returns.
- *
- * @param date the date the task was completed
- * @returns the decoded server API response
- */
- async markIncomplete(date: Date) {
- const query = dateQuery(date)
- const { ok, status, statusText } = await fetch(`/api/v1/tracks/${this.id}/all-ticks?${query.toString()}`, { method: 'DELETE' })
- if (!ok)
- error(`error deleting ticks for ${this.id}: ${statusText} (${status})`)
- }
}
diff --git a/client/src/util.ts b/client/src/util.ts
index 023079c..ebbda1c 100644
--- a/client/src/util.ts
+++ b/client/src/util.ts
@@ -5,13 +5,4 @@ export function getCookie(key: string): string | null {
if(end === -1)
end = undefined
return document.cookie.substring(start + key.length + 1, end)
-}
-
-export function dateQuery(date: Date): URLSearchParams {
- let query = new URLSearchParams()
- query.set("year", date.getUTCFullYear().toString())
- query.set("month", (date.getUTCMonth() + 1).toString())
- // good thing I still had this ^^^^^^^^^^^^^^ in mind when I wrote this 😬
- query.set("day", date.getUTCDate().toString())
- return query
-}
+}
\ No newline at end of file
diff --git a/client/src/views/NewTrackView.vue b/client/src/views/NewTrackView.vue
index a15e26a..8b2ed62 100644
--- a/client/src/views/NewTrackView.vue
+++ b/client/src/views/NewTrackView.vue
@@ -2,6 +2,7 @@
import { RouterLink, useRouter } from 'vue-router';
import { Track } from '../track';
import { computed, ref } from 'vue';
+import { state } from '../state';
const props = defineProps<{ initialState?: Track }>()
const router = useRouter()
@@ -25,7 +26,7 @@ const submit = async () => {
const track = new Track(undefined, name.value, description.value,
icon.value, Number(enabled.value), Number(multipleEntriesPerDay.value),
color.value, order.value)
- if (await track.create())
+ if (await state.addTrack(track))
router.push('/')
}