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 }}
+
@@ -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 @@