1
1
<script lang="ts" setup>
2
- import { computed , ref , watch } from ' vue' ;
3
-
4
- import type {
5
- VirtualListRef ,
6
- VirtualListScrollToOptions ,
7
- } from ' ~/models/list-scroll.model' ;
2
+ import { watch } from ' vue' ;
8
3
9
4
import FloatingButton from ' ~/components/common/buttons/FloatingButton.vue' ;
10
5
import ListScroll from ' ~/components/common/list/ListScroll.vue' ;
11
6
import { useListScroll } from ' ~/components/common/list/use-list-scroll' ;
12
- import IconChevronDown from ' ~/components/icons/IconChevronDown.vue' ;
13
- import IconChevronUp from ' ~/components/icons/IconChevronUp.vue' ;
14
7
15
8
import { usePanelItem } from ' ~/components/views/panel/use-panel-item' ;
16
- import { useCalendarStore , useCalendarStoreRefs } from ' ~/stores/data/calendar.store' ;
9
+ import { useReleasesStore , useReleasesStoreRefs } from ' ~/stores/data/releases.store' ;
10
+ import { useCalendar , useCenterButton } from ' ~/utils/calendar.utils' ;
17
11
import { useI18n } from ' ~/utils/i18n.utils' ;
18
12
import { watchUserChange } from ' ~/utils/store.utils' ;
19
13
20
14
const i18n = useI18n (' calendar' );
21
15
22
- const { calendar , loading, center, filteredCalendar } = useCalendarStoreRefs ();
23
- const { fetchCalendar , clearState } = useCalendarStore ();
16
+ const { releases , loading, center } = useReleasesStoreRefs ();
17
+ const { fetchReleases , clearState } = useReleasesStore ();
24
18
25
- const list = useListScroll (filteredCalendar , ' date' );
19
+ const list = useListScroll (releases , ' date' );
26
20
27
- const centerItem = computed (() => {
28
- return list .value .find (
29
- item => item .date ?.current .toLocaleDateString () === center .value .toLocaleDateString (),
30
- );
31
- });
21
+ const { centerItem, centerIsToday, scrolledOut, recenterIcon, onScrollIntoOutOfView } =
22
+ useCenterButton ({ list , center });
32
23
33
- const centerIsToday = computed (() => {
34
- return (
35
- centerItem .value ?.date ?.current .toLocaleDateString () ===
36
- new Date ().toLocaleDateString ()
37
- );
24
+ const { onClick, onScrollTop, onScrollBottom, reload } = useCalendar ({
25
+ list ,
26
+ centerItem ,
27
+ fetchData: fetchReleases ,
38
28
});
39
29
40
- const listRef = ref <{ list: VirtualListRef }>();
41
-
42
- const scrollTo = (
43
- options ? : VirtualListScrollToOptions ,
44
- index = centerItem .value ?.index ,
45
- ) => {
46
- if (index === undefined ) return ;
47
- if (! listRef .value ?.list ) return ;
48
-
49
- listRef .value ?.list .scrollTo ({
50
- top: index * 145 ,
51
- ... options ,
52
- });
53
- };
54
-
55
- const reload = async () => {
56
- const promise = fetchCalendar ();
57
- // watch for loading changes and recenter
58
- const unsub = watch (list , async () => scrollTo ());
59
- await promise ;
60
- scrollTo ();
61
- unsub ();
62
- };
63
-
64
30
watch (center , () => reload ());
65
31
66
32
watchUserChange ({
@@ -74,31 +40,6 @@ watchUserChange({
74
40
},
75
41
});
76
42
77
- const scrolledOut = ref (false );
78
- const scrolledDown = ref (true );
79
- const onClick = () => scrollTo ({ behavior: ' smooth' });
80
- const onScrollIntoOutOfView = (_scrolled : boolean , _itemRef ? : HTMLDivElement ) => {
81
- scrolledOut .value = _scrolled ;
82
- if (! _scrolled || ! _itemRef ) return ;
83
- scrolledDown .value = _itemRef .getBoundingClientRect ().top > 0 ;
84
- };
85
- const recenterIcon = computed (() =>
86
- scrolledDown .value ? IconChevronDown : IconChevronUp ,
87
- );
88
-
89
- const onScrollTop = async () => {
90
- const first = list .value [0 ];
91
- await fetchCalendar (' start' );
92
-
93
- listRef .value ?.list .scrollTo ({
94
- top: (list .value .findIndex (item => item .id === first .id ) - 1 ) * 145 ,
95
- });
96
- };
97
-
98
- const onScrollBottom = async () => {
99
- await fetchCalendar (' end' );
100
- };
101
-
102
43
const { onItemClick } = usePanelItem ();
103
44
</script >
104
45
0 commit comments