diff --git a/src/assets/icons/saved.svg b/src/assets/icons/saved.svg new file mode 100644 index 0000000..c2d6ae5 --- /dev/null +++ b/src/assets/icons/saved.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/components/StackedNote.vue b/src/components/StackedNote.vue index dcaec55..1cb7877 100644 --- a/src/components/StackedNote.vue +++ b/src/components/StackedNote.vue @@ -12,6 +12,12 @@ {{ title }} + offline ready
@@ -33,7 +39,7 @@ export default defineComponent({ sha: { type: String, required: true } }, setup(props) { - const { content } = useFile(props.user, props.repo, props.sha) + const { content, fromCache } = useFile(props.user, props.repo, props.sha) const { listenToClick } = useLinks('stacked-note', props.sha) const { scrollToFocusedNote } = useFocus() const className = computed(() => `stacked-note-${props.index}`) @@ -51,6 +57,7 @@ export default defineComponent({ return { content, + fromCache, titleClassName, className, displayNoteOverlay, @@ -77,6 +84,12 @@ $border-color: rgba(18, 19, 58, 0.2); } } +.offline-ready { + position: absolute; + top: 1rem; + right: 1rem; +} + .title-stacked-note { position: sticky; top: 0; diff --git a/src/data/DataType.enum.ts b/src/data/DataType.enum.ts index 773f872..3f1e5c2 100644 --- a/src/data/DataType.enum.ts +++ b/src/data/DataType.enum.ts @@ -1,4 +1,5 @@ export enum DataType { GithubAccessToken = 'GithubAccessToken', - FavoriteRepo = 'FavoriteRepo' + FavoriteRepo = 'FavoriteRepo', + Note = 'Note' } diff --git a/src/hooks/useFile.hook.ts b/src/hooks/useFile.hook.ts index 03e5806..c5eb522 100644 --- a/src/hooks/useFile.hook.ts +++ b/src/hooks/useFile.hook.ts @@ -1,11 +1,13 @@ import { ref } from 'vue' -import { request } from '@octokit/request' import { useMarkdown } from '@/hooks/useMarkdown.hook' import { useGitHubLogin } from '@/hooks/useGitHubLogin.hook' import { Octokit } from '@octokit/rest' +import { useNoteCache } from '@/modules/note/hooks/useNoteCache' export const useFile = (owner: string, repo: string, sha: string) => { + const { getCachedNote, saveCacheNote } = useNoteCache(sha) const { accessToken } = useGitHubLogin() + const fromCache = ref(false) const octokit = new Octokit({ auth: accessToken.value @@ -15,6 +17,15 @@ export const useFile = (owner: string, repo: string, sha: string) => { const getContent = async () => { const { render } = useMarkdown() + const cachedNote = await getCachedNote() + + fromCache.value = !!cachedNote + + if (cachedNote) { + content.value = render(cachedNote.content) + return + } + const file = await octokit.request( 'GET /repos/{owner}/{repo}/git/blobs/{file_sha}', { @@ -27,12 +38,15 @@ export const useFile = (owner: string, repo: string, sha: string) => { if (!file) { return } + + saveCacheNote(file.data.content) content.value = render(file.data.content) } getContent() return { - content + content, + fromCache } } diff --git a/src/hooks/useRepos.hook.ts b/src/hooks/useRepos.hook.ts index 5ccdbe0..cbbc643 100644 --- a/src/hooks/useRepos.hook.ts +++ b/src/hooks/useRepos.hook.ts @@ -1,5 +1,5 @@ import { Octokit } from '@octokit/rest' -import { RepoBase } from '@/modules/interfaces/RepoBase' +import { RepoBase } from '@/modules/repo/interfaces/RepoBase' import { useAsyncState } from '@vueuse/core' import { useGitHubLogin } from '@/hooks/useGitHubLogin.hook' diff --git a/src/modules/note/hooks/useNoteCache.ts b/src/modules/note/hooks/useNoteCache.ts new file mode 100644 index 0000000..fad2d05 --- /dev/null +++ b/src/modules/note/hooks/useNoteCache.ts @@ -0,0 +1,31 @@ +import { data } from '@/data/data' +import { DataType } from '@/data/DataType.enum' +import { Note } from '@/modules/note/models/Note' +import { useAsyncState } from '@vueuse/core' +import { computed } from 'vue' + +export const useNoteCache = (sha: string) => { + const noteId = computed(() => data.generateId(DataType.Note, sha)) + const getCachedNote = async () => data.get(noteId.value) + + const cachedNote = useAsyncState(getCachedNote, null) + + const saveCacheNote = async (content: string) => { + const newNote: Note = { + _id: noteId.value, + $type: DataType.Note, + content + } + + await data.update(newNote) + + await cachedNote.execute() + } + + return { + cachedNote: cachedNote.state, + isReady: cachedNote.isReady, + getCachedNote, + saveCacheNote + } +} diff --git a/src/modules/note/models/Note.ts b/src/modules/note/models/Note.ts new file mode 100644 index 0000000..9f80879 --- /dev/null +++ b/src/modules/note/models/Note.ts @@ -0,0 +1,6 @@ +import { DataType } from '@/data/DataType.enum' +import { Model } from '@/data/models/Model' + +export interface Note extends Model { + content: string +} diff --git a/src/modules/repo/hooks/useFavoriteRepos.hook.ts b/src/modules/repo/hooks/useFavoriteRepos.hook.ts index b831887..2db247e 100644 --- a/src/modules/repo/hooks/useFavoriteRepos.hook.ts +++ b/src/modules/repo/hooks/useFavoriteRepos.hook.ts @@ -1,8 +1,8 @@ import { computed, onMounted, ref } from 'vue' import { DataType } from '@/data/DataType.enum' -import { FavoriteRepo } from '@/modules/models/FavoriteRepo' -import { RepoBase } from '@/modules/interfaces/RepoBase' +import { FavoriteRepo } from '@/modules/repo/models/FavoriteRepo' +import { RepoBase } from '@/modules/repo/interfaces/RepoBase' import { data } from '@/data/data' import { useRepos } from '@/hooks/useRepos.hook' diff --git a/src/modules/repo/hooks/userRepoList.hook.ts b/src/modules/repo/hooks/useRepoList.hook.ts similarity index 94% rename from src/modules/repo/hooks/userRepoList.hook.ts rename to src/modules/repo/hooks/useRepoList.hook.ts index 9f839b8..0f0e909 100644 --- a/src/modules/repo/hooks/userRepoList.hook.ts +++ b/src/modules/repo/hooks/useRepoList.hook.ts @@ -1,4 +1,4 @@ -import { RepoBase } from '@/modules/interfaces/RepoBase' +import { RepoBase } from '@/modules/repo/interfaces/RepoBase' import { computed } from 'vue' import { useFavoriteRepos } from '@/modules/repo/hooks/useFavoriteRepos.hook' import { useRepos } from '@/hooks/useRepos.hook' diff --git a/src/modules/interfaces/RepoBase.ts b/src/modules/repo/interfaces/RepoBase.ts similarity index 100% rename from src/modules/interfaces/RepoBase.ts rename to src/modules/repo/interfaces/RepoBase.ts diff --git a/src/modules/models/FavoriteRepo.ts b/src/modules/repo/models/FavoriteRepo.ts similarity index 100% rename from src/modules/models/FavoriteRepo.ts rename to src/modules/repo/models/FavoriteRepo.ts diff --git a/src/views/RepoList.vue b/src/views/RepoList.vue index 9cc3402..f8303e9 100644 --- a/src/views/RepoList.vue +++ b/src/views/RepoList.vue @@ -81,7 +81,7 @@