@sanity/document-internationalization 0.1.5 → 0.3.0

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.
@@ -4,6 +4,7 @@ var React = require('react');
4
4
  var DocumentPaneContext = require('@sanity/desk-tool/lib/panes/document/DocumentPaneContext');
5
5
  var languageFilterImplementations = require('all:part:@sanity/desk-tool/language-select-component');
6
6
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
7
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
7
8
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
8
9
  var ui = require('@sanity/ui');
9
10
  var icons = require('@sanity/icons');
@@ -21,7 +22,7 @@ require('@sanity/types');
21
22
  var reactHooks = require('@sanity/react-hooks');
22
23
  var shouldReloadFn = require('part:@sanity/document-internationalization/languages/should-reload?');
23
24
  var documentStore = require('part:@sanity/base/datastore/document');
24
- var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
25
+ var operators = require('rxjs/operators');
25
26
  var _extends = require('@babel/runtime/helpers/extends');
26
27
  var color = require('@sanity/color');
27
28
  var deskTool = require('@sanity/desk-tool');
@@ -50,6 +51,7 @@ function _interopNamespace(e) {
50
51
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
51
52
  var languageFilterImplementations__default = /*#__PURE__*/_interopDefaultLegacy(languageFilterImplementations);
52
53
  var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
54
+ var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
53
55
  var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
54
56
  var _taggedTemplateLiteral__default = /*#__PURE__*/_interopDefaultLegacy(_taggedTemplateLiteral);
55
57
  var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
@@ -62,7 +64,6 @@ var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regenerat
62
64
  var languagesLoaderFn__default = /*#__PURE__*/_interopDefaultLegacy(languagesLoaderFn);
63
65
  var shouldReloadFn__default = /*#__PURE__*/_interopDefaultLegacy(shouldReloadFn);
64
66
  var documentStore__default = /*#__PURE__*/_interopDefaultLegacy(documentStore);
65
- var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
66
67
  var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
67
68
 
68
69
  var objectSafeGet = get;
@@ -127,256 +128,85 @@ function get(obj, propsArg, defaultValue) {
127
128
  return obj;
128
129
  }
129
130
 
130
- // Inspiration: https://github.com/facebook/react/issues/3386
131
-
132
- function replace (string, regexpOrSubstr, newValueOrFn, globalOffset) {
133
- if (typeof string !== 'string') throw new Error('First param must be a string')
134
- if (typeof regexpOrSubstr !== 'string' && !(regexpOrSubstr instanceof RegExp)) throw new Error('Second param must be a string pattern or a regular expression')
135
-
136
- var fn = (typeof regexpOrSubstr === 'string') ? replaceUsingString : replaceUsingRegexp;
137
-
138
- return fn(string, regexpOrSubstr, newValueOrFn, globalOffset)
139
- }
140
-
141
- function replaceUsingString (string, patternString, newValueOrFn, globalOffset) {
142
- var index = string.indexOf(patternString);
143
-
144
- if (index >= 0) {
145
- var arr = [];
146
- var endIndex = index + patternString.length;
147
-
148
- if (index > 0) {
149
- arr.push(string.substring(0, index));
150
- }
151
-
152
- arr.push(
153
- (typeof newValueOrFn === 'function') ?
154
- newValueOrFn(
155
- string.substring(index, endIndex),
156
- index + globalOffset,
157
- string
158
- ) :
159
- newValueOrFn
160
- );
161
-
162
- if (endIndex < string.length) {
163
- arr.push(string.substring(endIndex));
164
- }
165
-
166
- return arr
167
- } else {
168
- return [string]
169
- }
170
- }
171
-
172
- function replaceUsingRegexp (string, regexp, newValueOrFn, globalOffset) {
173
- var output = [];
174
-
175
- var replacerIsFn = (typeof newValueOrFn === 'function');
176
-
177
- var storedLastIndex = regexp.lastIndex;
178
- regexp.lastIndex = 0;
179
-
180
- var result;
181
- var lastIndex = 0;
182
- while (result = regexp.exec(string)) {
183
- var index = result.index;
184
-
185
- if (result[0] === '') {
186
- // When the regexp is an empty string
187
- // we still want to advance our cursor to the next item.
188
- // This is the behavior of String.replace.
189
- regexp.lastIndex++;
190
- }
191
-
192
- if (index !== lastIndex) {
193
- output.push(string.substring(lastIndex, index));
194
- }
195
-
196
- var match = result[0];
197
- lastIndex = index + match.length;
198
-
199
- var out = replacerIsFn ?
200
- newValueOrFn.apply(this, result.concat(index + globalOffset, result.input)) :
201
- newValueOrFn;
202
- output.push(out);
203
-
204
- if (!regexp.global) {
205
- break
206
- }
207
- }
208
-
209
- if (lastIndex < string.length) {
210
- output.push(string.substring(lastIndex));
211
- }
212
-
213
- regexp.lastIndex = storedLastIndex;
214
- return output
215
- }
216
-
217
- var stringReplaceToArray = function stringReplaceToArray (stringOrArray, regexpOrSubstr, newSubStrOrFn) {
218
- if (typeof stringOrArray === 'string') {
219
- return replace(stringOrArray, regexpOrSubstr, newSubStrOrFn, 0)
220
- } else if (!Array.isArray(stringOrArray) || !stringOrArray[0]) {
221
- throw new TypeError('First argument must be an array or non-empty string')
222
- } else {
223
- var len = stringOrArray.length;
224
- var output = [];
225
- var globalOffset = 0;
226
- for (var i = 0; i < len; ++i) {
227
- var arrayItem = stringOrArray[i];
228
- if (typeof arrayItem === 'string') {
229
- output.push.apply(output, replace(arrayItem, regexpOrSubstr, newSubStrOrFn, globalOffset));
230
- globalOffset += arrayItem.length;
231
- } else {
232
- output.push(arrayItem);
233
- }
234
- }
235
- return output
236
- }
237
- };
238
-
239
- // This is based off of https://github.com/twitter/twemoji/blob/gh-pages/2/twemoji.js
240
- //
241
- // Ideally we'd use twemoji instead of replicating its logic.
242
- // The reason we can't is that we need to run our own replace.
243
- //
244
- // We could use it for most things (by essentially running twemoji.parse for each
245
- // regex match, and reading the code from the callback), but the one thing we'd always need
246
- // to copy and paste into this file is the regex since we need it to run the replace.
247
- //
248
- // Another option is to fork twemoji and expose a method in it that could help us, then
249
- // ask them to pull it in.
250
- //
251
-
252
- // RegExp based on emoji's official Unicode standards
253
- // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt
254
- var re = /(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g;
255
-
256
- function toCodePoint(unicodeSurrogates, sep) {
257
- var
258
- r = [],
259
- c = 0,
260
- p = 0,
261
- i = 0;
262
-
263
- while (i < unicodeSurrogates.length) {
264
- c = unicodeSurrogates.charCodeAt(i++);
265
- if (p) {
266
- r.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16));
267
- p = 0;
268
- } else if (0xD800 <= c && c <= 0xDBFF) {
269
- p = c;
270
- } else {
271
- r.push(c.toString(16));
272
- }
273
- }
274
- return r.join(sep || '-')
275
- }
276
-
277
- // avoid runtime RegExp creation for not so smart,
278
- // not JIT based, and old browsers / engines
279
- var UFE0Fg = /\uFE0F/g;
280
-
281
- // avoid using a string literal like '\u200D' here because minifiers expand it inline
282
- var U200D = String.fromCharCode(0x200D);
283
-
284
131
  /**
285
- * Used to both remove the possible variant
286
- * and to convert utf16 into code points.
287
- * If there is a zero-width-joiner (U+200D), leave the variants in.
288
- * @param string the raw text of the emoji match
289
- */
290
- function grabTheRightIcon(rawText) {
291
- // if variant is present as \uFE0F
292
- return toCodePoint(rawText.indexOf(U200D) < 0 ?
293
- rawText.replace(UFE0Fg, '') :
294
- rawText
295
- );
296
- }
297
-
298
- var replaceEmoji$1 = function replaceEmoji (string, render) {
299
- // Note: the latest regex added an empty matching group, so we ignore it.
300
- return stringReplaceToArray(string, re, function emojiReplacer (match, _, offset) {
301
- var icon = grabTheRightIcon(match);
302
- return render(icon, match, offset)
303
- })
304
- };
305
-
306
- var createElement = React__default["default"].createElement;
307
-
308
- var pageProtocol = (typeof location === 'undefined') ? '' : ((location.protocol === 'https:') ? 'https:' : 'http:');
309
-
310
- var emojiStyle = {
311
- height: '1em',
312
- width: '1em',
313
- margin: '0 .05em 0 .1em',
314
- verticalAlign: '-0.1em'
315
- };
316
-
317
- // Accept protocol with or without a colon
318
- function normalizeProtocol(protocol) {
319
- if (protocol && protocol.length > 0 && protocol.charAt(protocol.length - 1) !== ':') {
320
- return protocol + ':'
321
- }
322
- return protocol
323
- }
324
-
325
- var makeTwemojiRenderer$1 = function makeTwemojiRenderer(options) {
326
- options = merge({
327
- protocol: pageProtocol,
328
- baseUrl: '//twemoji.maxcdn.com/2/',
329
- size: '72x72',
330
- ext: '.png',
331
- props: null
332
- }, options);
333
-
334
- return function renderTwemoji (icon, match, offset) {
335
- var src = '';
336
- if (options.baseUrl.indexOf('http') !== 0) {
337
- src += normalizeProtocol(options.protocol);
338
- }
339
-
340
- src += options.baseUrl + options.size + '/' + icon + options.ext;
341
-
342
- return createElement(
343
- 'img',
344
- merge({
345
- key: offset,
346
- alt: match,
347
- draggable: false,
348
- src: src,
349
- style: emojiStyle
350
- }, options.props)
351
- )
352
- }
353
- };
354
-
355
- function merge() {
356
- var out = {}, len = arguments.length;
357
- for(var i = 0; i < len; ++i) {
358
- var source = arguments[i];
359
- if (source) {
360
- for (var key in source) {
361
- if (Object.prototype.hasOwnProperty.call(source, key)) {
362
- out[key] = source[key];
363
- }
364
- }
365
- }
366
- }
367
- return out
132
+ * @var {Object} cache
133
+ */
134
+ var cache = new Map();
135
+ /**
136
+ * Check if emoji is supported with cache
137
+ *
138
+ * @params {string} unicode
139
+ * @returns {boolean}
140
+ */
141
+ function isEmojiSupported(unicode) {
142
+ if (cache.has(unicode)) {
143
+ return cache.get(unicode);
144
+ }
145
+ var supported = isSupported(unicode);
146
+ cache.set(unicode, supported);
147
+ return supported;
368
148
  }
149
+ /**
150
+ * Check if the two pixels parts are perfectly the sames
151
+ *
152
+ * @params {string} unicode
153
+ * @returns {boolean}
154
+ */
155
+ var isSupported = (function () {
156
+ var ctx = null;
157
+ try {
158
+ ctx = document.createElement('canvas').getContext('2d');
159
+ }
160
+ catch (_a) { }
161
+ // Not in browser env
162
+ if (!ctx) {
163
+ return function () { return false; };
164
+ }
165
+ var CANVAS_HEIGHT = 25;
166
+ var CANVAS_WIDTH = 20;
167
+ var textSize = Math.floor(CANVAS_HEIGHT / 2);
168
+ // Initialize convas context
169
+ ctx.font = textSize + 'px Arial, Sans-Serif';
170
+ ctx.textBaseline = 'top';
171
+ ctx.canvas.width = CANVAS_WIDTH * 2;
172
+ ctx.canvas.height = CANVAS_HEIGHT;
173
+ return function (unicode) {
174
+ ctx.clearRect(0, 0, CANVAS_WIDTH * 2, CANVAS_HEIGHT);
175
+ // Draw in red on the left
176
+ ctx.fillStyle = '#FF0000';
177
+ ctx.fillText(unicode, 0, 22);
178
+ // Draw in blue on right
179
+ ctx.fillStyle = '#0000FF';
180
+ ctx.fillText(unicode, CANVAS_WIDTH, 22);
181
+ var a = ctx.getImageData(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT).data;
182
+ var count = a.length;
183
+ var i = 0;
184
+ // Search the first visible pixel
185
+ for (; i < count && !a[i + 3]; i += 4)
186
+ ;
187
+ // No visible pixel
188
+ if (i >= count) {
189
+ return false;
190
+ }
191
+ // Emoji has immutable color, so we check the color of the emoji in two different colors
192
+ // the result show be the same.
193
+ var x = CANVAS_WIDTH + ((i / 4) % CANVAS_WIDTH);
194
+ var y = Math.floor(i / 4 / CANVAS_WIDTH);
195
+ var b = ctx.getImageData(x, y, 1, 1).data;
196
+ if (a[i] !== b[0] || a[i + 2] !== b[2]) {
197
+ return false;
198
+ }
199
+ // Some emojis are a contraction of different ones, so if it's not
200
+ // supported, it will show multiple characters
201
+ if (ctx.measureText(unicode).width >= CANVAS_WIDTH) {
202
+ return false;
203
+ }
204
+ // Supported
205
+ return true;
206
+ };
207
+ })();
369
208
 
370
- var replaceEmoji = replaceEmoji$1;
371
-
372
- var makeTwemojiRenderer = makeTwemojiRenderer$1;
373
-
374
- var reactEasyEmoji = function reactEasyEmoji (element, optionsOrFn) {
375
- var render = (typeof optionsOrFn === 'function') ? optionsOrFn : makeTwemojiRenderer(optionsOrFn);
376
- return replaceEmoji(element, render)
377
- };
378
-
379
- var emoji = reactEasyEmoji;
209
+ function t(t="Twemoji Country Flags",e="https://cdn.jsdelivr.net/npm/country-flag-emoji-polyfill@0.1/dist/TwemojiCountryFlags.woff2"){if(isEmojiSupported("😊")&&!isEmojiSupported("🇨🇭")){const n=document.createElement("style");return n.textContent=`@font-face {\n font-family: "${t}";\n unicode-range: U+1F1E6-1F1FF, U+1F3F4, U+E0062-E0063, U+E0065, U+E0067,\n U+E006C, U+E006E, U+E0073-E0074, U+E0077, U+E007F;\n src: url('${e}') format('woff2');\n }`,document.head.appendChild(n),!0}return !1}
380
210
 
381
211
  /*
382
212
  These magic numbers are charCode math, where we take advantage of the offset
@@ -1175,8 +1005,10 @@ var getFlagCode = function getFlagCode() {
1175
1005
  }
1176
1006
  };
1177
1007
 
1178
- var _templateObject$2;
1008
+ var _templateObject$2, _templateObject2$1;
1009
+ t();
1179
1010
  var FlagImageContainer = styled__default["default"].span(_templateObject$2 || (_templateObject$2 = _taggedTemplateLiteral__default["default"](["\n display: block;\n padding: 1px;\n font-size: 19px;\n margin: 0px -0.05em 0px -0.1em;\n\n & img {\n display: block;\n }\n"])));
1011
+ var EmojiSpan = styled__default["default"].span(_templateObject2$1 || (_templateObject2$1 = _taggedTemplateLiteral__default["default"](["\n font-family: 'Twemoji Country Flags';\n"])));
1180
1012
  var SingleFlag = function SingleFlag(_ref) {
1181
1013
  var code = _ref.code,
1182
1014
  langCulture = _ref.langCulture,
@@ -1200,7 +1032,7 @@ var SingleFlag = function SingleFlag(_ref) {
1200
1032
  className: className
1201
1033
  }, CustomFlagComponent && code ? /*#__PURE__*/React__default["default"].createElement(CustomFlagComponent, {
1202
1034
  code: code
1203
- }) : emoji(flagEmoji) || '🏳️‍🌈');
1035
+ }) : /*#__PURE__*/React__default["default"].createElement(EmojiSpan, null, flagEmoji) || '🏳️‍🌈');
1204
1036
  };
