refactor(client): Refine routing (#8846)
This commit is contained in:
		| @@ -1,10 +1,11 @@ | ||||
| <template> | ||||
| <MkSpacer :content-max="800"> | ||||
| <template><MkStickyContainer> | ||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||
| 		<MkSpacer :content-max="800"> | ||||
| 	<div class="fcuexfpr"> | ||||
| 		<transition :name="$store.state.animation ? 'fade' : ''" mode="out-in"> | ||||
| 			<div v-if="note" class="note"> | ||||
| 				<div v-if="showNext" class="_gap"> | ||||
| 					<XNotes class="_content" :pagination="next" :no-gap="true"/> | ||||
| 					<XNotes class="_content" :pagination="nextPagination" :no-gap="true"/> | ||||
| 				</div> | ||||
|  | ||||
| 				<div class="main _gap"> | ||||
| @@ -27,121 +28,112 @@ | ||||
| 				</div> | ||||
|  | ||||
| 				<div v-if="showPrev" class="_gap"> | ||||
| 					<XNotes class="_content" :pagination="prev" :no-gap="true"/> | ||||
| 					<XNotes class="_content" :pagination="prevPagination" :no-gap="true"/> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<MkError v-else-if="error" @retry="fetch()"/> | ||||
| 			<MkLoading v-else/> | ||||
| 		</transition> | ||||
| 	</div> | ||||
| </MkSpacer> | ||||
| </MkSpacer></MkStickyContainer> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { computed, defineComponent } from 'vue'; | ||||
| <script lang="ts" setup> | ||||
| import { computed, defineComponent, watch } from 'vue'; | ||||
| import * as misskey from 'misskey-js'; | ||||
| import XNote from '@/components/note.vue'; | ||||
| import XNoteDetailed from '@/components/note-detailed.vue'; | ||||
| import XNotes from '@/components/notes.vue'; | ||||
| import MkRemoteCaution from '@/components/remote-caution.vue'; | ||||
| import MkButton from '@/components/ui/button.vue'; | ||||
| import * as os from '@/os'; | ||||
| import * as symbols from '@/symbols'; | ||||
| import { definePageMetadata } from '@/scripts/page-metadata'; | ||||
| import { i18n } from '@/i18n'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		XNote, | ||||
| 		XNoteDetailed, | ||||
| 		XNotes, | ||||
| 		MkRemoteCaution, | ||||
| 		MkButton, | ||||
| 	}, | ||||
| 	props: { | ||||
| 		noteId: { | ||||
| 			type: String, | ||||
| 			required: true | ||||
| 		} | ||||
| 	}, | ||||
| 	data() { | ||||
| 		return { | ||||
| 			[symbols.PAGE_INFO]: computed(() => this.note ? { | ||||
| 				title: this.$ts.note, | ||||
| 				subtitle: new Date(this.note.createdAt).toLocaleString(), | ||||
| 				avatar: this.note.user, | ||||
| 				path: `/notes/${this.note.id}`, | ||||
| 				share: { | ||||
| 					title: this.$t('noteOf', { user: this.note.user.name }), | ||||
| 					text: this.note.text, | ||||
| 				}, | ||||
| 				bg: 'var(--bg)', | ||||
| 			} : null), | ||||
| 			note: null, | ||||
| 			clips: null, | ||||
| 			hasPrev: false, | ||||
| 			hasNext: false, | ||||
| 			showPrev: false, | ||||
| 			showNext: false, | ||||
| 			error: null, | ||||
| 			prev: { | ||||
| 				endpoint: 'users/notes' as const, | ||||
| 				limit: 10, | ||||
| 				params: computed(() => ({ | ||||
| 					userId: this.note.userId, | ||||
| 					untilId: this.note.id, | ||||
| 				})), | ||||
| 			}, | ||||
| 			next: { | ||||
| 				reversed: true, | ||||
| 				endpoint: 'users/notes' as const, | ||||
| 				limit: 10, | ||||
| 				params: computed(() => ({ | ||||
| 					userId: this.note.userId, | ||||
| 					sinceId: this.note.id, | ||||
| 				})), | ||||
| 			}, | ||||
| 		}; | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		noteId: 'fetch' | ||||
| 	}, | ||||
| 	created() { | ||||
| 		this.fetch(); | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		fetch() { | ||||
| 			this.hasPrev = false; | ||||
| 			this.hasNext = false; | ||||
| 			this.showPrev = false; | ||||
| 			this.showNext = false; | ||||
| 			this.note = null; | ||||
| 			os.api('notes/show', { | ||||
| 				noteId: this.noteId | ||||
| 			}).then(note => { | ||||
| 				this.note = note; | ||||
| 				Promise.all([ | ||||
| 					os.api('notes/clips', { | ||||
| 						noteId: note.id, | ||||
| 					}), | ||||
| 					os.api('users/notes', { | ||||
| 						userId: note.userId, | ||||
| 						untilId: note.id, | ||||
| 						limit: 1, | ||||
| 					}), | ||||
| 					os.api('users/notes', { | ||||
| 						userId: note.userId, | ||||
| 						sinceId: note.id, | ||||
| 						limit: 1, | ||||
| 					}), | ||||
| 				]).then(([clips, prev, next]) => { | ||||
| 					this.clips = clips; | ||||
| 					this.hasPrev = prev.length !== 0; | ||||
| 					this.hasNext = next.length !== 0; | ||||
| 				}); | ||||
| 			}).catch(err => { | ||||
| 				this.error = err; | ||||
| 			}); | ||||
| 		} | ||||
| 	} | ||||
| const props = defineProps<{ | ||||
| 	noteId: string; | ||||
| }>(); | ||||
|  | ||||
| let note = $ref<null | misskey.entities.Note>(); | ||||
| let clips = $ref(); | ||||
| let hasPrev = $ref(false); | ||||
| let hasNext = $ref(false); | ||||
| let showPrev = $ref(false); | ||||
| let showNext = $ref(false); | ||||
| let error = $ref(); | ||||
|  | ||||
| const prevPagination = { | ||||
| 	endpoint: 'users/notes' as const, | ||||
| 	limit: 10, | ||||
| 	params: computed(() => note ? ({ | ||||
| 		userId: note.userId, | ||||
| 		untilId: note.id, | ||||
| 	}) : null), | ||||
| }; | ||||
|  | ||||
| const nextPagination = { | ||||
| 	reversed: true, | ||||
| 	endpoint: 'users/notes' as const, | ||||
| 	limit: 10, | ||||
| 	params: computed(() => note ? ({ | ||||
| 		userId: note.userId, | ||||
| 		sinceId: note.id, | ||||
| 	}) : null), | ||||
| }; | ||||
|  | ||||
| function fetchNote() { | ||||
| 	hasPrev = false; | ||||
| 	hasNext = false; | ||||
| 	showPrev = false; | ||||
| 	showNext = false; | ||||
| 	note = null; | ||||
| 	os.api('notes/show', { | ||||
| 		noteId: props.noteId, | ||||
| 	}).then(res => { | ||||
| 		note = res; | ||||
| 		Promise.all([ | ||||
| 			os.api('notes/clips', { | ||||
| 				noteId: note.id, | ||||
| 			}), | ||||
| 			os.api('users/notes', { | ||||
| 				userId: note.userId, | ||||
| 				untilId: note.id, | ||||
| 				limit: 1, | ||||
| 			}), | ||||
| 			os.api('users/notes', { | ||||
| 				userId: note.userId, | ||||
| 				sinceId: note.id, | ||||
| 				limit: 1, | ||||
| 			}), | ||||
| 		]).then(([_clips, prev, next]) => { | ||||
| 			clips = _clips; | ||||
| 			hasPrev = prev.length !== 0; | ||||
| 			hasNext = next.length !== 0; | ||||
| 		}); | ||||
| 	}).catch(err => { | ||||
| 		error = err; | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| watch(() => props.noteId, fetchNote, { | ||||
| 	immediate: true, | ||||
| }); | ||||
|  | ||||
| const headerActions = $computed(() => []); | ||||
|  | ||||
| const headerTabs = $computed(() => []); | ||||
|  | ||||
| definePageMetadata(computed(() => note ? { | ||||
| 	title: i18n.ts.note, | ||||
| 	subtitle: new Date(note.createdAt).toLocaleString(), | ||||
| 	avatar: note.user, | ||||
| 	path: `/notes/${note.id}`, | ||||
| 	share: { | ||||
| 		title: i18n.t('noteOf', { user: note.user.name }), | ||||
| 		text: note.text, | ||||
| 	}, | ||||
| 	bg: 'var(--bg)', | ||||
| } : null)); | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo