@sanity/document-internationalization 0.1.6 → 0.3.1

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
@@ -1108,7 +938,7 @@ var UiMessages = {
1108
938
  loading: 'Loading languages...',
1109
939
  draft: 'Draft',
1110
940
  missingTranslations: 'Following languages are missing some translations compared to the base language',
1111
- base: 'Base Translation',
941
+ base: 'Base',
1112
942
  missing: 'Missing',
1113
943
  deleteAll: {
1114
944
  buttonTitle: 'Delete (incl. translations)',
@@ -1175,8 +1005,10 @@ var getFlagCode = function getFlagCode() {
1175
1005
  }
1176
1006
  };
1177
1007
 
1178
- var _templateObject$2;
1179
- 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"])));
1008
+ var _templateObject$2, _templateObject2$2;
1009
+ t();
1010
+ var FlagImageContainer = styled__default["default"].span(_templateObject$2 || (_templateObject$2 = _taggedTemplateLiteral__default["default"](["\n display: block;\n font-size: 19px;\n transform: translateY(-1px);\n\n & img {\n display: block;\n }\n"])));
1011
+ var EmojiSpan = styled__default["default"].span(_templateObject2$2 || (_templateObject2$2 = _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) {
@@ -1588,20 +1546,16 @@ var LanguageSelectContext = /*#__PURE__*/React.createContext({
1588
1546
  currentLanguage: null
1589
1547
  });
1590
1548
 
1591
- var _templateObject$1, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
1549
+ var _templateObject$1, _templateObject2$1, _templateObject3, _templateObject4, _templateObject5;
1592
1550
 
1593
1551
  function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1594
1552
 
1595
1553
  function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1596
1554
  var rotate = styled.keyframes(_templateObject$1 || (_templateObject$1 = _taggedTemplateLiteral__default["default"](["\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n"])));
1597
- var ListItemSpinner = styled__default["default"](icons.SpinnerIcon)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral__default["default"](["\n animation: ", " 500ms linear infinite;\n"])), rotate);
1598
- var ListItemBadge = styled__default["default"](ui.Text)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral__default["default"](["\n margin-left: ", ";\n margin-right: 35px;\n margin-top: 1px;\n\n & > span {\n display: inline-block;\n vertical-align: middle;\n }\n"])), function (_ref) {
1555
+ var ListItemSpinner = styled__default["default"](icons.SpinnerIcon)(_templateObject2$1 || (_templateObject2$1 = _taggedTemplateLiteral__default["default"](["\n animation: ", " 500ms linear infinite;\n"])), rotate);
1556
+ var ListItemSplitButton = styled__default["default"](ui.Button)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral__default["default"](["\n display: none;\n flex-shrink: 0;\n margin-left: 4px;\n\n & svg {\n display: block;\n color: ", ";\n }\n\n ", "\n"])), color.hues.gray[700].hex, function (_ref) {
1599
1557
  var theme = _ref.theme;
1600
- return "".concat(theme.sanity.space[2], "px");
1601
- });
1602
- var ListItemSplitButton = styled__default["default"](ui.Button)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral__default["default"](["\n display: none;\n flex-shrink: 0;\n margin-left: 4px;\n\n & svg {\n display: block;\n color: ", ";\n }\n\n ", "\n"])), color.hues.gray[700].hex, function (_ref2) {
1603
- var theme = _ref2.theme;
1604
- return styled.css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral__default["default"](["\n @media (min-width: ", "em) {\n display: block;\n }\n "])), theme.sanity.media[1] / 16);
1558
+ return styled.css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral__default["default"](["\n @media (min-width: ", "em) {\n display: block;\n }\n "])), theme.sanity.media[1] / 16);
1605
1559
  });
1606
1560
 
