✨ (fleeting notes) init fleeting notes
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flux-note content note-container">
|
<div class="flux-note content note-container">
|
||||||
<div class="note readme">
|
<div class="note readme">
|
||||||
<header-note class="header" />
|
<header-note class="header" :user="user" :repo="repo" />
|
||||||
<slot>
|
|
||||||
<div class="repo-title">
|
<div class="repo-title">
|
||||||
<h1 class="title is-1">
|
<h1 class="title is-1">
|
||||||
[<router-link
|
[<router-link
|
||||||
@@ -15,8 +14,8 @@
|
|||||||
<em>{{ user }}</em>
|
<em>{{ user }}</em>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<p class="note-display" v-html="readme"></p>
|
<slot />
|
||||||
</slot>
|
<p class="note-display" v-html="renderedContent ?? readme"></p>
|
||||||
</div>
|
</div>
|
||||||
<stacked-note
|
<stacked-note
|
||||||
class="note"
|
class="note"
|
||||||
@@ -33,9 +32,18 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { useQueryStackedNotes } from '@/hooks/useQueryStackedNotes.hook'
|
import { useQueryStackedNotes } from '@/hooks/useQueryStackedNotes.hook'
|
||||||
import { defineComponent, defineAsyncComponent, toRefs } from 'vue'
|
import {
|
||||||
|
defineComponent,
|
||||||
|
defineAsyncComponent,
|
||||||
|
toRefs,
|
||||||
|
computed,
|
||||||
|
watch,
|
||||||
|
nextTick
|
||||||
|
} from 'vue'
|
||||||
import HeaderNote from '@/components/HeaderNote.vue'
|
import HeaderNote from '@/components/HeaderNote.vue'
|
||||||
import { useNote } from '@/hooks/useNote.hook'
|
import { useNote } from '@/hooks/useNote.hook'
|
||||||
|
import { useMarkdown } from '@/hooks/useMarkdown.hook'
|
||||||
|
import { useLinks } from '@/hooks/useLinks.hook'
|
||||||
|
|
||||||
const StackedNote = defineAsyncComponent(() =>
|
const StackedNote = defineAsyncComponent(() =>
|
||||||
import('@/components/StackedNote.vue')
|
import('@/components/StackedNote.vue')
|
||||||
@@ -48,14 +56,24 @@ export default defineComponent({
|
|||||||
StackedNote
|
StackedNote
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
user: { type: String, required: false, default: '' },
|
user: { type: String, required: true },
|
||||||
repo: { type: String, required: false, default: '' }
|
repo: { type: String, required: true },
|
||||||
|
content: { type: String, required: false, default: null }
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
|
const { renderString } = useMarkdown()
|
||||||
const refProps = toRefs(props)
|
const refProps = toRefs(props)
|
||||||
|
const { listenToClick } = useLinks('note-display')
|
||||||
const { stackedNotes, resetStackedNotes } = useQueryStackedNotes()
|
const { stackedNotes, resetStackedNotes } = useQueryStackedNotes()
|
||||||
|
|
||||||
|
const renderedContent = computed(() =>
|
||||||
|
props.content !== null ? renderString(props.content) : null
|
||||||
|
)
|
||||||
|
|
||||||
|
watch(renderedContent, () => nextTick(() => listenToClick()))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
renderedContent,
|
||||||
stackedNotes,
|
stackedNotes,
|
||||||
resetStackedNotes,
|
resetStackedNotes,
|
||||||
...useNote('note-container', refProps.user, refProps.repo)
|
...useNote('note-container', refProps.user, refProps.repo)
|
||||||
@@ -68,6 +86,9 @@ export default defineComponent({
|
|||||||
$header-height: 40px;
|
$header-height: 40px;
|
||||||
|
|
||||||
.flux-note {
|
.flux-note {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
height: $header-height;
|
height: $header-height;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
<router-link :to="{ name: 'Home' }">
|
<router-link :to="{ name: 'Home' }">
|
||||||
<img src="@/assets/icons/dark-left-arrow.svg" alt="go back left arrow" />
|
<img src="@/assets/icons/dark-left-arrow.svg" alt="go back left arrow" />
|
||||||
</router-link>
|
</router-link>
|
||||||
|
<router-link :to="{ name: 'FleetingNotes', params: { user, repo } }">
|
||||||
|
Fleeting notes
|
||||||
|
</router-link>
|
||||||
</header>
|
</header>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -10,12 +13,20 @@
|
|||||||
import { defineComponent } from 'vue'
|
import { defineComponent } from 'vue'
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'HeaderNote'
|
name: 'HeaderNote',
|
||||||
|
props: {
|
||||||
|
user: { type: String, required: true },
|
||||||
|
repo: { type: String, required: true }
|
||||||
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.header-note {
|
.header-note {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
img:hover {
|
img:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ const md = new MarkdownIt().use(markdownItClass, {
|
|||||||
|
|
||||||
export const useMarkdown = () => {
|
export const useMarkdown = () => {
|
||||||
return {
|
return {
|
||||||
|
renderString: (content: string) => md.render(content),
|
||||||
render: (content: string) =>
|
render: (content: string) =>
|
||||||
md.render(decodeURIComponent(escape(atob(content))))
|
md.render(decodeURIComponent(escape(atob(content))))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,11 +28,10 @@ export const useNote = (
|
|||||||
user: Ref<string>,
|
user: Ref<string>,
|
||||||
repo: Ref<string>
|
repo: Ref<string>
|
||||||
) => {
|
) => {
|
||||||
const { push } = useRouter()
|
const { push, currentRoute } = useRouter()
|
||||||
const { isMobile } = useOverlay(false)
|
const { isMobile } = useOverlay(false)
|
||||||
const { scrollToFocusedNote } = useFocus()
|
const { scrollToFocusedNote } = useFocus()
|
||||||
const { stackedNotes, updateQueryStackedNotes } = useQueryStackedNotes()
|
const { stackedNotes, updateQueryStackedNotes } = useQueryStackedNotes()
|
||||||
|
|
||||||
const { readme, notFound, tree } = useRepo(user, repo)
|
const { readme, notFound, tree } = useRepo(user, repo)
|
||||||
const { listenToClick } = useLinks('note-display')
|
const { listenToClick } = useLinks('note-display')
|
||||||
|
|
||||||
@@ -102,7 +101,7 @@ export const useNote = (
|
|||||||
const newStackedNotes = getStackedNotes()
|
const newStackedNotes = getStackedNotes()
|
||||||
|
|
||||||
push({
|
push({
|
||||||
name: 'Home',
|
name: currentRoute.value.name ?? 'Home',
|
||||||
params: {
|
params: {
|
||||||
user: user.value,
|
user: user.value,
|
||||||
repo: repo.value
|
repo: repo.value
|
||||||
|
|||||||
@@ -14,19 +14,15 @@ interface Tree {
|
|||||||
url?: string
|
url?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useRepo = (
|
export const useRepo = (owner: Ref<string>, repo: Ref<string>) => {
|
||||||
owner: Ref<string>,
|
|
||||||
repo: Ref<string>,
|
|
||||||
fetchRepo = true
|
|
||||||
) => {
|
|
||||||
const { getCachedNote, saveCacheNote } = useNoteCache('README')
|
const { getCachedNote, saveCacheNote } = useNoteCache('README')
|
||||||
const { accessToken } = useGitHubLogin()
|
const { accessToken } = useGitHubLogin()
|
||||||
|
const { render } = useMarkdown()
|
||||||
|
|
||||||
const octokit = new Octokit({
|
const octokit = new Octokit({
|
||||||
auth: accessToken.value
|
auth: accessToken.value
|
||||||
})
|
})
|
||||||
|
|
||||||
const { render } = useMarkdown()
|
|
||||||
const readme = ref<string | null>(null)
|
const readme = ref<string | null>(null)
|
||||||
const notFound = ref(false)
|
const notFound = ref(false)
|
||||||
const tree = ref<Tree[]>([])
|
const tree = ref<Tree[]>([])
|
||||||
@@ -78,7 +74,6 @@ export const useRepo = (
|
|||||||
|
|
||||||
if (treeResponse) {
|
if (treeResponse) {
|
||||||
tree.value = treeResponse.data.tree.filter((t) => t.type === 'blob')
|
tree.value = treeResponse.data.tree.filter((t) => t.type === 'blob')
|
||||||
console.log(tree.value)
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (!cachedReadme) {
|
if (!cachedReadme) {
|
||||||
@@ -88,9 +83,7 @@ export const useRepo = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (fetchRepo) {
|
|
||||||
retrieveRepo()
|
retrieveRepo()
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
watch([owner, repo], () => retrieveRepo())
|
watch([owner, repo], () => retrieveRepo())
|
||||||
|
|||||||
24
src/modules/note/hooks/useFleetingNotes.ts
Normal file
24
src/modules/note/hooks/useFleetingNotes.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { useRepo } from '@/hooks/useRepo.hook'
|
||||||
|
import { computed, Ref } from 'vue'
|
||||||
|
|
||||||
|
const FLEETING_NOTES_FOLDER = 'fleeting-notes'
|
||||||
|
|
||||||
|
export const useFleetingNotes = (owner: Ref<string>, repo: Ref<string>) => {
|
||||||
|
const { tree } = useRepo(owner, repo)
|
||||||
|
|
||||||
|
const fleetingNotes = computed(() =>
|
||||||
|
tree.value.filter((file) => file.path?.startsWith(FLEETING_NOTES_FOLDER))
|
||||||
|
)
|
||||||
|
|
||||||
|
const content = computed(() =>
|
||||||
|
fleetingNotes.value.length
|
||||||
|
? fleetingNotes.value
|
||||||
|
.map((note) => `- [${note.path}](${note.path})`)
|
||||||
|
.join('\n')
|
||||||
|
: ''
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
content
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<li>header note for quick actions ⏳</li>
|
<li>header note for quick actions ⏳</li>
|
||||||
<li>offline notes</li>
|
<li>offline notes</li>
|
||||||
<li>full path resolver between notes</li>
|
<li>full path resolver between notes</li>
|
||||||
<li>draft & "note on the fly" folders</li>
|
<li>draft & fleeting notes folders</li>
|
||||||
<li>login with GitHub "Personal Access Token" tutorial</li>
|
<li>login with GitHub "Personal Access Token" tutorial</li>
|
||||||
<li>private & public notes tutorial</li>
|
<li>private & public notes tutorial</li>
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
@@ -1,20 +1,46 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="fleeting-notes"></div>
|
<div class="fleeting-notes">
|
||||||
|
<flux-note :user="user" :repo="repo" :content="content">
|
||||||
|
<h3 class="subtitle is-3">
|
||||||
|
Fleeting notes
|
||||||
|
</h3>
|
||||||
|
</flux-note>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue'
|
import { useFleetingNotes } from '@/modules/note/hooks/useFleetingNotes'
|
||||||
|
import { defineAsyncComponent, defineComponent, toRefs } from 'vue'
|
||||||
|
|
||||||
|
const FluxNote = defineAsyncComponent(() => import('@/components/FluxNote.vue'))
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'FleetingNotes',
|
name: 'FleetingNotes',
|
||||||
|
components: {
|
||||||
|
FluxNote
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
user: { type: String, required: true },
|
user: { type: String, required: true },
|
||||||
repo: { type: String, required: true }
|
repo: { type: String, required: true }
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const refProps = toRefs(props)
|
||||||
|
const { content } = useFleetingNotes(refProps.user, refProps.repo)
|
||||||
|
|
||||||
|
return {
|
||||||
|
content
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.fleeting-notes {
|
.fleeting-notes {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="home content" v-if="!user || !repo">
|
<div class="home content" v-if="!user || !repo">
|
||||||
<welcome-world />
|
<welcome-world />
|
||||||
</div>
|
</div>
|
||||||
<flux-note class="home" :user="user" :repo="repo" :key="routeKey" v-else />
|
<flux-note :user="user" :repo="repo" :key="routeKey" v-else />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
|||||||
Reference in New Issue
Block a user