From 2faabb6c0e6ddc8cbaec2f04012fbedc65d859da Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Wed, 17 Mar 2021 23:25:58 +0100 Subject: [PATCH] :sparkles: (login) save login --- src/App.vue | 10 ++++- src/components/WelcomeWorld.vue | 9 +++- src/data/DataType.enum.ts | 4 +- src/data/data.ts | 15 +++++-- src/data/models/GithubAccessToken.ts | 7 +++ src/hooks/useGitHubLogin.hook.ts | 52 ++++++++++++++++++++++ src/hooks/useQueryStackedNotes.hook.ts | 13 +++--- src/hooks/useRepo.hook.ts | 28 ++++++++---- src/hooks/useRepos.hook.ts | 28 ++++++++++++ src/router/router.ts | 11 +++++ src/views/Home.vue | 7 +-- src/views/Login.vue | 60 ++++++++++++++++++++++++++ src/views/RepoList.vue | 40 +++++++++++++++++ 13 files changed, 255 insertions(+), 29 deletions(-) create mode 100644 src/data/models/GithubAccessToken.ts create mode 100644 src/hooks/useGitHubLogin.hook.ts create mode 100644 src/hooks/useRepos.hook.ts create mode 100644 src/views/Login.vue create mode 100644 src/views/RepoList.vue diff --git a/src/App.vue b/src/App.vue index 6f02bbe..9b0b7c6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,12 +1,18 @@ diff --git a/src/components/WelcomeWorld.vue b/src/components/WelcomeWorld.vue index 783aff3..f99e823 100644 --- a/src/components/WelcomeWorld.vue +++ b/src/components/WelcomeWorld.vue @@ -18,6 +18,10 @@ + go to repos +
@@ -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 @@ + + + + +