wip bsky client for the web & android
bbell.vt3e.cat
1import { ref, onMounted, onUnmounted, type Ref } from 'vue'
2
3export function useReposition(options: {
4 triggerRef: Ref<HTMLElement | null>
5 containerRef: Ref<HTMLElement | null>
6 isOpen: Ref<boolean>
7 isMobile: Ref<boolean>
8 width: Ref<string>
9 align: Ref<'left' | 'right'>
10}) {
11 const popoverPos = ref({ top: 0, left: 0 })
12
13 const calculatePosition = () => {
14 const trigger = options.triggerRef.value
15 if (!trigger) return
16 const rect = trigger.getBoundingClientRect()
17 const gap = 8
18 const parsedW = parseInt(options.width.value || '200')
19 popoverPos.value = {
20 top: rect.bottom + gap,
21 left: options.align.value === 'right' ? rect.right - parsedW : rect.left,
22 }
23 }
24
25 const handleReposition = () => {
26 if (options.isOpen.value && !options.isMobile.value) calculatePosition()
27 }
28
29 onMounted(() => {
30 window.addEventListener('resize', handleReposition)
31 window.addEventListener('scroll', handleReposition, true)
32 })
33
34 onUnmounted(() => {
35 window.removeEventListener('resize', handleReposition)
36 window.removeEventListener('scroll', handleReposition, true)
37 })
38
39 return { popoverPos, calculatePosition }
40}