mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-03-05 19:40:47 +08:00
fix: setup 迁移完成
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -296,7 +296,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
import { computed, onMounted, ref, watch } from 'vue'
|
import { computed, onMounted, ref, watch } from 'vue'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import AchievementList from '~/components/AchievementList.vue'
|
import AchievementList from '~/components/AchievementList.vue'
|
||||||
@@ -304,278 +304,242 @@ import BasePlaceholder from '~/components/BasePlaceholder.vue'
|
|||||||
import BaseTimeline from '~/components/BaseTimeline.vue'
|
import BaseTimeline from '~/components/BaseTimeline.vue'
|
||||||
import LevelProgress from '~/components/LevelProgress.vue'
|
import LevelProgress from '~/components/LevelProgress.vue'
|
||||||
import UserList from '~/components/UserList.vue'
|
import UserList from '~/components/UserList.vue'
|
||||||
import { API_BASE_URL, toast } from '~/main'
|
import { toast } from '~/main'
|
||||||
import { authState, getToken } from '~/utils/auth'
|
import { authState, getToken } from '~/utils/auth'
|
||||||
import { prevLevelExp } from '~/utils/level'
|
import { prevLevelExp } from '~/utils/level'
|
||||||
import { stripMarkdown, stripMarkdownLength } from '~/utils/markdown'
|
import { stripMarkdown, stripMarkdownLength } from '~/utils/markdown'
|
||||||
import TimeManager from '~/utils/time'
|
import TimeManager from '~/utils/time'
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
|
|
||||||
export default {
|
definePageMeta({
|
||||||
name: 'ProfileView',
|
alias: ['/users/:id/'],
|
||||||
components: { BaseTimeline, UserList, BasePlaceholder, LevelProgress, AchievementList },
|
})
|
||||||
setup() {
|
const route = useRoute()
|
||||||
definePageMeta({
|
const router = useRouter()
|
||||||
alias: ['/users/:id/'],
|
const username = route.params.id
|
||||||
})
|
|
||||||
const route = useRoute()
|
|
||||||
const router = useRouter()
|
|
||||||
const username = route.params.id
|
|
||||||
|
|
||||||
const user = ref({})
|
const user = ref({})
|
||||||
const hotPosts = ref([])
|
const hotPosts = ref([])
|
||||||
const hotReplies = ref([])
|
const hotReplies = ref([])
|
||||||
const hotTags = ref([])
|
const hotTags = ref([])
|
||||||
const timelineItems = ref([])
|
const timelineItems = ref([])
|
||||||
const followers = ref([])
|
const followers = ref([])
|
||||||
const followings = ref([])
|
const followings = ref([])
|
||||||
const medals = ref([])
|
const medals = ref([])
|
||||||
const subscribed = ref(false)
|
const subscribed = ref(false)
|
||||||
const isLoading = ref(true)
|
const isLoading = ref(true)
|
||||||
const tabLoading = ref(false)
|
const tabLoading = ref(false)
|
||||||
const selectedTab = ref(
|
const selectedTab = ref(
|
||||||
['summary', 'timeline', 'following', 'achievements'].includes(route.query.tab)
|
['summary', 'timeline', 'following', 'achievements'].includes(route.query.tab)
|
||||||
? route.query.tab
|
? route.query.tab
|
||||||
: 'summary',
|
: 'summary',
|
||||||
)
|
)
|
||||||
const followTab = ref('followers')
|
const followTab = ref('followers')
|
||||||
|
|
||||||
const levelInfo = computed(() => {
|
const levelInfo = computed(() => {
|
||||||
const exp = user.value.experience || 0
|
const exp = user.value.experience || 0
|
||||||
const currentLevel = user.value.currentLevel || 0
|
const currentLevel = user.value.currentLevel || 0
|
||||||
const nextExp = user.value.nextLevelExp || 0
|
const nextExp = user.value.nextLevelExp || 0
|
||||||
const prevExp = prevLevelExp(currentLevel)
|
const prevExp = prevLevelExp(currentLevel)
|
||||||
const total = nextExp - prevExp
|
const total = nextExp - prevExp
|
||||||
const ratio = total > 0 ? (exp - prevExp) / total : 1
|
const ratio = total > 0 ? (exp - prevExp) / total : 1
|
||||||
const percent = Math.max(0, Math.min(1, ratio)) * 100
|
const percent = Math.max(0, Math.min(1, ratio)) * 100
|
||||||
return { exp, currentLevel, nextExp, percent }
|
return { exp, currentLevel, nextExp, percent }
|
||||||
})
|
})
|
||||||
|
|
||||||
const isMine = computed(function () {
|
const isMine = computed(function () {
|
||||||
const mine = authState.username === username || String(authState.userId) === username
|
const mine = authState.username === username || String(authState.userId) === username
|
||||||
console.log(mine)
|
console.log(mine)
|
||||||
return mine
|
return mine
|
||||||
})
|
})
|
||||||
|
|
||||||
const formatDate = (d) => {
|
const formatDate = (d) => {
|
||||||
if (!d) return ''
|
if (!d) return ''
|
||||||
return TimeManager.format(d)
|
return TimeManager.format(d)
|
||||||
}
|
|
||||||
|
|
||||||
const fetchUser = async () => {
|
|
||||||
const token = getToken()
|
|
||||||
const headers = token ? { Authorization: `Bearer ${token}` } : {}
|
|
||||||
const res = await fetch(`${API_BASE_URL}/api/users/${username}`, { headers })
|
|
||||||
if (res.ok) {
|
|
||||||
const data = await res.json()
|
|
||||||
user.value = data
|
|
||||||
subscribed.value = !!data.subscribed
|
|
||||||
} else if (res.status === 404) {
|
|
||||||
router.replace('/404')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchSummary = async () => {
|
|
||||||
const postsRes = await fetch(`${API_BASE_URL}/api/users/${username}/hot-posts`)
|
|
||||||
if (postsRes.ok) {
|
|
||||||
const data = await postsRes.json()
|
|
||||||
hotPosts.value = data.map((p) => ({ icon: 'fas fa-book', post: p }))
|
|
||||||
}
|
|
||||||
|
|
||||||
const repliesRes = await fetch(`${API_BASE_URL}/api/users/${username}/hot-replies`)
|
|
||||||
if (repliesRes.ok) {
|
|
||||||
const data = await repliesRes.json()
|
|
||||||
hotReplies.value = data.map((c) => ({ icon: 'fas fa-comment', comment: c }))
|
|
||||||
}
|
|
||||||
|
|
||||||
const tagsRes = await fetch(`${API_BASE_URL}/api/users/${username}/hot-tags`)
|
|
||||||
if (tagsRes.ok) {
|
|
||||||
const data = await tagsRes.json()
|
|
||||||
hotTags.value = data.map((t) => ({ icon: 'fas fa-tag', tag: t }))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchTimeline = async () => {
|
|
||||||
const [postsRes, repliesRes, tagsRes] = await Promise.all([
|
|
||||||
fetch(`${API_BASE_URL}/api/users/${username}/posts?limit=50`),
|
|
||||||
fetch(`${API_BASE_URL}/api/users/${username}/replies?limit=50`),
|
|
||||||
fetch(`${API_BASE_URL}/api/users/${username}/tags?limit=50`),
|
|
||||||
])
|
|
||||||
const posts = postsRes.ok ? await postsRes.json() : []
|
|
||||||
const replies = repliesRes.ok ? await repliesRes.json() : []
|
|
||||||
const tags = tagsRes.ok ? await tagsRes.json() : []
|
|
||||||
const mapped = [
|
|
||||||
...posts.map((p) => ({
|
|
||||||
type: 'post',
|
|
||||||
icon: 'fas fa-book',
|
|
||||||
post: p,
|
|
||||||
createdAt: p.createdAt,
|
|
||||||
})),
|
|
||||||
...replies.map((r) => ({
|
|
||||||
type: r.parentComment ? 'reply' : 'comment',
|
|
||||||
icon: 'fas fa-comment',
|
|
||||||
comment: r,
|
|
||||||
createdAt: r.createdAt,
|
|
||||||
})),
|
|
||||||
...tags.map((t) => ({
|
|
||||||
type: 'tag',
|
|
||||||
icon: 'fas fa-tag',
|
|
||||||
tag: t,
|
|
||||||
createdAt: t.createdAt,
|
|
||||||
})),
|
|
||||||
]
|
|
||||||
mapped.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
|
|
||||||
timelineItems.value = mapped
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchFollowUsers = async () => {
|
|
||||||
const [followerRes, followingRes] = await Promise.all([
|
|
||||||
fetch(`${API_BASE_URL}/api/users/${username}/followers`),
|
|
||||||
fetch(`${API_BASE_URL}/api/users/${username}/following`),
|
|
||||||
])
|
|
||||||
followers.value = followerRes.ok ? await followerRes.json() : []
|
|
||||||
followings.value = followingRes.ok ? await followingRes.json() : []
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadSummary = async () => {
|
|
||||||
tabLoading.value = true
|
|
||||||
await fetchSummary()
|
|
||||||
tabLoading.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadTimeline = async () => {
|
|
||||||
tabLoading.value = true
|
|
||||||
await fetchTimeline()
|
|
||||||
tabLoading.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadFollow = async () => {
|
|
||||||
tabLoading.value = true
|
|
||||||
await fetchFollowUsers()
|
|
||||||
tabLoading.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchAchievements = async () => {
|
|
||||||
const res = await fetch(`${API_BASE_URL}/api/medals?userId=${user.value.id}`)
|
|
||||||
if (res.ok) {
|
|
||||||
medals.value = await res.json()
|
|
||||||
} else {
|
|
||||||
medals.value = []
|
|
||||||
toast.error('获取成就失败')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadAchievements = async () => {
|
|
||||||
tabLoading.value = true
|
|
||||||
await fetchAchievements()
|
|
||||||
tabLoading.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
const subscribeUser = async () => {
|
|
||||||
const token = getToken()
|
|
||||||
if (!token) {
|
|
||||||
toast.error('请先登录')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const res = await fetch(`${API_BASE_URL}/api/subscriptions/users/${username}`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { Authorization: `Bearer ${token}` },
|
|
||||||
})
|
|
||||||
if (res.ok) {
|
|
||||||
subscribed.value = true
|
|
||||||
toast.success('已关注')
|
|
||||||
} else {
|
|
||||||
toast.error('操作失败')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const unsubscribeUser = async () => {
|
|
||||||
const token = getToken()
|
|
||||||
if (!token) {
|
|
||||||
toast.error('请先登录')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const res = await fetch(`${API_BASE_URL}/api/subscriptions/users/${username}`, {
|
|
||||||
method: 'DELETE',
|
|
||||||
headers: { Authorization: `Bearer ${token}` },
|
|
||||||
})
|
|
||||||
if (res.ok) {
|
|
||||||
subscribed.value = false
|
|
||||||
toast.success('已取消关注')
|
|
||||||
} else {
|
|
||||||
toast.error('操作失败')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const gotoTag = (tag) => {
|
|
||||||
const value = encodeURIComponent(tag.id ?? tag.name)
|
|
||||||
router.push({ path: '/', query: { tags: value } })
|
|
||||||
}
|
|
||||||
|
|
||||||
const init = async () => {
|
|
||||||
try {
|
|
||||||
await fetchUser()
|
|
||||||
if (selectedTab.value === 'summary') {
|
|
||||||
await loadSummary()
|
|
||||||
} else if (selectedTab.value === 'timeline') {
|
|
||||||
await loadTimeline()
|
|
||||||
} else if (selectedTab.value === 'following') {
|
|
||||||
await loadFollow()
|
|
||||||
} else if (selectedTab.value === 'achievements') {
|
|
||||||
await loadAchievements()
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e)
|
|
||||||
} finally {
|
|
||||||
isLoading.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(init)
|
|
||||||
|
|
||||||
watch(selectedTab, async (val) => {
|
|
||||||
// router.replace({ query: { ...route.query, tab: val } })
|
|
||||||
if (val === 'timeline' && timelineItems.value.length === 0) {
|
|
||||||
await loadTimeline()
|
|
||||||
} else if (
|
|
||||||
val === 'following' &&
|
|
||||||
followers.value.length === 0 &&
|
|
||||||
followings.value.length === 0
|
|
||||||
) {
|
|
||||||
await loadFollow()
|
|
||||||
} else if (val === 'achievements' && medals.value.length === 0) {
|
|
||||||
await loadAchievements()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
user,
|
|
||||||
hotPosts,
|
|
||||||
hotReplies,
|
|
||||||
timelineItems,
|
|
||||||
followers,
|
|
||||||
followings,
|
|
||||||
medals,
|
|
||||||
subscribed,
|
|
||||||
isMine,
|
|
||||||
isLoading,
|
|
||||||
tabLoading,
|
|
||||||
selectedTab,
|
|
||||||
followTab,
|
|
||||||
formatDate,
|
|
||||||
stripMarkdown,
|
|
||||||
stripMarkdownLength,
|
|
||||||
loadTimeline,
|
|
||||||
loadFollow,
|
|
||||||
loadAchievements,
|
|
||||||
loadSummary,
|
|
||||||
subscribeUser,
|
|
||||||
unsubscribeUser,
|
|
||||||
gotoTag,
|
|
||||||
hotTags,
|
|
||||||
levelInfo,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fetchUser = async () => {
|
||||||
|
const token = getToken()
|
||||||
|
const headers = token ? { Authorization: `Bearer ${token}` } : {}
|
||||||
|
const res = await fetch(`${API_BASE_URL}/api/users/${username}`, { headers })
|
||||||
|
if (res.ok) {
|
||||||
|
const data = await res.json()
|
||||||
|
user.value = data
|
||||||
|
subscribed.value = !!data.subscribed
|
||||||
|
} else if (res.status === 404) {
|
||||||
|
router.replace('/404')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchSummary = async () => {
|
||||||
|
const postsRes = await fetch(`${API_BASE_URL}/api/users/${username}/hot-posts`)
|
||||||
|
if (postsRes.ok) {
|
||||||
|
const data = await postsRes.json()
|
||||||
|
hotPosts.value = data.map((p) => ({ icon: 'fas fa-book', post: p }))
|
||||||
|
}
|
||||||
|
|
||||||
|
const repliesRes = await fetch(`${API_BASE_URL}/api/users/${username}/hot-replies`)
|
||||||
|
if (repliesRes.ok) {
|
||||||
|
const data = await repliesRes.json()
|
||||||
|
hotReplies.value = data.map((c) => ({ icon: 'fas fa-comment', comment: c }))
|
||||||
|
}
|
||||||
|
|
||||||
|
const tagsRes = await fetch(`${API_BASE_URL}/api/users/${username}/hot-tags`)
|
||||||
|
if (tagsRes.ok) {
|
||||||
|
const data = await tagsRes.json()
|
||||||
|
hotTags.value = data.map((t) => ({ icon: 'fas fa-tag', tag: t }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchTimeline = async () => {
|
||||||
|
const [postsRes, repliesRes, tagsRes] = await Promise.all([
|
||||||
|
fetch(`${API_BASE_URL}/api/users/${username}/posts?limit=50`),
|
||||||
|
fetch(`${API_BASE_URL}/api/users/${username}/replies?limit=50`),
|
||||||
|
fetch(`${API_BASE_URL}/api/users/${username}/tags?limit=50`),
|
||||||
|
])
|
||||||
|
const posts = postsRes.ok ? await postsRes.json() : []
|
||||||
|
const replies = repliesRes.ok ? await repliesRes.json() : []
|
||||||
|
const tags = tagsRes.ok ? await tagsRes.json() : []
|
||||||
|
const mapped = [
|
||||||
|
...posts.map((p) => ({
|
||||||
|
type: 'post',
|
||||||
|
icon: 'fas fa-book',
|
||||||
|
post: p,
|
||||||
|
createdAt: p.createdAt,
|
||||||
|
})),
|
||||||
|
...replies.map((r) => ({
|
||||||
|
type: r.parentComment ? 'reply' : 'comment',
|
||||||
|
icon: 'fas fa-comment',
|
||||||
|
comment: r,
|
||||||
|
createdAt: r.createdAt,
|
||||||
|
})),
|
||||||
|
...tags.map((t) => ({
|
||||||
|
type: 'tag',
|
||||||
|
icon: 'fas fa-tag',
|
||||||
|
tag: t,
|
||||||
|
createdAt: t.createdAt,
|
||||||
|
})),
|
||||||
|
]
|
||||||
|
mapped.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
|
||||||
|
timelineItems.value = mapped
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchFollowUsers = async () => {
|
||||||
|
const [followerRes, followingRes] = await Promise.all([
|
||||||
|
fetch(`${API_BASE_URL}/api/users/${username}/followers`),
|
||||||
|
fetch(`${API_BASE_URL}/api/users/${username}/following`),
|
||||||
|
])
|
||||||
|
followers.value = followerRes.ok ? await followerRes.json() : []
|
||||||
|
followings.value = followingRes.ok ? await followingRes.json() : []
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadSummary = async () => {
|
||||||
|
tabLoading.value = true
|
||||||
|
await fetchSummary()
|
||||||
|
tabLoading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadTimeline = async () => {
|
||||||
|
tabLoading.value = true
|
||||||
|
await fetchTimeline()
|
||||||
|
tabLoading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadFollow = async () => {
|
||||||
|
tabLoading.value = true
|
||||||
|
await fetchFollowUsers()
|
||||||
|
tabLoading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchAchievements = async () => {
|
||||||
|
const res = await fetch(`${API_BASE_URL}/api/medals?userId=${user.value.id}`)
|
||||||
|
if (res.ok) {
|
||||||
|
medals.value = await res.json()
|
||||||
|
} else {
|
||||||
|
medals.value = []
|
||||||
|
toast.error('获取成就失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadAchievements = async () => {
|
||||||
|
tabLoading.value = true
|
||||||
|
await fetchAchievements()
|
||||||
|
tabLoading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const subscribeUser = async () => {
|
||||||
|
const token = getToken()
|
||||||
|
if (!token) {
|
||||||
|
toast.error('请先登录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const res = await fetch(`${API_BASE_URL}/api/subscriptions/users/${username}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { Authorization: `Bearer ${token}` },
|
||||||
|
})
|
||||||
|
if (res.ok) {
|
||||||
|
subscribed.value = true
|
||||||
|
toast.success('已关注')
|
||||||
|
} else {
|
||||||
|
toast.error('操作失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsubscribeUser = async () => {
|
||||||
|
const token = getToken()
|
||||||
|
if (!token) {
|
||||||
|
toast.error('请先登录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const res = await fetch(`${API_BASE_URL}/api/subscriptions/users/${username}`, {
|
||||||
|
method: 'DELETE',
|
||||||
|
headers: { Authorization: `Bearer ${token}` },
|
||||||
|
})
|
||||||
|
if (res.ok) {
|
||||||
|
subscribed.value = false
|
||||||
|
toast.success('已取消关注')
|
||||||
|
} else {
|
||||||
|
toast.error('操作失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const gotoTag = (tag) => {
|
||||||
|
const value = encodeURIComponent(tag.id ?? tag.name)
|
||||||
|
router.push({ path: '/', query: { tags: value } })
|
||||||
|
}
|
||||||
|
|
||||||
|
const init = async () => {
|
||||||
|
try {
|
||||||
|
await fetchUser()
|
||||||
|
if (selectedTab.value === 'summary') {
|
||||||
|
await loadSummary()
|
||||||
|
} else if (selectedTab.value === 'timeline') {
|
||||||
|
await loadTimeline()
|
||||||
|
} else if (selectedTab.value === 'following') {
|
||||||
|
await loadFollow()
|
||||||
|
} else if (selectedTab.value === 'achievements') {
|
||||||
|
await loadAchievements()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
} finally {
|
||||||
|
isLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(init)
|
||||||
|
|
||||||
|
watch(selectedTab, async (val) => {
|
||||||
|
// router.replace({ query: { ...route.query, tab: val } })
|
||||||
|
if (val === 'timeline' && timelineItems.value.length === 0) {
|
||||||
|
await loadTimeline()
|
||||||
|
} else if (val === 'following' && followers.value.length === 0 && followings.value.length === 0) {
|
||||||
|
await loadFollow()
|
||||||
|
} else if (val === 'achievements' && medals.value.length === 0) {
|
||||||
|
await loadAchievements()
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { API_BASE_URL } from '~/main'
|
|
||||||
import { reactive } from 'vue'
|
import { reactive } from 'vue'
|
||||||
|
|
||||||
const TOKEN_KEY = 'token'
|
const TOKEN_KEY = 'token'
|
||||||
@@ -65,6 +64,8 @@ export function clearUserInfo() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchCurrentUser() {
|
export async function fetchCurrentUser() {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
const token = getToken()
|
const token = getToken()
|
||||||
if (!token) return null
|
if (!token) return null
|
||||||
try {
|
try {
|
||||||
@@ -91,6 +92,8 @@ export function isLogin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function checkToken() {
|
export async function checkToken() {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
const token = getToken()
|
const token = getToken()
|
||||||
if (!token) return false
|
if (!token) return false
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { API_BASE_URL, DISCORD_CLIENT_ID, toast } from '../main'
|
import { DISCORD_CLIENT_ID, toast } from '../main'
|
||||||
import { WEBSITE_BASE_URL } from '../constants'
|
import { WEBSITE_BASE_URL } from '../constants'
|
||||||
import { setToken, loadCurrentUser } from './auth'
|
import { setToken, loadCurrentUser } from './auth'
|
||||||
import { registerPush } from './push'
|
import { registerPush } from './push'
|
||||||
@@ -15,6 +15,8 @@ export function discordAuthorize(state = '') {
|
|||||||
|
|
||||||
export async function discordExchange(code, state, reason) {
|
export async function discordExchange(code, state, reason) {
|
||||||
try {
|
try {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
const res = await fetch(`${API_BASE_URL}/api/auth/discord`, {
|
const res = await fetch(`${API_BASE_URL}/api/auth/discord`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { API_BASE_URL, GITHUB_CLIENT_ID, toast } from '../main'
|
import { GITHUB_CLIENT_ID, toast } from '../main'
|
||||||
import { setToken, loadCurrentUser } from './auth'
|
import { setToken, loadCurrentUser } from './auth'
|
||||||
import { WEBSITE_BASE_URL } from '../constants'
|
import { WEBSITE_BASE_URL } from '../constants'
|
||||||
import { registerPush } from './push'
|
import { registerPush } from './push'
|
||||||
@@ -15,6 +15,8 @@ export function githubAuthorize(state = '') {
|
|||||||
|
|
||||||
export async function githubExchange(code, state, reason) {
|
export async function githubExchange(code, state, reason) {
|
||||||
try {
|
try {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
const res = await fetch(`${API_BASE_URL}/api/auth/github`, {
|
const res = await fetch(`${API_BASE_URL}/api/auth/github`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { API_BASE_URL, GOOGLE_CLIENT_ID, toast } from '../main'
|
import { GOOGLE_CLIENT_ID, toast } from '../main'
|
||||||
import { setToken, loadCurrentUser } from './auth'
|
import { setToken, loadCurrentUser } from './auth'
|
||||||
import { registerPush } from './push'
|
import { registerPush } from './push'
|
||||||
import { WEBSITE_BASE_URL } from '../constants'
|
import { WEBSITE_BASE_URL } from '../constants'
|
||||||
@@ -32,6 +32,8 @@ export function googleAuthorize() {
|
|||||||
|
|
||||||
export async function googleAuthWithToken(idToken, redirect_success, redirect_not_approved) {
|
export async function googleAuthWithToken(idToken, redirect_success, redirect_not_approved) {
|
||||||
try {
|
try {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
const res = await fetch(`${API_BASE_URL}/api/auth/google`, {
|
const res = await fetch(`${API_BASE_URL}/api/auth/google`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { API_BASE_URL } from '~/main'
|
|
||||||
import { getToken } from './auth'
|
import { getToken } from './auth'
|
||||||
import { reactive } from 'vue'
|
import { reactive } from 'vue'
|
||||||
|
|
||||||
@@ -7,6 +6,8 @@ export const notificationState = reactive({
|
|||||||
})
|
})
|
||||||
|
|
||||||
export async function fetchUnreadCount() {
|
export async function fetchUnreadCount() {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
try {
|
try {
|
||||||
const token = getToken()
|
const token = getToken()
|
||||||
if (!token) {
|
if (!token) {
|
||||||
@@ -31,6 +32,9 @@ export async function fetchUnreadCount() {
|
|||||||
|
|
||||||
export async function markNotificationsRead(ids) {
|
export async function markNotificationsRead(ids) {
|
||||||
try {
|
try {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
|
|
||||||
const token = getToken()
|
const token = getToken()
|
||||||
if (!token || !ids || ids.length === 0) return false
|
if (!token || !ids || ids.length === 0) return false
|
||||||
const res = await fetch(`${API_BASE_URL}/api/notifications/read`, {
|
const res = await fetch(`${API_BASE_URL}/api/notifications/read`, {
|
||||||
@@ -49,6 +53,9 @@ export async function markNotificationsRead(ids) {
|
|||||||
|
|
||||||
export async function fetchNotificationPreferences() {
|
export async function fetchNotificationPreferences() {
|
||||||
try {
|
try {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
|
|
||||||
const token = getToken()
|
const token = getToken()
|
||||||
if (!token) return []
|
if (!token) return []
|
||||||
const res = await fetch(`${API_BASE_URL}/api/notifications/prefs`, {
|
const res = await fetch(`${API_BASE_URL}/api/notifications/prefs`, {
|
||||||
@@ -63,6 +70,8 @@ export async function fetchNotificationPreferences() {
|
|||||||
|
|
||||||
export async function updateNotificationPreference(type, enabled) {
|
export async function updateNotificationPreference(type, enabled) {
|
||||||
try {
|
try {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
const token = getToken()
|
const token = getToken()
|
||||||
if (!token) return false
|
if (!token) return false
|
||||||
const res = await fetch(`${API_BASE_URL}/api/notifications/prefs`, {
|
const res = await fetch(`${API_BASE_URL}/api/notifications/prefs`, {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { API_BASE_URL } from '../main'
|
|
||||||
import { getToken } from './auth'
|
import { getToken } from './auth'
|
||||||
|
|
||||||
function urlBase64ToUint8Array(base64String) {
|
function urlBase64ToUint8Array(base64String) {
|
||||||
@@ -21,6 +20,8 @@ function arrayBufferToBase64(buffer) {
|
|||||||
|
|
||||||
export async function registerPush() {
|
export async function registerPush() {
|
||||||
if (!('serviceWorker' in navigator) || !('PushManager' in window)) return
|
if (!('serviceWorker' in navigator) || !('PushManager' in window)) return
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
try {
|
try {
|
||||||
const reg = await navigator.serviceWorker.register('/notifications-sw.js')
|
const reg = await navigator.serviceWorker.register('/notifications-sw.js')
|
||||||
const res = await fetch(`${API_BASE_URL}/api/push/public-key`)
|
const res = await fetch(`${API_BASE_URL}/api/push/public-key`)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { API_BASE_URL, TWITTER_CLIENT_ID, toast } from '../main'
|
import { TWITTER_CLIENT_ID, toast } from '../main'
|
||||||
import { WEBSITE_BASE_URL } from '../constants'
|
import { WEBSITE_BASE_URL } from '../constants'
|
||||||
import { setToken, loadCurrentUser } from './auth'
|
import { setToken, loadCurrentUser } from './auth'
|
||||||
import { registerPush } from './push'
|
import { registerPush } from './push'
|
||||||
@@ -42,6 +42,8 @@ export async function twitterAuthorize(state = '') {
|
|||||||
|
|
||||||
export async function twitterExchange(code, state, reason) {
|
export async function twitterExchange(code, state, reason) {
|
||||||
try {
|
try {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
const codeVerifier = sessionStorage.getItem('twitter_code_verifier')
|
const codeVerifier = sessionStorage.getItem('twitter_code_verifier')
|
||||||
sessionStorage.removeItem('twitter_code_verifier')
|
sessionStorage.removeItem('twitter_code_verifier')
|
||||||
const res = await fetch(`${API_BASE_URL}/api/auth/twitter`, {
|
const res = await fetch(`${API_BASE_URL}/api/auth/twitter`, {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { API_BASE_URL } from '../main'
|
|
||||||
|
|
||||||
export async function fetchFollowings(username) {
|
export async function fetchFollowings(username) {
|
||||||
if (!username) return []
|
if (!username) return []
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`${API_BASE_URL}/api/users/${username}/following`)
|
const res = await fetch(`${API_BASE_URL}/api/users/${username}/following`)
|
||||||
return res.ok ? await res.json() : []
|
return res.ok ? await res.json() : []
|
||||||
@@ -11,6 +11,8 @@ export async function fetchFollowings(username) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchAdmins() {
|
export async function fetchAdmins() {
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`${API_BASE_URL}/api/users/admins`)
|
const res = await fetch(`${API_BASE_URL}/api/users/admins`)
|
||||||
return res.ok ? await res.json() : []
|
return res.ok ? await res.json() : []
|
||||||
@@ -21,6 +23,8 @@ export async function fetchAdmins() {
|
|||||||
|
|
||||||
export async function searchUsers(keyword) {
|
export async function searchUsers(keyword) {
|
||||||
if (!keyword) return []
|
if (!keyword) return []
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
try {
|
try {
|
||||||
const res = await fetch(
|
const res = await fetch(
|
||||||
`${API_BASE_URL}/api/search/users?keyword=${encodeURIComponent(keyword)}`,
|
`${API_BASE_URL}/api/search/users?keyword=${encodeURIComponent(keyword)}`,
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import Vditor from 'vditor'
|
import Vditor from 'vditor'
|
||||||
import { API_BASE_URL } from '../main'
|
|
||||||
import { getToken, authState } from './auth'
|
import { getToken, authState } from './auth'
|
||||||
import { searchUsers, fetchFollowings, fetchAdmins } from './user'
|
import { searchUsers, fetchFollowings, fetchAdmins } from './user'
|
||||||
import { tiebaEmoji } from './tiebaEmoji'
|
import { tiebaEmoji } from './tiebaEmoji'
|
||||||
@@ -14,6 +13,8 @@ export function getPreviewTheme() {
|
|||||||
|
|
||||||
export function createVditor(editorId, options = {}) {
|
export function createVditor(editorId, options = {}) {
|
||||||
const { placeholder = '', preview = {}, input, after } = options
|
const { placeholder = '', preview = {}, input, after } = options
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
|
|
||||||
const fetchMentions = async (value) => {
|
const fetchMentions = async (value) => {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
|
|||||||
Reference in New Issue
Block a user