Skip to content
This repository was archived by the owner on Mar 26, 2023. It is now read-only.

Commit 61e9122

Browse files
fixed issues (#42)
added swipes fixed redirect from init page
1 parent 33ac285 commit 61e9122

9 files changed

Lines changed: 184 additions & 56 deletions

File tree

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
"core-js": "^3.6.5",
1414
"single-spa-vue": "^2.1.0",
1515
"vue": "^3.0.0",
16-
"vue-router": "^4.0.0-0",
17-
"vuex": "^4.0.2"
16+
"vue-router": "^4.0.0-0"
1817
},
1918
"devDependencies": {
2019
"@vue/cli-plugin-babel": "~4.5.15",

set-public-path.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/events/swipe.js

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
export default function swipe(el, sett) {
2+
3+
// настройки по умолчанию
4+
var settings = Object.assign({}, {
5+
minDist: 60, // минимальная дистанция, которую должен пройти указатель, чтобы жест считался как свайп (px)
6+
maxDist: 120, // максимальная дистанция, не превышая которую может пройти указатель, чтобы жест считался как свайп (px)
7+
maxTime: 700, // максимальное время, за которое должен быть совершен свайп (ms)
8+
minTime: 50 // минимальное время, за которое должен быть совершен свайп (ms)
9+
}, sett);
10+
11+
// коррекция времени при ошибочных значениях
12+
if (settings.maxTime < settings.minTime) settings.maxTime = settings.minTime + 500;
13+
if (settings.maxTime < 100 || settings.minTime < 50) {
14+
settings.maxTime = 700;
15+
settings.minTime = 50;
16+
}
17+
18+
var dir, // направление свайпа (horizontal, vertical)
19+
swipeType, // тип свайпа (up, down, left, right)
20+
dist, // дистанция, пройденная указателем
21+
isMouse = false, // поддержка мыши (не используется для тач-событий)
22+
isMouseDown = false, // указание на активное нажатие мыши (не используется для тач-событий)
23+
startX = 0, // начало координат по оси X (pageX)
24+
distX = 0, // дистанция, пройденная указателем по оси X
25+
startY = 0, // начало координат по оси Y (pageY)
26+
distY = 0, // дистанция, пройденная указателем по оси Y
27+
startTime = 0, // время начала касания
28+
support = { // поддерживаемые браузером типы событий
29+
pointer: !!("PointerEvent" in window || ("msPointerEnabled" in window.navigator)),
30+
touch: !!(typeof window.orientation !== "undefined" || /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || "ontouchstart" in window || navigator.msMaxTouchPoints || "maxTouchPoints" in window.navigator > 1 || "msMaxTouchPoints" in window.navigator > 1)
31+
};
32+
33+
34+
var getSupportedEvents = function() {
35+
switch (true) {
36+
case support.pointer:
37+
events = {
38+
type: "pointer",
39+
start: "PointerDown",
40+
move: "PointerMove",
41+
end: "PointerUp",
42+
cancel: "PointerCancel",
43+
leave: "PointerLeave"
44+
};
45+
// добавление префиксов для IE10
46+
var ie10 = (window.navigator.msPointerEnabled && Function('/*@cc_on return document.documentMode===10@*/')());
47+
for (var value in events) {
48+
if (value === "type") continue;
49+
events[value] = (ie10) ? "MS" + events[value] : events[value].toLowerCase();
50+
}
51+
break;
52+
case support.touch:
53+
events = {
54+
type: "touch",
55+
start: "touchstart",
56+
move: "touchmove",
57+
end: "touchend",
58+
cancel: "touchcancel"
59+
};
60+
break;
61+
default:
62+
events = {
63+
type: "mouse",
64+
start: "mousedown",
65+
move: "mousemove",
66+
end: "mouseup",
67+
leave: "mouseleave"
68+
};
69+
break;
70+
}
71+
return events;
72+
};
73+
74+
75+
var eventsUnify = function(e) {
76+
return e.changedTouches ? e.changedTouches[0] : e;
77+
};
78+
79+
var checkStart = function(e) {
80+
var event = eventsUnify(e);
81+
if (support.touch && typeof e.touches !== "undefined" && e.touches.length !== 1) return; // игнорирование касания несколькими пальцами
82+
dir = "none";
83+
swipeType = "none";
84+
dist = 0;
85+
startX = event.pageX;
86+
startY = event.pageY;
87+
startTime = new Date().getTime();
88+
if (isMouse) isMouseDown = true; // поддержка мыши
89+
};
90+
91+
var checkMove = function(e) {
92+
if (isMouse && !isMouseDown) return; // выход из функции, если мышь перестала быть активна во время движения
93+
var event = eventsUnify(e);
94+
distX = event.pageX - startX;
95+
distY = event.pageY - startY;
96+
if (Math.abs(distX) > Math.abs(distY)) dir = (distX < 0) ? "left" : "right";
97+
else dir = (distY < 0) ? "up" : "down";
98+
};
99+
100+
var checkEnd = function(e) {
101+
if (isMouse && !isMouseDown) { // выход из функции и сброс проверки нажатия мыши
102+
isMouseDown = false;
103+
return;
104+
}
105+
var endTime = new Date().getTime();
106+
var time = endTime - startTime;
107+
if (time >= settings.minTime && time <= settings.maxTime) { // проверка времени жеста
108+
if (Math.abs(distX) >= settings.minDist && Math.abs(distY) <= settings.maxDist) {
109+
swipeType = dir; // опредление типа свайпа как "left" или "right"
110+
} else if (Math.abs(distY) >= settings.minDist && Math.abs(distX) <= settings.maxDist) {
111+
swipeType = dir; // опредление типа свайпа как "top" или "down"
112+
}
113+
}
114+
dist = (dir === "left" || dir === "right") ? Math.abs(distX) : Math.abs(distY); // опредление пройденной указателем дистанции
115+
116+
// генерация кастомного события swipe
117+
if (swipeType !== "none" && dist >= settings.minDist) {
118+
var swipeEvent = new CustomEvent("swipe", {
119+
bubbles: true,
120+
cancelable: true,
121+
detail: {
122+
full: e, // полное событие Event
123+
dir: swipeType, // направление свайпа
124+
dist: dist, // дистанция свайпа
125+
time: time // время, потраченное на свайп
126+
}
127+
});
128+
el.dispatchEvent(swipeEvent);
129+
}
130+
};
131+
132+
// добавление поддерживаемых событий
133+
var events = getSupportedEvents();
134+
135+
// проверка наличия мыши
136+
if ((support.pointer && !support.touch) || events.type === "mouse") isMouse = true;
137+
138+
// добавление обработчиков на элемент
139+
el.addEventListener(events.start, checkStart);
140+
el.addEventListener(events.move, checkMove);
141+
el.addEventListener(events.end, checkEnd);
142+
if(support.pointer && support.touch) {
143+
el.addEventListener('lostpointercapture', checkEnd);
144+
}
145+
}

src/main.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import singleSpaVue from 'single-spa-vue';
33

44
import App from './App.vue';
55
import router from './router';
6-
import store from './store';
76

87
const vueLifecycles = singleSpaVue({
98
createApp,
@@ -16,7 +15,6 @@ const vueLifecycles = singleSpaVue({
1615
},
1716
handleInstance(app) {
1817
app.use(router);
19-
app.use(store);
2018
},
2119
});
2220

src/router/index.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,26 @@ import { createRouter, createWebHistory } from 'vue-router'
22

33
const routes = [
44
{
5-
path: '/timetable',
6-
name: 'Timetable',
5+
path: '/',
6+
name: 'timetable',
77
component: () => import('../views/Timetable.vue')
88
},
99
{
10-
path: '/timetable/init',
11-
name: 'Init',
10+
path: '/init',
11+
name: 'init',
1212
component: () => import('../views/Init.vue')
1313
}
1414
]
1515

1616
const router = createRouter({
17-
history: createWebHistory(process.env.BASE_URL),
17+
history: createWebHistory('/timetable'),
1818
routes
1919
})
2020

2121
router.beforeEach((to, from, next) => {
22-
if (to.name !== 'Init' && !localStorage.getItem('timetable-group-id') && localStorage.getItem('timetable-group-id') != "-1")
23-
next({ name: 'Init' });
22+
console.log(to, from);
23+
if (to.name === 'timetable' && !localStorage.getItem('timetable-group-id') && localStorage.getItem('timetable-group-id') != "-1")
24+
next({ name: 'init' });
2425
else next();
2526
})
2627
export default router;

src/store/index.js

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/views/Init.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export default {
4141
console.log("groupId:", this.groupId);
4242
if (this.groupId && this.groupId != "-1") {
4343
localStorage.setItem("timetable-group-id", this.groupId);
44-
this.$router.push("/timetable");
44+
this.$router.push({name: 'timetable'});
4545
} else {
4646
alert("Пожалуйста, выберите номер группы!");
4747
}
@@ -75,7 +75,7 @@ export default {
7575
},
7676
beforeMount() {
7777
this.loadGroups();
78-
this.$store.commit("changePage", this.pageId);
78+
document.dispatchEvent(new CustomEvent("change-page", { detail: this.pageId }));
7979
},
8080
computed:{
8181
logoItem(){
@@ -131,7 +131,7 @@ p {
131131
}
132132
.group-selector:focus, :active {
133133
box-shadow: none;
134-
border-width: 1px;
134+
border-width: 1px;
135135
border-color: #ced4da;
136136
}
137137
.save-button {

src/views/Timetable.vue

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@
1414

1515
<script>
1616
import EventRow from '@/components/EventRow.vue'
17+
import swipe from '@/events/swipe'
1718
export default {
1819
name: "Timetable",
19-
20-
mounted() {
21-
this.groupId = localStorage.getItem('timetable-group-id');
22-
this.loadGroupInfo();
23-
this.loadTimetableOnDate(this.$store.state.date);
24-
},
2520
data() {
2621
return {
2722
loaded: true,
2823
pageId: 1,
24+
date: new Date(),
2925
groupId: null,
3026
groupInfo: { number: '' },
3127
timetable: [],
@@ -45,7 +41,6 @@ export default {
4541
loadTimetableOnDate(date) {
4642
var time_start = new Date(date);
4743
time_start.setHours(time_start.getHours() - date.getTimezoneOffset() / 60)
48-
console.log(time_start.toISOString())
4944
var time_end = new Date(time_start);
5045
time_end.setDate(time_start.getDate() + 1)
5146
var url = new URL(`${process.env.VUE_APP_API_TIMETABLE}/timetable/event/`),
@@ -64,12 +59,34 @@ export default {
6459
this.loaded = true;
6560
})
6661
62+
},
63+
swipeEventHandler(detail) {
64+
var nextDate = new Date(this.date)
65+
if (detail.dir == 'right')
66+
nextDate.setDate(this.date.getDate() + 1);
67+
if (detail.dir == 'left')
68+
nextDate.setDate(this.date.getDate() - 1);
69+
document.dispatchEvent(new CustomEvent('change-main-date', { detail: { date: nextDate } }));
6770
}
71+
6872
},
6973
beforeMount() {
7074
document.dispatchEvent(new CustomEvent("change-page", { detail: this.pageId }));
71-
document.addEventListener('change-date', (e) => this.loadTimetableOnDate(e.detail));
72-
}
75+
document.addEventListener('change-date', (e) => {
76+
console.log(this.date);
77+
this.date = e.detail.date;
78+
console.log(e.detail.date);
79+
this.loadTimetableOnDate(this.date);
80+
});
81+
},
82+
mounted() {
83+
this.groupId = localStorage.getItem('timetable-group-id');
84+
this.loadGroupInfo();
85+
// вызов функции swipe с предварительными настройками
86+
swipe(document, { maxTime: 2000, minTime: 100, maxDist: 300, minDist: 60 });
87+
// обработка свайпов
88+
document.addEventListener("swipe", (e) => this.swipeEventHandler(e.detail));
89+
},
7390
};
7491
7592
</script>

yarn.lock

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,7 +1526,7 @@
15261526
optionalDependencies:
15271527
prettier "^1.18.2 || ^2.0.0"
15281528

1529-
"@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.1.4":
1529+
"@vue/devtools-api@^6.1.4":
15301530
version "6.2.1"
15311531
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092"
15321532
integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
@@ -8501,13 +8501,6 @@ vue@^3.0.0:
85018501
"@vue/server-renderer" "3.2.37"
85028502
"@vue/shared" "3.2.37"
85038503

8504-
vuex@^4.0.2:
8505-
version "4.0.2"
8506-
resolved "https://registry.yarnpkg.com/vuex/-/vuex-4.0.2.tgz#f896dbd5bf2a0e963f00c67e9b610de749ccacc9"
8507-
integrity sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==
8508-
dependencies:
8509-
"@vue/devtools-api" "^6.0.0-beta.11"
8510-
85118504
watchpack-chokidar2@^2.0.1:
85128505
version "2.0.1"
85138506
resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"

0 commit comments

Comments
 (0)