wip: refactor(client): migrate components to composition api
This commit is contained in:
		
							parent
							
								
									ed5c918d70
								
							
						
					
					
						commit
						133b5c6391
					
				
					 2 changed files with 39 additions and 96 deletions
				
			
		|  | @ -1,82 +1,36 @@ | |||
| <template> | ||||
| <component :is="self ? 'MkA' : 'a'" class="xlcxczvw _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target" | ||||
| <component :is="self ? 'MkA' : 'a'" ref="el" class="xlcxczvw _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target" | ||||
| 	:title="url" | ||||
| 	@mouseover="onMouseover" | ||||
| 	@mouseleave="onMouseleave" | ||||
| > | ||||
| 	<slot></slot> | ||||
| 	<i v-if="target === '_blank'" class="fas fa-external-link-square-alt icon"></i> | ||||
| </component> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| <script lang="ts" setup> | ||||
| import { } from 'vue'; | ||||
| import { url as local } from '@/config'; | ||||
| import { isTouchUsing } from '@/scripts/touch'; | ||||
| import { useTooltip } from '@/scripts/use-tooltip'; | ||||
| import * as os from '@/os'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
| 	props: { | ||||
| 		url: { | ||||
| 			type: String, | ||||
| 			required: true, | ||||
| 		}, | ||||
| 		rel: { | ||||
| 			type: String, | ||||
| 			required: false, | ||||
| 		} | ||||
| 	}, | ||||
| 	data() { | ||||
| 		const self = this.url.startsWith(local); | ||||
| 		return { | ||||
| 			local, | ||||
| 			self: self, | ||||
| 			attr: self ? 'to' : 'href', | ||||
| 			target: self ? null : '_blank', | ||||
| 			showTimer: null, | ||||
| 			hideTimer: null, | ||||
| 			checkTimer: null, | ||||
| 			close: null, | ||||
| 		}; | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		async showPreview() { | ||||
| 			if (!document.body.contains(this.$el)) return; | ||||
| 			if (this.close) return; | ||||
| 
 | ||||
| 			const { dispose } = await os.popup(import('@/components/url-preview-popup.vue'), { | ||||
| 				url: this.url, | ||||
| 				source: this.$el | ||||
| const props = withDefaults(defineProps<{ | ||||
| 	url: string; | ||||
| 	rel?: null | string; | ||||
| }>(), { | ||||
| }); | ||||
| 
 | ||||
| 			this.close = () => { | ||||
| 				dispose(); | ||||
| 			}; | ||||
| const self = props.url.startsWith(local); | ||||
| const attr = self ? 'to' : 'href'; | ||||
| const target = self ? null : '_blank'; | ||||
| 
 | ||||
| 			this.checkTimer = setInterval(() => { | ||||
| 				if (!document.body.contains(this.$el)) this.closePreview(); | ||||
| 			}, 1000); | ||||
| 		}, | ||||
| 		closePreview() { | ||||
| 			if (this.close) { | ||||
| 				clearInterval(this.checkTimer); | ||||
| 				this.close(); | ||||
| 				this.close = null; | ||||
| 			} | ||||
| 		}, | ||||
| 		onMouseover() { | ||||
| 			if (isTouchUsing) return; | ||||
| 			clearTimeout(this.showTimer); | ||||
| 			clearTimeout(this.hideTimer); | ||||
| 			this.showTimer = setTimeout(this.showPreview, 500); | ||||
| 		}, | ||||
| 		onMouseleave() { | ||||
| 			if (isTouchUsing) return; | ||||
| 			clearTimeout(this.showTimer); | ||||
| 			clearTimeout(this.hideTimer); | ||||
| 			this.hideTimer = setTimeout(this.closePreview, 500); | ||||
| 		} | ||||
| 	} | ||||
| const el = $ref(); | ||||
| 
 | ||||
| useTooltip($$(el), (showing) => { | ||||
| 	os.popup(import('@/components/url-preview-popup.vue'), { | ||||
| 		showing, | ||||
| 		url: props.url, | ||||
| 		source: el, | ||||
| 	}, {}, 'closed'); | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,39 +8,28 @@ | |||
| </div> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import * as os from '@/os'; | ||||
| <script lang="ts" setup> | ||||
| import { onUnmounted } from 'vue'; | ||||
| import { stream } from '@/stream'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
| 	data() { | ||||
| 		return { | ||||
| 			hasDisconnected: false, | ||||
| let hasDisconnected = $ref(false); | ||||
| 
 | ||||
| function onDisconnected() { | ||||
| 	hasDisconnected = true; | ||||
| } | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		stream() { | ||||
| 			return stream; | ||||
| 		}, | ||||
| 	}, | ||||
| 	created() { | ||||
| 		stream.on('_disconnected_', this.onDisconnected); | ||||
| 	}, | ||||
| 	beforeUnmount() { | ||||
| 		stream.off('_disconnected_', this.onDisconnected); | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		onDisconnected() { | ||||
| 			this.hasDisconnected = true; | ||||
| 		}, | ||||
| 		resetDisconnected() { | ||||
| 			this.hasDisconnected = false; | ||||
| 		}, | ||||
| 		reload() { | ||||
| 
 | ||||
| function resetDisconnected() { | ||||
| 	hasDisconnected = false; | ||||
| } | ||||
| 
 | ||||
| function reload() { | ||||
| 	location.reload(); | ||||
| 		}, | ||||
| } | ||||
| 
 | ||||
| stream.on('_disconnected_', onDisconnected); | ||||
| 
 | ||||
| onUnmounted(() => { | ||||
| 	stream.off('_disconnected_', onDisconnected); | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue