cdek 0.3.13 → 0.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/lib/cdek/version.rb +1 -1
- data/lib/generators/cdek/install/templates/cdek_widget_controller.js +25 -7
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 876ccf8ab0ab45c5d2ea73d3a2abd8d396e5abcedf8c30d7fbdd3c18fbaf9f00
|
|
4
|
+
data.tar.gz: af5b8ea84efcfd064cf7a265405ecc5d0460bb338ec12f4fc25d3c4ac2e885e1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6da66c243aeba6ee2c00c6f151b1873c9b5c47924eb89cf5f9a6031d9edc002d04320a7f71b419fcad64190c25c3968efcf1161538f228798a8953c360bf4502
|
|
7
|
+
data.tar.gz: d49a1accd14e41e2b4cf199e3f6a42892a61a32400e3f683519b12aa81a0b51d1d84ef47489bd35b47261aa3fc30c3da75df2e885604c436125d14e7f9f552ce
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.14
|
|
4
|
+
|
|
5
|
+
* Шаблон генератора `cdek_widget_controller.js` теперь держит ровно один
|
|
6
|
+
живой инстанс виджета на странице: предыдущий уничтожается синхронно
|
|
7
|
+
перед монтированием нового. `@cdek-it/widget` — Vue-приложение с
|
|
8
|
+
глобальным стором, поэтому два одновременно живых инстанса делили стор
|
|
9
|
+
и конфликтовали — при смене города (пересоздание модалки) старый инстанс
|
|
10
|
+
перезапрашивал офисы и пере-центрировал карту на прежний город (точки
|
|
11
|
+
выбранного города мелькали и пропадали). Добавлены module-level
|
|
12
|
+
`_activeWidget` и `destroyWidget()`; `disconnect` и `_mountWidget`
|
|
13
|
+
переведены на них. Хост-приложениям, сгенерировавшим контроллер на
|
|
14
|
+
≤0.3.13, нужно перегенерировать его (`bin/rails generate cdek:install`)
|
|
15
|
+
или внести правку вручную.
|
|
16
|
+
|
|
3
17
|
## 0.3.13
|
|
4
18
|
|
|
5
19
|
* Виджет ПВЗ больше не откатывает центр карты на Москву при выборе
|
data/lib/cdek/version.rb
CHANGED
|
@@ -28,6 +28,24 @@ import { Controller } from "@hotwired/stimulus"
|
|
|
28
28
|
|
|
29
29
|
let _scriptPromise = null
|
|
30
30
|
|
|
31
|
+
// @cdek-it/widget@3 — Vue-приложение с ГЛОБАЛЬНЫМ стором (singleton). Два
|
|
32
|
+
// живых инстанса делят один стор и конфликтуют: монтаж нового перенастраивает
|
|
33
|
+
// общий стор, и старый перезапрашивает офисы и пере-центрирует карту на
|
|
34
|
+
// прежний город (в server-логах — повторные widget_service по старому городу
|
|
35
|
+
// сразу после нового). Поэтому держим ровно один живой виджет на странице и
|
|
36
|
+
// гасим предыдущий ПЕРЕД монтажом нового. destroy() у виджета бросает, если он
|
|
37
|
+
// ещё не домонтировался, — глушим, ссылку всё равно чистим.
|
|
38
|
+
let _activeWidget = null
|
|
39
|
+
|
|
40
|
+
function destroyWidget(widget) {
|
|
41
|
+
if (!widget) return
|
|
42
|
+
try {
|
|
43
|
+
if (typeof widget.destroy === "function") widget.destroy()
|
|
44
|
+
else if (typeof widget.close === "function") widget.close()
|
|
45
|
+
} catch (_) { /* виджет мог не домонтироваться — это ок */ }
|
|
46
|
+
if (_activeWidget === widget) _activeWidget = null
|
|
47
|
+
}
|
|
48
|
+
|
|
31
49
|
function ensureWidgetScript(url) {
|
|
32
50
|
if (typeof window.CDEKWidget !== "undefined") {
|
|
33
51
|
return Promise.resolve()
|
|
@@ -101,13 +119,8 @@ export default class extends Controller {
|
|
|
101
119
|
window.clearTimeout(this._mountTimer)
|
|
102
120
|
this._mountTimer = null
|
|
103
121
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (typeof this._widget.destroy === "function") this._widget.destroy()
|
|
107
|
-
else if (typeof this._widget.close === "function") this._widget.close()
|
|
108
|
-
} catch (_) { /* no-op */ }
|
|
109
|
-
this._widget = null
|
|
110
|
-
}
|
|
122
|
+
destroyWidget(this._widget)
|
|
123
|
+
this._widget = null
|
|
111
124
|
}
|
|
112
125
|
|
|
113
126
|
_mountWhenReady() {
|
|
@@ -193,8 +206,13 @@ export default class extends Controller {
|
|
|
193
206
|
widgetOptions.goods = goods
|
|
194
207
|
}
|
|
195
208
|
|
|
209
|
+
// Гасим любой предыдущий инстанс ДО создания нового — иначе два виджета
|
|
210
|
+
// дерутся за глобальный стор (старый город перезапрашивается, карта прыгает).
|
|
211
|
+
destroyWidget(_activeWidget)
|
|
212
|
+
|
|
196
213
|
try {
|
|
197
214
|
this._widget = new window.CDEKWidget(widgetOptions)
|
|
215
|
+
_activeWidget = this._widget
|
|
198
216
|
} catch (err) {
|
|
199
217
|
this._showError(err && err.message ? err.message : "ошибка инициализации виджета")
|
|
200
218
|
}
|