1607
1561
  var MenuItemButtonComponent = function MenuItemButtonComponent(props, ref) {
@@ -1612,19 +1566,19 @@ var MenuItemButtonComponent = function MenuItemButtonComponent(props, ref) {
1612
1566
  };
1613
1567
 
1614
1568
  var MenuItemButton = /*#__PURE__*/React__default["default"].forwardRef(MenuItemButtonComponent);
1615
- var MenuItemSelectedButton = styled__default["default"].button(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral__default["default"](["\n color: ", ";\n background-color: ", ";\n\n span {\n color: ", ";\n }\n"])), function (_ref3) {
1616
- var theme = _ref3.theme;
1569
+ var MenuItemSelectedButton = styled__default["default"].button(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral__default["default"](["\n color: ", ";\n background-color: ", ";\n\n span {\n color: ", ";\n }\n"])), function (_ref2) {
1570
+ var theme = _ref2.theme;
1617
1571
  return theme.sanity.color.button["default"].primary.enabled.fg;
1572
+ }, function (_ref3) {
1573
+ var theme = _ref3.theme;
1574
+ return theme.sanity.color.button["default"].primary.enabled.bg;
1618
1575
  }, function (_ref4) {
1619
1576
  var theme = _ref4.theme;
1620
- return theme.sanity.color.button["default"].primary.enabled.bg;
1621
- }, function (_ref5) {
1622
- var theme = _ref5.theme;
1623
1577
  return theme.sanity.color.button["default"].primary.enabled.fg;
1624
1578
  });
1625
- var LanguageSelectListItem = function LanguageSelectListItem(_ref6) {
1626
- var status = _ref6.status,
1627
- language = _ref6.language;
1579
+ var LanguageSelectListItem = function LanguageSelectListItem(_ref5) {
1580
+ var status = _ref5.status,
1581
+ language = _ref5.language;
1628
1582
  var toast = ui.useToast();
1629
1583
 
1630
1584
  var _React$useContext = React__default["default"].useContext(LanguageSelectContext),
@@ -1774,7 +1728,9 @@ var LanguageSelectListItem = function LanguageSelectListItem(_ref6) {
1774
1728
  "data-selected": language.isCurrentLanguage,
1775
1729
  selected: language.isCurrentLanguage,
1776
1730
  icon: FlagIcon,
1777
- iconRight: !!baseTranslationBadgeLabel && /*#__PURE__*/React__default["default"].createElement(ListItemBadge, null, /*#__PURE__*/React__default["default"].createElement(ui.Badge, null, baseTranslationBadgeLabel)),
1731
+ iconRight: !!baseTranslationBadgeLabel && /*#__PURE__*/React__default["default"].createElement(ui.Badge, {
1732
+ fontSize: 0
1733
+ }, baseTranslationBadgeLabel),
1778
1734
  text: language.title,
1779
1735
  onClick: handleOpenClick
1780
1736
  }), !language.isCurrentLanguage && /*#__PURE__*/React__default["default"].createElement(ListItemSplitButton, {
@@ -1789,12 +1745,13 @@ var LanguageSelectListItem = function LanguageSelectListItem(_ref6) {
1789
1745
  })));
1790
1746
  };
1791
1747
 
1792
- var _templateObject;
1748
+ var _templateObject, _templateObject2;
1793
1749
 
1794
1750
  function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1795
1751
 
1796
1752
  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1797
1753
  var Divider = styled__default["default"](ui.Box)(_templateObject || (_templateObject = _taggedTemplateLiteral__default["default"](["\n border-bottom: 1px solid var(--card-shadow-outline-color);\n"])));
1754
+ var SelectorBox = styled__default["default"](ui.Box)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral__default["default"](["\n minwidth: 250;\n"])));
1798
1755
  var LanguageSelectList = function LanguageSelectList(_ref) {
1799
1756
  var draftLanguageObjects = _ref.draftLanguageObjects,
1800
1757
  publishedLanguageObjects = _ref.publishedLanguageObjects,
@@ -1813,7 +1770,7 @@ var LanguageSelectList = function LanguageSelectList(_ref) {
1813
1770
  });
1814
1771
  }))).sort(baseToTop).reverse();
1815
1772
  }, [draftLanguageObjects, publishedLanguageObjects]);
