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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad8868fd8f6e296c1439f90772bf3c16e724d551ed095d6627250b8182bd486c
4
- data.tar.gz: 29cabd18b3071e083f7ff8964bf8005f218da9985e35f6bcc80f030ac2677924
3
+ metadata.gz: 876ccf8ab0ab45c5d2ea73d3a2abd8d396e5abcedf8c30d7fbdd3c18fbaf9f00
4
+ data.tar.gz: af5b8ea84efcfd064cf7a265405ecc5d0460bb338ec12f4fc25d3c4ac2e885e1
5
5
  SHA512:
6
- metadata.gz: bb520764c8df5cfa6b6b012d5e28e219c0a664124caaa07f58ce46ed7a56d079290d7bb8bf1e7f27c02805fd7faca35b051b4df60e3fb94a40112066ad258bf8
7
- data.tar.gz: 9f832dae5fbb1443e52a9fb4f621b3a8052d308cc88d05d08089e6f2e423f27c815f4e9ecaac3f1c153ce828e470ee5947d528175b4d83c20f7b70eb05bd71ee
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cdek
4
- VERSION = "0.3.13"
4
+ VERSION = "0.3.14"
5
5
  end
@@ -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
- if (this._widget) {
105
- try {
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
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cdek
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.13
4
+ version: 0.3.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Korolyov