1205
1037
 
1206
1038
  var getSchema = function getSchema(name) {
@@ -1464,64 +1296,190 @@ function useLanguages(document) {
1464
1296
  return [pending, languages];
1465
1297
  }
1466
1298
 
1467
- var useIsomorphicEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;
1468
- function useManyObservables(observables) {
1469
- var subscriptions = React.useRef([]);
1470
- var isInitial = React.useRef(true);
1299
+ /* global Map:readonly, Set:readonly, ArrayBuffer:readonly */
1300
+ var hasElementType = typeof Element !== 'undefined';
1301
+ var hasMap = typeof Map === 'function';
1302
+ var hasSet = typeof Set === 'function';
1303
+ var hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView;
1304
+
1305
+ // Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js
1306
+
1307
+ function equal(a, b) {
1308
+ // START: fast-deep-equal es6/index.js 3.1.1
1309
+ if (a === b) return true;
1310
+
1311
+ if (a && b && typeof a == 'object' && typeof b == 'object') {
1312
+ if (a.constructor !== b.constructor) return false;
1471
1313
 
1472
- var _useState = React.useState(function () {
1473
- var isSync = observables.map(function () {
1314
+ var length, i, keys;
1315
+ if (Array.isArray(a)) {
1316
+ length = a.length;
1317
+ if (length != b.length) return false;
1318
+ for (i = length; i-- !== 0;)
1319
+ if (!equal(a[i], b[i])) return false;
1474
1320
  return true;
1475
- });
1476
- var syncValues = observables.map(function () {
1477
- return null;
1478
- });
1479
- subscriptions.current = observables.map(function (observable, index) {
1480
- return observable.subscribe(function (nextVal) {
1481
- syncValues[index] = nextVal;
1321
+ }
1482
1322
 
1483
- if (!isSync[index]) {
1484
- setState(_toConsumableArray__default["default"](syncValues));
1485
- }
1323
+ // START: Modifications:
1324
+ // 1. Extra `has<Type> &&` helpers in initial condition allow es6 code
1325
+ // to co-exist with es5.
1326
+ // 2. Replace `for of` with es5 compliant iteration using `for`.
1327
+ // Basically, take:
1328
+ //
1329
+ // ```js
1330
+ // for (i of a.entries())
1331
+ // if (!b.has(i[0])) return false;
1332
+ // ```
1333
+ //
1334
+ // ... and convert to:
1335
+ //
1336
+ // ```js
1337
+ // it = a.entries();
1338
+ // while (!(i = it.next()).done)
1339
+ // if (!b.has(i.value[0])) return false;
1340
+ // ```
1341
+ //
1342
+ // **Note**: `i` access switches to `i.value`.
1343
+ var it;
1344
+ if (hasMap && (a instanceof Map) && (b instanceof Map)) {
1345
+ if (a.size !== b.size) return false;
1346
+ it = a.entries();
1347
+ while (!(i = it.next()).done)
1348
+ if (!b.has(i.value[0])) return false;
1349
+ it = a.entries();
1350
+ while (!(i = it.next()).done)
1351
+ if (!equal(i.value[1], b.get(i.value[0]))) return false;
1352
+ return true;
1353
+ }
1486
1354
 
1487
- isSync[index] = false;
1488
- });
1489
- });
1490
- return syncValues;
1491
- }),
1355
+ if (hasSet && (a instanceof Set) && (b instanceof Set)) {
1356
+ if (a.size !== b.size) return false;
1357
+ it = a.entries();
1358
+ while (!(i = it.next()).done)
1359
+ if (!b.has(i.value[0])) return false;
1360
+ return true;
1361
+ }
1362
+ // END: Modifications
1363
+
1364
+ if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
1365
+ length = a.length;
1366
+ if (length != b.length) return false;
1367
+ for (i = length; i-- !== 0;)
1368
+ if (a[i] !== b[i]) return false;
1369
+ return true;
1370
+ }
1371
+
1372
+ if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
1373
+ if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
1374
+ if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
1375
+
1376
+ keys = Object.keys(a);
1377
+ length = keys.length;
1378
+ if (length !== Object.keys(b).length) return false;
1379
+
1380
+ for (i = length; i-- !== 0;)
1381
+ if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
1382
+ // END: fast-deep-equal
1383
+
1384
+ // START: react-fast-compare
1385
+ // custom handling for DOM elements
1386
+ if (hasElementType && a instanceof Element) return false;
1387
+
1388
+ // custom handling for React/Preact
1389
+ for (i = length; i-- !== 0;) {
1390
+ if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {
1391
+ // React-specific: avoid traversing React elements' _owner
1392
+ // Preact-specific: avoid traversing Preact elements' __v and __o
1393
+ // __v = $_original / $_vnode
1394
+ // __o = $_owner
1395
+ // These properties contain circular references and are not needed when
1396
+ // comparing the actual elements (and not their owners)
1397
+ // .$$typeof and ._store on just reasonable markers of elements
1398
+
1399
+ continue;
1400
+ }
1401
+
1402
+ // all other properties should be traversed as usual
1403
+ if (!equal(a[keys[i]], b[keys[i]])) return false;
1404
+ }
1405
+ // END: react-fast-compare
1406
+
1407
+ // START: fast-deep-equal
1408
+ return true;
1409
+ }
1410
+
1411
+ return a !== a && b !== b;
1412
+ }
1413
+ // end fast-deep-equal
1414
+
1415
+ var reactFastCompare = function isEqual(a, b) {
1416
+ try {
1417
+ return equal(a, b);
1418
+ } catch (error) {
1419
+ if (((error.message || '').match(/stack|recursion/i))) {
1420
+ // warn on circular references, don't crash
1421
+ // browsers give this different errors name and messages:
1422
+ // chrome/safari: "RangeError", "Maximum call stack size exceeded"
1423
+ // firefox: "InternalError", too much recursion"
1424
+ // edge: "Error", "Out of stack space"
1425
+ console.warn('react-fast-compare cannot handle circular refs');
1426
+ return false;
1427
+ }
1428
+ // some other error. we should definitely know about these
1429
+ throw error;
1430
+ }
1431
+ };
1432
+
1433
+ var DEFAULT_PARAMS = {};
1434
+ var DEFAULT_OPTIONS = {
1435
+ apiVersion: "v2022-05-09"
1436
+ };
1437
+ function useListeningQuery(query) {
1438
+ var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_PARAMS;
1439
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
1440
+
1441
+ var _useState = React.useState(true),
1492
1442
  _useState2 = _slicedToArray__default["default"](_useState, 2),
1493
- value = _useState2[0],
1494
- setState = _useState2[1];
1495
-
1496
- useIsomorphicEffect(function () {
1497
- // when the observable changes after initial (possibly sync render)
1498
- if (!isInitial.current) {
1499
- subscriptions.current = observables.map(function (observable, index) {
1500
- return observable.subscribe(function (nextVal) {
1501
- value[index] = nextVal;
1502
- setState(_toConsumableArray__default["default"](value));
1443
+ loading = _useState2[0],
1444
+ setLoading = _useState2[1];
1445
+
1446
+ var _useState3 = React.useState(false),
1447
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1448
+ error = _useState4[0],
1449
+ setError = _useState4[1];
1450
+
1451
+ var _useState5 = React.useState(null),
1452
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
1453
+ data = _useState6[0],
1454
+ setData = _useState6[1];
1455
+
1456
+ var subscription = React.useRef(null);
1457
+ React.useEffect(function () {
1458
+ if (query) {
1459
+ subscription.current = documentStore__default["default"].listenQuery(query, params, options).pipe(operators.distinctUntilChanged(reactFastCompare), operators.catchError(function (err) {
1460
+ console.error(err);
1461
+ setError(err);
1462
+ setLoading(false);
1463
+ setData(null);
1464
+ return err;
1465
+ })).subscribe(function (documents) {
1466
+ setData(function (current) {
1467
+ return reactFastCompare(current, documents) ? current : documents;
1503
1468
  });
1469
+ setLoading(false);
1470
+ setError(false);
1504
1471
  });
1505
1472
  }
1506
1473
 
1507
- isInitial.current = false;
1508
1474
  return function () {
1509
- subscriptions.current.forEach(function (sub) {
1510
- sub.unsubscribe();
1511
- });
1512
- subscriptions.current = [];
1475
+ return subscription.current ? subscription.current.unsubscribe() : undefined;
1513
1476
  };
1514
- }, [observables]);
1515
- return value;
1516
- }
1517
-
1518
- function useManyEditStates(documentIds, documentType) {
1519
- var observables = React.useMemo(function () {
1520
- return documentIds.map(function (id) {
1521
- return documentStore__default["default"].pair.editState(id, documentType);
1522
- });
1523
- }, [documentIds, documentType]);
1524
- return useManyObservables(observables);
1477
+ }, [query, params, options]);
1478
+ return {
1479
+ loading: loading,
1480
+ error: error,
1481
+ data: data
1482
+ };
1525
1483
  }
1526
1484
 
1527
1485
  var baseToTop = function baseToTop(a, b) {
@@ -1871,43 +1829,74 @@ var LanguageSelect = function LanguageSelect(_ref) {
1871
1829
  }, [languages, currentLanguageCode]);
1872
1830
  var currentLanguageFlagCode = React__default["default"].useMemo(function () {
1873
1831
  return currentLanguageCode === null || currentLanguageCode === void 0 ? void 0 : currentLanguageCode.split(/[-_]/).pop();
1874
- }, [currentLanguageCode]);
1875
- var editStateIds = React__default["default"].useMemo(function () {
1832
+ }, [currentLanguageCode]); // Find and listen to changes on all potential language versions of documents
1833
+
1834
+ var query = "*[_type == $type && _id in $ids]{\n _id, \n \"".concat(config.fieldNames.lang, "\": ").concat(config.fieldNames.lang, "\n }");
1835
+ var queryParams = React__default["default"].useMemo(function () {
1876
1836
  var baseId = getBaseIdFromId(document._id);
1877
- return languages.map(function (lang) {
1837
+ var publishedIds = languages.map(function (lang) {
1878
1838
  return lang === baseLanguage ? baseId : buildDocId(baseId, lang.id);
1879
1839
  });
1880
- }, [baseLanguage, languages, document._id]);
1881
- var editStates = useManyEditStates(editStateIds, document._type);
1840
+ var draftIds = publishedIds.map(function (id) {
1841
+ return "drafts.".concat(id);
1842
+ });
1843
+ return {
1844
+ ids: [].concat(_toConsumableArray__default["default"](publishedIds), _toConsumableArray__default["default"](draftIds)),
1845
+ type: document._type
1846
+ };
1847
+ }, [baseLanguage, languages, document._id, document._type]);
1848
+
1849
+ var _useListeningQuery = useListeningQuery(query, queryParams),
1850
+ loading = _useListeningQuery.loading,
1851
+ data = _useListeningQuery.data; // Create a list of objects with current status
1852
+
1853
+
1882
1854
  var languagesObjects = React__default["default"].useMemo(function () {
1883
- var editStatePerLanguage = new Map();
1884
- editStates.forEach(function (state) {
1885
- var _state$draft;
1855
+ var draftLanguageObjects = [];
1856
+ var publishedLanguageObjects = [];
1857
+ var missingLanguageObjects = [];
1886
1858
 
1887
- var doc = (_state$draft = state === null || state === void 0 ? void 0 : state.draft) !== null && _state$draft !== void 0 ? _state$draft : state === null || state === void 0 ? void 0 : state.published;
1859
+ if (!(data !== null && data !== void 0 && data.length)) {
1860
+ return {
1861
+ draftLanguageObjects: draftLanguageObjects,
1862
+ publishedLanguageObjects: publishedLanguageObjects,
1863
+ missingLanguageObjects: missingLanguageObjects
1864
+ };
1865
+ } // Prefer drafts if they exist
1866
+
1867
+
1868
+ var filteredDocuments = data.reduce(function (acc, cur) {
1869
+ if (!cur._id.startsWith("drafts.")) {
1870
+ var alsoHasDraft = data.some(function (doc) {
1871
+ return doc._id === "drafts.".concat(cur._id);
1872
+ });
1873
+ return alsoHasDraft ? acc : [].concat(_toConsumableArray__default["default"](acc), [cur]);
1874
+ }
1875
+
1876
+ return [].concat(_toConsumableArray__default["default"](acc), [cur]);
1877
+ }, []);
1878
+ var editStatePerLanguage = new Map();
1879
+ filteredDocuments.forEach(function (doc) {
1888
1880
  var lang = objectSafeGet(doc !== null && doc !== void 0 ? doc : {}, config.fieldNames.lang);
1889
1881
  var isBase = doc && doc._id.replace(/^drafts\./, '') === getBaseIdFromId(doc._id);
1890
1882
 
1891
1883
  if (lang) {
1892
- editStatePerLanguage.set(lang, state);
1884
+ editStatePerLanguage.set(lang, doc);
1893
1885
  } else if (isBase && baseLanguage !== null && baseLanguage !== void 0 && baseLanguage.id) {
1894
- editStatePerLanguage.set(baseLanguage.id, state);
1886
+ editStatePerLanguage.set(baseLanguage.id, doc);
1895
1887
  }
1896
1888
  });
1897
- var draftLanguageObjects = [];
1898
- var publishedLanguageObjects = [];
1899
- var missingLanguageObjects = [];
1900
1889
  languages.forEach(function (lang, index) {
1901
1890
  var extendedObject = _objectSpread(_objectSpread({}, lang), {}, {
1902
1891
  isBase: baseLanguage ? lang.id === baseLanguage.id : index === 0,
1903
1892
  isCurrentLanguage: lang.id === currentLanguageCode
1904
1893
  });
1905
1894
 
1906
- var editState = editStatePerLanguage.get(lang.id);
1895
+ var doc = editStatePerLanguage.get(lang.id);
1907
1896
 
1908
- if (editState !== null && editState !== void 0 && editState.published) {
1897
+ if (doc !== null && doc !== void 0 && doc._id && !doc._id.startsWith("drafts.")) {
1909
1898
  publishedLanguageObjects.push(extendedObject);
1910
- } else if (editState !== null && editState !== void 0 && editState.draft) {
1899
+ } else if (doc !== null && doc !== void 0 && doc._id && doc._id.startsWith("drafts.")) {
1911
1900
  draftLanguageObjects.push(extendedObject);
1912
1901
  } else {
1913
1902
  missingLanguageObjects.push(extendedObject);
@@ -1918,14 +1907,14 @@ var LanguageSelect = function LanguageSelect(_ref) {
1918
1907
  publishedLanguageObjects: publishedLanguageObjects,
1919
1908
  missingLanguageObjects: missingLanguageObjects
1920
1909
  };
1921
- }, [config, languages, baseLanguage, editStates, currentLanguageCode]);
1910
+ }, [config, languages, baseLanguage, data, currentLanguageCode]);
1922
1911
 
1923
- if (!currentLanguageObject || !currentLanguageCode || pending || languages.length === 0) {
1912
+ if (!currentLanguageObject || !currentLanguageCode || pending || loading || languages.length === 0) {
1924
1913
  return /*#__PURE__*/React__default["default"].createElement(ui.Button, {
1925
1914
  disabled: true,
1926
1915
  mode: "bleed",
1927
1916
  padding: 3,
1928
- loading: pending,
1917
+ loading: pending || loading,
1929
1918
  iconRight: icons.ChevronDownIcon,
1930
1919
  text: UiMessages.languageSelect.placeholder
1931
1920
  });
@@ -1973,7 +1962,7 @@ var LanguageSelectContainer = function LanguageSelectContainer(_ref) {
1973
1962
  return null;
1974
1963
  }, []);
1975
1964
 
1976
- if (schemaType !== null && schemaType !== void 0 && schemaType.i18n && (_documentContext$disp = documentContext.displayed) !== null && _documentContext$disp !== void 0 && _documentContext$disp._id) {
1965
+ if (schemaType !== null && schemaType !== void 0 && schemaType.i18n && documentContext !== null && documentContext !== void 0 && (_documentContext$disp = documentContext.displayed) !== null && _documentContext$disp !== void 0 && _documentContext$disp._id) {
1977
1966
  return /*#__PURE__*/React__default["default"].createElement(LanguageSelect, {
1978
1967
  schemaType: schemaType,
1979
1968
  document: documentContext.displayed