Browse code

Refactor and rewrite as contao bundle

Benjamin Roth authored on04/11/2022 22:32:32
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,158 @@
1
+<script>
2
+  import {
3
+    onMount,
4
+    onDestroy,
5
+    afterUpdate,
6
+    createEventDispatcher,
7
+    tick,
8
+    beforeUpdate,
9
+  } from 'svelte';
10
+  import { getParams } from './get-params';
11
+  import { initSwiper } from './init-swiper';
12
+  import { needsScrollbar, needsNavigation, needsPagination, uniqueClasses } from './utils';
13
+  import { getChangedParams } from './get-changed-params';
14
+  import { updateSwiper } from './update-swiper';
15
+
16
+  const dispatch = createEventDispatcher();
17
+
18
+  let className = undefined;
19
+  export { className as class };
20
+
21
+  let containerClasses = 'swiper-container';
22
+  let breakpointChanged = false;
23
+  let swiperInstance = null;
24
+  let oldPassedParams = null;
25
+
26
+  let paramsData;
27
+  let swiperParams;
28
+  let passedParams;
29
+  let restProps;
30
+
31
+  let swiperEl = null;
32
+  let prevEl = null;
33
+  let nextEl = null;
34
+  let scrollbarEl = null;
35
+  let paginationEl = null;
36
+  let virtualData = { slides: [] };
37
+
38
+  export function swiper() {
39
+    return swiperInstance;
40
+  }
41
+
42
+  const setVirtualData = (data) => {
43
+    virtualData = data;
44
+
45
+    tick().then(() => {
46
+      swiperInstance.$wrapperEl.children('.swiper-slide').each((el) => {
47
+        if (el.onSwiper) el.onSwiper(swiperInstance);
48
+      });
49
+      swiperInstance.updateSlides();
50
+      swiperInstance.updateProgress();
51
+      swiperInstance.updateSlidesClasses();
52
+      if (swiperInstance.lazy && swiperInstance.params.lazy.enabled) {
53
+        swiperInstance.lazy.load();
54
+      }
55
+    });
56
+  };
57
+
58
+  const calcParams = () => {
59
+    paramsData = getParams($$restProps);
60
+    swiperParams = paramsData.params;
61
+    passedParams = paramsData.passedParams;
62
+    restProps = paramsData.rest;
63
+  };
64
+
65
+  calcParams();
66
+  oldPassedParams = passedParams;
67
+
68
+  const onBeforeBreakpoint = () => {
69
+    breakpointChanged = true;
70
+  };
71
+
72
+  swiperParams.onAny = (event, ...args) => {
73
+    dispatch(event, [args]);
74
+  };
75
+  Object.assign(swiperParams.on, {
76
+    _beforeBreakpoint: onBeforeBreakpoint,
77
+    _containerClasses(_swiper, classes) {
78
+      containerClasses = classes;
79
+    },
80
+    _swiper(_swiper) {
81
+      swiperInstance = _swiper;
82
+      if (_swiper.virtual && _swiper.params.virtual.enabled) {
83
+        _swiper.params.virtual.cache = false;
84
+        _swiper.params.virtual.renderExternalUpdate = false;
85
+        _swiper.params.virtual.renderExternal = (data) => {
86
+          setVirtualData(data);
87
+          if (swiperParams.virtual && swiperParams.virtual.renderExternal) {
88
+            swiperParams.virtual.renderExternal(data);
89
+          }
90
+        };
91
+      }
92
+      dispatch('swiper', [_swiper]);
93
+    },
94
+  });
95
+
96
+  onMount(() => {
97
+    if (!swiperEl) return;
98
+    initSwiper(
99
+      {
100
+        el: swiperEl,
101
+        nextEl: nextEl,
102
+        prevEl: prevEl,
103
+        paginationEl: paginationEl,
104
+        scrollbarEl: scrollbarEl,
105
+      },
106
+      swiperParams,
107
+    );
108
+    if (swiperParams.virtual) return;
109
+    swiperInstance.slides.each((el) => {
110
+      if (el.onSwiper) el.onSwiper(swiperInstance);
111
+    });
112
+  });
113
+
114
+  afterUpdate(() => {
115
+    if (!swiperInstance) return;
116
+    calcParams();
117
+
118
+    const changedParams = getChangedParams(passedParams, oldPassedParams);
119
+    if (
120
+      (changedParams.length || breakpointChanged) &&
121
+      swiperInstance &&
122
+      !swiperInstance.destroyed
123
+    ) {
124
+      updateSwiper(swiperInstance, passedParams, changedParams);
125
+    }
126
+    breakpointChanged = false;
127
+    oldPassedParams = passedParams;
128
+  });
129
+
130
+  onDestroy(() => {
131
+    if (swiperInstance && !swiperInstance.destroyed) {
132
+      swiperInstance.destroy(true, false);
133
+    }
134
+  });
135
+</script>
136
+
137
+<div
138
+  bind:this={swiperEl}
139
+  class={uniqueClasses(`${containerClasses}${className ? ` ${className}` : ''}`)}
140
+  {...restProps}>
141
+  <slot name="content-start" />
142
+  {#if needsNavigation(swiperParams)}
143
+    <div bind:this={prevEl} class="swiper-button-prev" />
144
+    <div bind:this={nextEl} class="swiper-button-next" />
145
+  {/if}
146
+  {#if needsScrollbar(swiperParams)}
147
+    <div bind:this={scrollbarEl} class="swiper-scrollbar" />
148
+  {/if}
149
+  {#if needsPagination(swiperParams)}
150
+    <div bind:this={paginationEl} class="swiper-pagination" />
151
+  {/if}
152
+  <div class="swiper-wrapper">
153
+    <slot name="wrapper-start" />
154
+    <slot {virtualData} />
155
+    <slot name="wrapper-end" />
156
+  </div>
157
+  <slot name="content-end" />
158
+</div>