1816
- return /*#__PURE__*/React__default["default"].createElement(ui.Box, null, !!existingLanguageObjects.length && /*#__PURE__*/React__default["default"].createElement(ui.Box, null, /*#__PURE__*/React__default["default"].createElement(LanguageSelectLabel, null, UiMessages.languageSelect.listLabels.existing), /*#__PURE__*/React__default["default"].createElement(ui.Grid, {
1773
+ return /*#__PURE__*/React__default["default"].createElement(SelectorBox, null, !!existingLanguageObjects.length && /*#__PURE__*/React__default["default"].createElement(ui.Box, null, /*#__PURE__*/React__default["default"].createElement(LanguageSelectLabel, null, UiMessages.languageSelect.listLabels.existing), /*#__PURE__*/React__default["default"].createElement(ui.Grid, {
1817
1774
  columns: 1,
1818
1775
  gap: 1
1819
1776
  }, existingLanguageObjects.map(function (language) {
@@ -1871,43 +1828,74 @@ var LanguageSelect = function LanguageSelect(_ref) {
1871
1828
  }, [languages, currentLanguageCode]);
1872
1829
  var currentLanguageFlagCode = React__default["default"].useMemo(function () {
1873
1830
  return currentLanguageCode === null || currentLanguageCode === void 0 ? void 0 : currentLanguageCode.split(/[-_]/).pop();
1874
- }, [currentLanguageCode]);
1875
- var editStateIds = React__default["default"].useMemo(function () {
1831
+ }, [currentLanguageCode]); // Find and listen to changes on all potential language versions of documents
1832
+
1833
+ var query = "*[_type == $type && _id in $ids]{\n _id, \n \"".concat(config.fieldNames.lang, "\": ").concat(config.fieldNames.lang, "\n }");
1834
+ var queryParams = React__default["default"].useMemo(function () {
1876
1835
  var baseId = getBaseIdFromId(document._id);
1877
- return languages.map(function (lang) {
1836
+ var publishedIds = languages.map(function (lang) {
1878
1837
  return lang === baseLanguage ? baseId : buildDocId(baseId, lang.id);
1879
1838
  });
1880
- }, [baseLanguage, languages, document._id]);
1881
- var editStates = useManyEditStates(editStateIds, document._type);
1839
+ var draftIds = publishedIds.map(function (id) {
1840
+ return "drafts.".concat(id);
1841
+ });
1842
+ return {
1843
+ ids: [].concat(_toConsumableArray__default["default"](publishedIds), _toConsumableArray__default["default"](draftIds)),
1844
+ type: document._type
1845
+ };
1846
+ }, [baseLanguage, languages, document._id, document._type]);
1847
+
1848
+ var _useListeningQuery = useListeningQuery(query, queryParams),
1849
+ loading = _useListeningQuery.loading,
1850
+ data = _useListeningQuery.data; // Create a list of objects with current status
1851
+
1852
+
1882
1853
  var languagesObjects = React__default["default"].useMemo(function () {
1883
- var editStatePerLanguage = new Map();
1884
- editStates.forEach(function (state) {
1885
- var _state$draft;
1854
+ var draftLanguageObjects = [];
1855
+ var publishedLanguageObjects = [];
1856
+ var missingLanguageObjects = [];
1857
+
1858
+ if (!(data !== null && data !== void 0 && data.length)) {
1859
+ return {
1860
+ draftLanguageObjects: draftLanguageObjects,
1861
+ publishedLanguageObjects: publishedLanguageObjects,
1862
+ missingLanguageObjects: missingLanguageObjects
1863
+ };
1864
+ } // Prefer drafts if they exist
1865
+
1886
1866
 
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;
1867
+ var filteredDocuments = data.reduce(function (acc, cur) {
1868
+ if (!cur._id.startsWith("drafts.")) {
1869
+ var alsoHasDraft = data.some(function (doc) {
1870
+ return doc._id === "drafts.".concat(cur._id);
1871
+ });
1872
+ return alsoHasDraft ? acc : [].concat(_toConsumableArray__default["default"](acc), [cur]);
1873
+ }
1874
+
1875
+ return [].concat(_toConsumableArray__default["default"](acc), [cur]);
1876
+ }, []);
1877
+ var editStatePerLanguage = new Map();
1878
+ filteredDocuments.forEach(function (doc) {
1888
1879
  var lang = objectSafeGet(doc !== null && doc !== void 0 ? doc : {}, config.fieldNames.lang);
1889
1880
  var isBase = doc && doc._id.replace(/^drafts\./, '') === getBaseIdFromId(doc._id);
1890
1881
 
1891
1882
  if (lang) {
1892
- editStatePerLanguage.set(lang, state);
1883
+ editStatePerLanguage.set(lang, doc);
1893
1884
  } else if (isBase && baseLanguage !== null && baseLanguage !== void 0 && baseLanguage.id) {
1894
- editStatePerLanguage.set(baseLanguage.id, state);
1885
+ editStatePerLanguage.set(baseLanguage.id, doc);
1895
1886
  }
1896
1887
  });
1897
- var draftLanguageObjects = [];
1898
- var publishedLanguageObjects = [];
1899
- var missingLanguageObjects = [];
1900
1888
  languages.forEach(function (lang, index) {
1901
1889
  var extendedObject = _objectSpread(_objectSpread({}, lang), {}, {
1902
1890
  isBase: baseLanguage ? lang.id === baseLanguage.id : index === 0,
1903
1891
  isCurrentLanguage: lang.id === currentLanguageCode
1904
1892
  });
1905
1893
 
1906
- var editState = editStatePerLanguage.get(lang.id);
1894
+ var doc = editStatePerLanguage.get(lang.id);
1907
1895
 
1908
- if (editState !== null && editState !== void 0 && editState.published) {
1896
+ if (doc !== null && doc !== void 0 && doc._id && !doc._id.startsWith("drafts.")) {
1909
1897
  publishedLanguageObjects.push(extendedObject);
1910
- } else if (editState !== null && editState !== void 0 && editState.draft) {
1898
+ } else if (doc !== null && doc !== void 0 && doc._id && doc._id.startsWith("drafts.")) {
1911
1899
  draftLanguageObjects.push(extendedObject);
1912
1900
  } else {
1913
1901
  missingLanguageObjects.push(extendedObject);
@@ -1918,14 +1906,14 @@ var LanguageSelect = function LanguageSelect(_ref) {
1918
1906
  publishedLanguageObjects: publishedLanguageObjects,
1919
1907
  missingLanguageObjects: missingLanguageObjects
1920
1908
  };
1921
- }, [config, languages, baseLanguage, editStates, currentLanguageCode]);
1909
+ }, [config, languages, baseLanguage, data, currentLanguageCode]);
1922
1910
 
1923
- if (!currentLanguageObject || !currentLanguageCode || pending || languages.length === 0) {
1911
+ if (!currentLanguageObject || !currentLanguageCode || pending || loading || languages.length === 0) {
1924
1912
  return /*#__PURE__*/React__default["default"].createElement(ui.Button, {
1925
1913
  disabled: true,
1926
1914
  mode: "bleed",
1927
1915
  padding: 3,
1928
- loading: pending,
1916
+ loading: pending || loading,
1929
1917
  iconRight: icons.ChevronDownIcon,
1930
1918
  text: UiMessages.languageSelect.placeholder
1931
1919
  });
@@ -1973,7 +1961,7 @@ var LanguageSelectContainer = function LanguageSelectContainer(_ref) {
1973
1961
  return null;
1974
1962
  }, []);
1975
1963
 
1976
- if (schemaType !== null && schemaType !== void 0 && schemaType.i18n && (_documentContext$disp = documentContext.displayed) !== null && _documentContext$disp !== void 0 && _documentContext$disp._id) {
1964
+ 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
1965
  return /*#__PURE__*/React__default["default"].createElement(LanguageSelect, {
1978
1966
  schemaType: schemaType,
1979
1967
  document: documentContext.displayed