@@ -85,11 +89,14 @@
diff --git a/src/data/DataType.enum.ts b/src/data/DataType.enum.ts
index a8258f6..dd99f09 100644
--- a/src/data/DataType.enum.ts
+++ b/src/data/DataType.enum.ts
@@ -1 +1,3 @@
-export enum DataType {}
+export enum DataType {
+ GithubAccessToken = 'GithubAccessToken'
+}
diff --git a/src/data/data.ts b/src/data/data.ts
index 7355ea3..1bb49ef 100644
--- a/src/data/data.ts
+++ b/src/data/data.ts
@@ -1,7 +1,8 @@
-import PouchDb from 'pouchdb-browser'
-import { Model } from './models/Model'
-import indexedDb from 'pouchdb-adapter-indexeddb'
import { DataType } from './DataType.enum'
+import { Model } from './models/Model'
+import PouchDb from 'pouchdb-browser'
+import indexedDb from 'pouchdb-adapter-indexeddb'
+import { nanoid } from 'nanoid'
PouchDb.plugin(indexedDb)
@@ -20,7 +21,9 @@ class Data {
try {
const result = await this.locale.put(model)
return result.ok
- } catch {
+ } catch (error) {
+ console.warn(error)
+
return false
}
}
@@ -65,6 +68,10 @@ class Data {
return response.rows.map((row) => row.doc) as T[]
}
+
+ public generateId(type: DataType, id?: string) {
+ return `${type}-${id || nanoid()}`
+ }
}
export const data = new Data()
diff --git a/src/data/models/GithubAccessToken.ts b/src/data/models/GithubAccessToken.ts
new file mode 100644
index 0000000..d58931b
--- /dev/null
+++ b/src/data/models/GithubAccessToken.ts
@@ -0,0 +1,7 @@
+import { DataType } from '@/data/DataType.enum'
+import { Model } from '@/data/models/Model'
+
+export interface GithubAccessToken extends Model {
+ username: string
+ personalAccessToken: string
+}
diff --git a/src/hooks/useGitHubLogin.hook.ts b/src/hooks/useGitHubLogin.hook.ts
new file mode 100644
index 0000000..51dff9c
--- /dev/null
+++ b/src/hooks/useGitHubLogin.hook.ts
@@ -0,0 +1,52 @@
+import { computed, ref } from 'vue'
+
+import { DataType } from '@/data/DataType.enum'
+import { GithubAccessToken } from '@/data/models/GithubAccessToken'
+import { data } from '@/data/data'
+
+const personalAccessTokenId = 'PAT'
+const username = ref(null)
+const accessToken = ref(null)
+
+let init = true
+
+export const useGitHubLogin = () => {
+ const getAccessToken = async () => {
+ const response = await data.get<
+ DataType.GithubAccessToken,
+ GithubAccessToken
+ >(data.generateId(DataType.GithubAccessToken, personalAccessTokenId))
+ username.value = response?.username || ''
+ accessToken.value = response?.personalAccessToken || ''
+
+ return response
+ }
+
+ if (init) {
+ init = false
+ getAccessToken()
+ }
+
+ const saveCredentials = async (username: string, token: string) => {
+ const actualPAT = await getAccessToken()
+
+ const personalAccessToken: GithubAccessToken = {
+ ...actualPAT,
+ _id: data.generateId(DataType.GithubAccessToken, personalAccessTokenId),
+ $type: DataType.GithubAccessToken,
+ username,
+ personalAccessToken: token
+ }
+
+ await data.add(personalAccessToken)
+ getAccessToken()
+ }
+
+ return {
+ isLogged: !!username.value && !!accessToken.value,
+ isReady: computed(() => accessToken.value !== null),
+ username,
+ accessToken,
+ saveCredentials
+ }
+}
diff --git a/src/hooks/useQueryStackedNotes.hook.ts b/src/hooks/useQueryStackedNotes.hook.ts
index 45a5933..a3c358b 100644
--- a/src/hooks/useQueryStackedNotes.hook.ts
+++ b/src/hooks/useQueryStackedNotes.hook.ts
@@ -10,13 +10,12 @@ export const useQueryStackedNotes = () => {
const { query } = useRoute()
if (initial) {
initial = false
- stackedNotes.value = Array.isArray(query.stackedNotes)
- ? (query.stackedNotes
- .map((n) => n?.toString())
- .filter((n) => !!n) as string[])
- : ([query.stackedNotes]
- .map((n) => n?.toString())
- .filter((n) => !!n) as string[])
+ stackedNotes.value = (Array.isArray(query.stackedNotes)
+ ? query.stackedNotes
+ : [query.stackedNotes]
+ )
+ .map((n) => n?.toString())
+ .filter((n) => !!n) as string[]
}
return {
diff --git a/src/hooks/useRepo.hook.ts b/src/hooks/useRepo.hook.ts
index 8fb4001..e2f8f09 100644
--- a/src/hooks/useRepo.hook.ts
+++ b/src/hooks/useRepo.hook.ts
@@ -1,6 +1,7 @@
import { Ref, onMounted, ref, watch } from '@vue/runtime-core'
-import { request } from '@octokit/request'
+import { Octokit } from '@octokit/rest'
+import { useGitHubLogin } from '@/hooks/useGitHubLogin.hook'
import { useMarkdown } from '@/hooks/useMarkdown.hook'
interface Tree {
@@ -13,6 +14,12 @@ interface Tree {
}
export const useRepo = (owner: Ref, repo: Ref) => {
+ const { accessToken } = useGitHubLogin()
+
+ const octokit = new Octokit({
+ auth: accessToken.value
+ })
+
const { render } = useMarkdown()
const readme = ref(null)
const notFound = ref(false)
@@ -24,19 +31,22 @@ export const useRepo = (owner: Ref, repo: Ref) => {
}
try {
- const README = await request('GET /repos/{owner}/{repo}/readme', {
- repo: repo.value,
- owner: owner.value
+ const README = await octokit.repos.getReadme({
+ owner: owner.value,
+ repo: repo.value
})
if (README) {
readme.value = render(README.data.content)
}
- const commits = await request('GET /repos/{owner}/{repo}/commits', {
- repo: repo.value,
- owner: owner.value
- })
+ const commits = await octokit.request(
+ 'GET /repos/{owner}/{repo}/commits',
+ {
+ repo: repo.value,
+ owner: owner.value
+ }
+ )
const lastCommit = commits.data.shift()
@@ -44,7 +54,7 @@ export const useRepo = (owner: Ref, repo: Ref) => {
return
}
- const treeResponse = await request(
+ const treeResponse = await octokit.request(
'GET /repos/{owner}/{repo}/git/trees/{tree_sha}',
{
repo: repo.value,
diff --git a/src/hooks/useRepos.hook.ts b/src/hooks/useRepos.hook.ts
new file mode 100644
index 0000000..4aa28ac
--- /dev/null
+++ b/src/hooks/useRepos.hook.ts
@@ -0,0 +1,28 @@
+import { Octokit } from '@octokit/rest'
+import { useAsyncState } from '@vueuse/core'
+import { useGitHubLogin } from '@/hooks/useGitHubLogin.hook'
+
+export const useRepos = () => {
+ const { username, accessToken } = useGitHubLogin()
+ const repos = useAsyncState(async () => {
+ if (!accessToken.value || !username.value) {
+ return []
+ }
+
+ const octokit = new Octokit({
+ auth: accessToken.value
+ })
+
+ const repoList = await octokit.request('GET /search/repositories', {
+ q: `user:${username.value}`,
+ per_page: 100
+ })
+
+ return repoList.data.items.map((item) => item.name)
+ }, [])
+
+ return {
+ repos: repos.state,
+ isReady: repos.isReady
+ }
+}
diff --git a/src/router/router.ts b/src/router/router.ts
index 61f326c..671d4af 100644
--- a/src/router/router.ts
+++ b/src/router/router.ts
@@ -9,6 +9,17 @@ const routes: Array = [
component: () =>
import(/* webpackChunkName: "text-editor" */ '@/views/TextEditor.vue')
},
+ {
+ path: '/login',
+ name: 'Login',
+ component: () => import(/* webpackChunkName: "login" */ '@/views/Login.vue')
+ },
+ {
+ path: '/repo-list',
+ name: 'RepoList',
+ component: () =>
+ import(/* webpackChunkName: "repo-list" */ '@/views/RepoList.vue')
+ },
{
path: '/:user?/:repo?',
name: 'Home',
diff --git a/src/views/Home.vue b/src/views/Home.vue
index 3d1f1a4..b17b361 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -3,11 +3,8 @@
-
-
-
- Not found.
-
+
+ Not found.
diff --git a/src/views/Login.vue b/src/views/Login.vue
new file mode 100644
index 0000000..4b0318f
--- /dev/null
+++ b/src/views/Login.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/RepoList.vue b/src/views/RepoList.vue
new file mode 100644
index 0000000..918fdeb
--- /dev/null
+++ b/src/views/RepoList.vue
@@ -0,0 +1,40 @@
+
+
+
Repositories
+
loading...
+
+
+
+
+
+
+