From 17178bbe63b44cfe270ca4507ef41ddecc848104 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sun, 27 Jun 2021 20:11:57 +0200 Subject: [PATCH] :sparkles: (card) add repetition card in database --- src/data/DataType.enum.ts | 3 +- src/modules/card/components/FlipCard.vue | 16 +++---- .../card/hooks/useSpacedRepetitionCards.ts | 46 +++++++++++++++++-- src/modules/card/models/RepetitionCard.ts | 7 +++ src/views/SpacedRepetitionCard.vue | 9 ++-- 5 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 src/modules/card/models/RepetitionCard.ts diff --git a/src/data/DataType.enum.ts b/src/data/DataType.enum.ts index a3e4f6c..4f4af0d 100644 --- a/src/data/DataType.enum.ts +++ b/src/data/DataType.enum.ts @@ -2,5 +2,6 @@ export enum DataType { GithubAccessToken = 'GithubAccessToken', FavoriteRepo = 'FavoriteRepo', Note = 'Note', - BacklinkNote = 'BacklinkNote' + BacklinkNote = 'BacklinkNote', + RepetitionCard = 'RepetitionCard' } diff --git a/src/modules/card/components/FlipCard.vue b/src/modules/card/components/FlipCard.vue index 1c43d7a..1de1167 100644 --- a/src/modules/card/components/FlipCard.vue +++ b/src/modules/card/components/FlipCard.vue @@ -8,8 +8,8 @@

-
failed
-
got it
+
failed
+
got it
@@ -25,15 +25,15 @@ export default defineComponent({ props: { card: { type: Object as PropType, required: true } }, - setup() { + setup(_, context) { const flipped = ref(false) - const flip = () => (flipped.value = !flipped.value) - const action = () => { - console.log('action') - } - return { flip, flipped, action } + const success = () => context.emit('success') + + const fail = () => context.emit('fail') + + return { flip, flipped, success, fail } } }) diff --git a/src/modules/card/hooks/useSpacedRepetitionCards.ts b/src/modules/card/hooks/useSpacedRepetitionCards.ts index 0775b65..e5fc42d 100644 --- a/src/modules/card/hooks/useSpacedRepetitionCards.ts +++ b/src/modules/card/hooks/useSpacedRepetitionCards.ts @@ -1,11 +1,20 @@ +import { data } from '@/data/data' +import { DataType } from '@/data/DataType.enum' import { useFile } from '@/hooks/useFile.hook' import { useLinks } from '@/hooks/useLinks.hook' import { useMarkdown } from '@/hooks/useMarkdown.hook' import { Card } from '@/modules/card/models/Card' +import { RepetitionCard } from '@/modules/card/models/RepetitionCard' import { useUserRepoStore } from '@/modules/repo/store/userRepo.store' import { asyncComputed } from '@vueuse/core' +import { isAfter, isBefore } from 'date-fns' import { computed, nextTick, watch } from 'vue' +interface Repetition { + repetition: RepetitionCard + card: Card +} + export const useSpacedRepetitionCards = () => { const { renderString } = useMarkdown() const store = useUserRepoStore() @@ -18,13 +27,39 @@ export const useSpacedRepetitionCards = () => { ) const cards = asyncComputed(async () => { - const cards: Card[] = [] + const cards: Repetition[] = [] for (const cardFile of cardFiles.value) { if (!cardFile.sha) { continue } + const repetitionId = data.generateId( + DataType.RepetitionCard, + cardFile.sha + ) + + let repetition = await data.get( + repetitionId + ) + + if (!repetition) { + const newRepetition: RepetitionCard = { + _id: repetitionId, + $type: DataType.RepetitionCard, + level: 1, + repeatDate: new Date() + } + await data.add(newRepetition) + repetition = (await data.get( + repetitionId + )) as RepetitionCard + } + + if (isAfter(new Date(repetition.repeatDate), new Date())) { + continue + } + const { getRawContent } = useFile(cardFile.sha, false) const content = await getRawContent() @@ -32,9 +67,12 @@ export const useSpacedRepetitionCards = () => { decodeURIComponent(escape(atob(content ?? '')))?.split('___') ?? [] cards.push({ - front: renderString(front), - back: renderString(back), - references: renderString(references) + repetition, + card: { + front: renderString(front), + back: renderString(back), + references: renderString(references) + } }) } diff --git a/src/modules/card/models/RepetitionCard.ts b/src/modules/card/models/RepetitionCard.ts new file mode 100644 index 0000000..1dd49f5 --- /dev/null +++ b/src/modules/card/models/RepetitionCard.ts @@ -0,0 +1,7 @@ +import { DataType } from '@/data/DataType.enum' +import { Model } from '@/data/models/Model' + +export interface RepetitionCard extends Model { + level: number + repeatDate: Date +} diff --git a/src/views/SpacedRepetitionCard.vue b/src/views/SpacedRepetitionCard.vue index c022944..7284524 100644 --- a/src/views/SpacedRepetitionCard.vue +++ b/src/views/SpacedRepetitionCard.vue @@ -6,7 +6,10 @@ :repo="repo" :with-content="false" > - +
+

Level: {{ firstCard.repetition.level }}

+ +
No cards to review!
@@ -31,8 +34,8 @@ export default defineComponent({ setup() { const { cards } = useSpacedRepetitionCards() const firstCard = computed(() => { - const [firstCard] = cards.value - return firstCard + const [repetitionCard] = cards.value + return repetitionCard }) return {