feat: implement elk permalinks (#229)

zio/stable
Daniel Roe 2022-11-29 20:51:52 +00:00 committed by GitHub
parent 26f2dec6b6
commit 6efd3c8b55
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 63 additions and 8 deletions

View File

@ -76,8 +76,10 @@ const toggleTranslation = async () => {
isLoading.translation = false
}
const copyLink = async (url: string) => {
await clipboard.copy(url)
const copyLink = async (status: Status) => {
const url = getStatusPermalink(status)
if (url)
await clipboard.copy(`${location.origin}${url}`)
}
const deleteStatus = async () => {
// TODO confirm to delete
@ -194,7 +196,7 @@ function editStatus() {
text="Copy link to this post"
icon="i-ri:link"
:command="command"
@click="copyLink(status.url)"
@click="copyLink(status)"
/>
<NuxtLink :to="status.url" target="_blank">

View File

@ -1,8 +1,11 @@
<template>
<div p8 flex="~ col gap4">
<div text-sm text-secondary>
<p text-sm>
Viewing <strong>{{ currentServer }}</strong> public data
</p>
<p text-sm text-secondary>
{{ $t('nav_user.sign_in_desc') }}
</div>
</p>
<button class="btn-solid text-center" @click="openSigninDialog()">
{{ $t('action.sign_in') }}
</button>

View File

@ -1,5 +1,6 @@
import type { Ref } from 'vue'
import type { Account, Relationship, Status } from 'masto'
import { withoutProtocol } from 'ufo'
// @unocss-include
export const STATUS_VISIBILITIES = [
@ -71,6 +72,10 @@ export function getStatusPath(status: Status) {
return `/${getFullHandle(status.account)}/${status.id}`
}
export function getStatusPermalink(status: Status) {
return status.url ? `/${withoutProtocol(status.url)}` : null
}
export function getStatusInReplyToPath(status: Status) {
return `/status/${status.inReplyToId}`
}

View File

@ -20,7 +20,8 @@ export const currentUser = computed<UserLogin | undefined>(() => {
return users.value[0]
})
export const currentServer = computed<string>(() => currentUser.value?.server || DEFAULT_SERVER)
export const publicServer = ref(DEFAULT_SERVER)
export const currentServer = computed<string>(() => currentUser.value?.server || publicServer.value)
export const useUsers = () => users
@ -40,7 +41,11 @@ export async function loginTo(user?: Omit<UserLogin, 'account'> & { account?: Ac
accessToken: user?.token,
})
if (user?.token) {
if (!user?.token) {
publicServer.value = user?.server || DEFAULT_SERVER
}
else {
try {
const me = await masto.accounts.verifyCredentials()
user.account = me

View File

@ -0,0 +1,40 @@
<script setup lang="ts">
import { parseURL } from 'ufo'
definePageMeta({
middleware: async (to) => {
let permalink = Array.isArray(to.params.permalink)
? to.params.permalink.join('/')
: to.params.permalink
if (!permalink.startsWith('http'))
permalink = `https://${permalink}`
if (!currentUser.value) {
const { host, pathname } = parseURL(permalink)
await loginTo({ server: host! })
return pathname
}
const { value } = await useMasto().search({ q: permalink, resolve: true, limit: 1 }).next()
const { accounts, statuses } = value
if (statuses[0]) {
return {
path: getStatusPath(statuses[0]),
state: {
status: statuses[0] as any,
},
}
}
if (accounts[0])
return getAccountPath(accounts[0])
return '/home'
},
})
</script>
<template>
<div />
</template>

View File

@ -12,7 +12,7 @@ export interface AppInfo {
export interface UserLogin {
server: string
token: string
token?: string
account: AccountCredentials
}