@sanity/language-filter 1.0.0-firstpass-v3-impl.1 → 1.0.0-v3-studio.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.
package/README.md CHANGED
@@ -135,3 +135,7 @@ Run ["CI & Release" workflow](https://github.com/sanity-io/language-filter/actio
135
135
  Make sure to select the main branch and check "Release new version".
136
136
 
137
137
  Semantic release will only release on configured branches, so it is safe to run release on any branch.
138
+
139
+ Note: main branch is configured to release a studio-v3 tagged version of the plugin.
140
+ To make semantic-release happy, the branch "semver-main-placeholder" is regarded as the non-prerelease branch,
141
+ but it is unused. The v2 version lives in the sanity mono-repo.
package/lib/cjs/index.js CHANGED
@@ -1,9 +1,6 @@
1
1
  var $k7rGe$reactjsxruntime = require("react/jsx-runtime");
2
2
  var $k7rGe$react = require("react");
3
3
  var $k7rGe$sanity = require("sanity");
4
- var $k7rGe$sanityform = require("sanity/form");
5
- var $k7rGe$sanitydesk = require("sanity/desk");
6
- var $k7rGe$sanityicons = require("@sanity/icons");
7
4
  var $k7rGe$sanityui = require("@sanity/ui");
8
5
 
9
6
  function $parcel$export(e, n, v, s) {
@@ -21,94 +18,6 @@ $parcel$export(module.exports, "usePaneLanguages", () => $b7317e67f107ab55$expor
21
18
 
22
19
 
23
20
 
24
-
25
-
26
-
27
- // NOTE: use `+` instead of `,` since the desk tool URL format already uses comma
28
- const $b7317e67f107ab55$var$LANG_ID_SEPARATOR = "+";
29
- function $b7317e67f107ab55$export$cd56401a2a088ead(props) {
30
- const { options: options } = props;
31
- const { params: params , setParams: setParams } = (0, $k7rGe$sanitydesk.usePaneRouter)();
32
- const { supportedLanguages: supportedLanguages , defaultLanguages: defaultLanguages } = options;
33
- const selectableLanguages = (0, $k7rGe$react.useMemo)(()=>supportedLanguages.filter((lang)=>!defaultLanguages?.includes(lang.id)), [
34
- supportedLanguages,
35
- defaultLanguages
36
- ]);
37
- const selectedLanguages = (0, $k7rGe$react.useMemo)(()=>{
38
- if (params?.langs === "$none") return [];
39
- if (params?.langs === "$all") return selectableLanguages.map((lang)=>lang.id);
40
- return params?.langs?.split($b7317e67f107ab55$var$LANG_ID_SEPARATOR) || selectableLanguages.map((lang)=>lang.id);
41
- }, [
42
- params,
43
- selectableLanguages
44
- ]);
45
- const selectAll = (0, $k7rGe$react.useCallback)(()=>{
46
- setParams({
47
- ...params,
48
- langs: "$all"
49
- });
50
- }, [
51
- params,
52
- setParams
53
- ]);
54
- const selectNone = (0, $k7rGe$react.useCallback)(()=>{
55
- setParams({
56
- ...params,
57
- langs: "$none"
58
- });
59
- }, [
60
- params,
61
- setParams
62
- ]);
63
- const toggleLanguage = (0, $k7rGe$react.useCallback)((languageId)=>{
64
- let lang = selectedLanguages;
65
- if (lang.includes(languageId)) lang = lang.filter((l)=>l !== languageId);
66
- else lang = [
67
- ...lang,
68
- languageId
69
- ];
70
- if (lang.length === 0) {
71
- setParams({
72
- ...params,
73
- langs: "$none"
74
- }) // none
75
- ;
76
- return;
77
- }
78
- if (lang.length === selectableLanguages.length) {
79
- setParams({
80
- ...params,
81
- langs: "$all"
82
- });
83
- return;
84
- }
85
- setParams({
86
- ...params,
87
- langs: lang.join($b7317e67f107ab55$var$LANG_ID_SEPARATOR)
88
- });
89
- }, [
90
- params,
91
- selectableLanguages,
92
- selectedLanguages,
93
- setParams
94
- ]);
95
- const visibleLanguages = (0, $k7rGe$react.useMemo)(()=>[
96
- ...defaultLanguages ?? [],
97
- ...selectedLanguages
98
- ], [
99
- defaultLanguages,
100
- selectedLanguages
101
- ]);
102
- return {
103
- visibleLanguages: visibleLanguages,
104
- allSelected: selectedLanguages.length === selectableLanguages.length,
105
- selectAll: selectAll,
106
- selectNone: selectNone,
107
- toggleLanguage: toggleLanguage
108
- };
109
- }
110
-
111
-
112
21
  const $f29012bc04d39674$export$373781be62a9896e = (enclosingType, field, selectedLanguageIds)=>!enclosingType.name.startsWith("locale") || selectedLanguageIds.includes(field.name);
113
22
  function $f29012bc04d39674$export$fe9baa09973dbf22(schemaType, options) {
114
23
  const schemaFilter = $f29012bc04d39674$var$isDocument(schemaType) && schemaType?.options?.languageFilter;
@@ -124,26 +33,101 @@ function $f29012bc04d39674$var$getRootType(schema) {
124
33
  }
125
34
 
126
35
 
36
+
37
+
38
+ const $bb26db9356030deb$var$LanguageFilterContext = /*#__PURE__*/ (0, $k7rGe$react.createContext)(undefined);
39
+ function $bb26db9356030deb$export$f00537e9911d9516({ options: options , enabled: enabled , children: children }) {
40
+ const value = (0, $k7rGe$react.useMemo)(()=>({
41
+ options: options,
42
+ enabled: enabled
43
+ }), [
44
+ options,
45
+ enabled
46
+ ]);
47
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($bb26db9356030deb$var$LanguageFilterContext.Provider, {
48
+ value: value,
49
+ children: children
50
+ });
51
+ }
52
+ function $bb26db9356030deb$export$d5c74ca916607f46() {
53
+ const value = (0, $k7rGe$react.useContext)($bb26db9356030deb$var$LanguageFilterContext);
54
+ if (!value) throw new Error("LanguageFilterContext is missing");
55
+ return value;
56
+ }
57
+
58
+
59
+
60
+ const $fe597f02a0bccb26$var$storageKey = "@sanity/plugin/language-filter/selected-languages";
61
+ function $fe597f02a0bccb26$export$f21c039050fb95eb(options) {
62
+ const selectableLangs = $fe597f02a0bccb26$export$76676750ed98bafe(options).map((l)=>l.id);
63
+ let selected = selectableLangs;
64
+ try {
65
+ const persistedValue = window.localStorage.getItem($fe597f02a0bccb26$var$storageKey);
66
+ if (persistedValue) selected = JSON.parse(persistedValue);
67
+ } catch (err) {} // eslint-disable-line no-empty
68
+ // constrain persisted/selected languages to the ones currently supported
69
+ selected = $fe597f02a0bccb26$var$intersection(selected, selectableLangs);
70
+ return selected;
71
+ }
72
+ function $fe597f02a0bccb26$export$833b55f5102c4e70(languageIds) {
73
+ window.localStorage.setItem($fe597f02a0bccb26$var$storageKey, JSON.stringify(languageIds));
74
+ }
75
+ function $fe597f02a0bccb26$var$intersection(array1, array2) {
76
+ return array1.filter((value)=>array2.includes(value));
77
+ }
78
+ function $fe597f02a0bccb26$export$76676750ed98bafe({ supportedLanguages: supportedLanguages , defaultLanguages: defaultLanguages }) {
79
+ return supportedLanguages.filter((lang)=>!defaultLanguages?.includes(lang.id));
80
+ }
81
+ function $fe597f02a0bccb26$export$b484a630b97f9ca3(options) {
82
+ return (0, $k7rGe$react.useState)(()=>$fe597f02a0bccb26$export$f21c039050fb95eb(options));
83
+ }
84
+
85
+
127
86
  function $a0f4109b367c6ff0$export$7f9ce1f19dc34df5(props) {
128
- const { members: membersProp , level: level , options: options , path: path , schemaType: schemaType , ...restProps } = props;
129
- const { visibleLanguages: visibleLanguages } = (0, $b7317e67f107ab55$export$cd56401a2a088ead)({
130
- options: options
87
+ const { options: options , enabled: enabled } = (0, $bb26db9356030deb$export$d5c74ca916607f46)();
88
+ const { next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
89
+ if (!enabled || !options) return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
90
+ children: next(restProps)
131
91
  });
92
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($a0f4109b367c6ff0$var$FilteredObjectInput, {
93
+ ...restProps,
94
+ next: next,
95
+ options: options,
96
+ subscribeSelectedIds: subscribeSelectedIds
97
+ });
98
+ }
99
+ function $a0f4109b367c6ff0$var$FilteredObjectInput(props) {
100
+ const { members: membersProp , options: options , schemaType: schemaType , next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
101
+ const [selectedIds, setSelectedIds] = (0, $fe597f02a0bccb26$export$b484a630b97f9ca3)(options);
102
+ (0, $k7rGe$react.useEffect)(()=>{
103
+ const unsubscribe = subscribeSelectedIds(setSelectedIds);
104
+ return ()=>unsubscribe();
105
+ }, [
106
+ subscribeSelectedIds,
107
+ setSelectedIds
108
+ ]);
109
+ const activeLanguages = (0, $k7rGe$react.useMemo)(()=>[
110
+ ...options.defaultLanguages ?? [],
111
+ ...selectedIds
112
+ ], [
113
+ options.defaultLanguages,
114
+ selectedIds
115
+ ]);
132
116
  const filterField = options.filterField ?? (0, $f29012bc04d39674$export$373781be62a9896e);
133
117
  const members = (0, $k7rGe$react.useMemo)(()=>{
134
- return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member, visibleLanguages) || member.kind === "fieldSet" && filterField(schemaType, member.fieldSet, visibleLanguages));
118
+ return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member, activeLanguages) || member.kind === "fieldSet" && filterField(schemaType, member.fieldSet, activeLanguages));
135
119
  }, [
136
120
  schemaType,
137
121
  membersProp,
138
122
  filterField,
139
- visibleLanguages
123
+ activeLanguages
140
124
  ]);
141
- return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityform.ObjectInput), {
142
- ...restProps,
143
- level: level,
144
- members: members,
145
- path: path,
146
- schemaType: schemaType
125
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
126
+ children: next({
127
+ ...restProps,
128
+ members: members,
129
+ schemaType: schemaType
130
+ })
147
131
  });
148
132
  }
149
133
 
@@ -153,13 +137,67 @@ function $a0f4109b367c6ff0$export$7f9ce1f19dc34df5(props) {
153
137
 
154
138
 
155
139
 
140
+ function $b7317e67f107ab55$export$cd56401a2a088ead(props) {
141
+ const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
142
+ const { defaultLanguages: defaultLanguages } = options;
143
+ const [selectedIds, setSelectedIds] = (0, $fe597f02a0bccb26$export$b484a630b97f9ca3)(options);
144
+ const selectableLanguages = (0, $k7rGe$react.useMemo)(()=>(0, $fe597f02a0bccb26$export$76676750ed98bafe)(options), [
145
+ options
146
+ ]);
147
+ const updateSelectedIds = (0, $k7rGe$react.useCallback)((ids)=>{
148
+ setSelectedIds(ids);
149
+ (0, $fe597f02a0bccb26$export$833b55f5102c4e70)(ids);
150
+ onSelectedIdsChange(ids);
151
+ }, [
152
+ onSelectedIdsChange,
153
+ setSelectedIds
154
+ ]);
155
+ const selectAll = (0, $k7rGe$react.useCallback)(()=>updateSelectedIds(selectableLanguages.map((l)=>l.id)), [
156
+ updateSelectedIds,
157
+ selectableLanguages
158
+ ]);
159
+ const selectNone = (0, $k7rGe$react.useCallback)(()=>{
160
+ updateSelectedIds([]);
161
+ }, [
162
+ updateSelectedIds
163
+ ]);
164
+ const toggleLanguage = (0, $k7rGe$react.useCallback)((languageId)=>{
165
+ let lang = selectedIds;
166
+ if (lang.includes(languageId)) lang = lang.filter((l)=>l !== languageId);
167
+ else lang = [
168
+ ...lang,
169
+ languageId
170
+ ];
171
+ updateSelectedIds(lang);
172
+ }, [
173
+ updateSelectedIds,
174
+ selectedIds
175
+ ]);
176
+ const activeLanguages = (0, $k7rGe$react.useMemo)(()=>[
177
+ ...defaultLanguages ?? [],
178
+ ...selectedIds
179
+ ], [
180
+ defaultLanguages,
181
+ selectedIds
182
+ ]);
183
+ return {
184
+ activeLanguages: activeLanguages,
185
+ allSelected: selectedIds.length === selectableLanguages.length,
186
+ selectAll: selectAll,
187
+ selectNone: selectNone,
188
+ toggleLanguage: toggleLanguage
189
+ };
190
+ }
191
+
192
+
156
193
  function $4de932c0c6553dd2$export$85fc605f11895007(props) {
157
- const { options: options } = props;
194
+ const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
158
195
  const defaultLanguages = options.supportedLanguages.filter((l)=>options.defaultLanguages?.includes(l.id));
159
196
  const languageOptions = options.supportedLanguages.filter((l)=>!options.defaultLanguages?.includes(l.id));
160
197
  const [open, setOpen] = (0, $k7rGe$react.useState)(false);
161
- const { visibleLanguages: visibleLanguages , allSelected: allSelected , selectAll: selectAll , selectNone: selectNone , toggleLanguage: toggleLanguage } = (0, $b7317e67f107ab55$export$cd56401a2a088ead)({
162
- options: options
198
+ const { activeLanguages: activeLanguages , allSelected: allSelected , selectAll: selectAll , selectNone: selectNone , toggleLanguage: toggleLanguage } = (0, $b7317e67f107ab55$export$cd56401a2a088ead)({
199
+ options: options,
200
+ onSelectedIdsChange: onSelectedIdsChange
163
201
  });
164
202
  const [button, setButton] = (0, $k7rGe$react.useState)(null);
165
203
  const [popover, setPopover] = (0, $k7rGe$react.useState)(null);
@@ -183,20 +221,22 @@ function $4de932c0c6553dd2$export$85fc605f11895007(props) {
183
221
  children: [
184
222
  defaultLanguages.length > 0 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
185
223
  radius: 2,
186
- tone: "primary",
187
224
  children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Stack), {
188
225
  padding: 2,
189
226
  space: 3,
190
227
  children: [
191
- /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Text), {
192
- size: 1,
193
- weight: "semibold",
194
- children: [
195
- "Default language",
196
- defaultLanguages.length > 1 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
197
- children: "s"
198
- })
199
- ]
228
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
229
+ paddingBottom: 2,
230
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Text), {
231
+ size: 1,
232
+ weight: "semibold",
233
+ children: [
234
+ "Default language",
235
+ defaultLanguages.length > 1 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
236
+ children: "s"
237
+ })
238
+ ]
239
+ })
200
240
  }),
201
241
  defaultLanguages.map((l)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
202
242
  children: l.title
@@ -210,7 +250,7 @@ function $4de932c0c6553dd2$export$85fc605f11895007(props) {
210
250
  space: 2,
211
251
  children: [
212
252
  /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
213
- paddingBottom: 1,
253
+ paddingBottom: 2,
214
254
  children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
215
255
  size: 1,
216
256
  weight: "semibold",
@@ -242,22 +282,47 @@ function $4de932c0c6553dd2$export$85fc605f11895007(props) {
242
282
  languageOptions.map((lang)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($4de932c0c6553dd2$var$LanguageFilterOption, {
243
283
  id: lang.id,
244
284
  onToggle: toggleLanguage,
245
- selected: visibleLanguages.includes(lang.id),
285
+ selected: activeLanguages.includes(lang.id),
246
286
  title: lang.title
247
287
  }, lang.id))
248
288
  ]
249
289
  })
250
290
  ]
251
291
  });
292
+ const langCount = options.supportedLanguages.length;
252
293
  return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Popover), {
253
- constrainSize: true,
254
294
  content: content,
255
295
  open: open,
256
296
  portal: true,
257
297
  ref: setPopover,
258
298
  children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Button), {
259
- icon: (0, $k7rGe$sanityicons.TranslateIcon),
260
- text: `Filter languages (${visibleLanguages.length}/${options.supportedLanguages.length})`,
299
+ text: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
300
+ gap: 1,
301
+ children: [
302
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
303
+ children: "Filter languages:"
304
+ }),
305
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
306
+ gap: 1,
307
+ justify: "space-around",
308
+ children: [
309
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Flex), {
310
+ style: {
311
+ width: `${Math.floor(Math.log10(langCount) + 1)}ch`
312
+ },
313
+ justify: "flex-end",
314
+ children: activeLanguages.length
315
+ }),
316
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
317
+ children: "/"
318
+ }),
319
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
320
+ children: langCount
321
+ })
322
+ ]
323
+ })
324
+ ]
325
+ }),
261
326
  mode: "bleed",
262
327
  onClick: handleClick,
263
328
  ref: setButton,
@@ -298,10 +363,31 @@ function $4de932c0c6553dd2$var$LanguageFilterOption(props) {
298
363
 
299
364
 
300
365
 
366
+
367
+ function $a3222324b33f4bdf$export$de189c01fb1f896d() {
368
+ const subs = [];
369
+ const onSelectedIdsChange = (ids)=>{
370
+ subs.forEach((s)=>s(ids));
371
+ };
372
+ const subscribeSelectedIds = (subscription)=>{
373
+ subs.push(subscription);
374
+ return ()=>{
375
+ subs.splice(subs.indexOf(subscription), 1);
376
+ };
377
+ };
378
+ return {
379
+ onSelectedIdsChange: onSelectedIdsChange,
380
+ subscribeSelectedIds: subscribeSelectedIds
381
+ };
382
+ }
383
+
384
+
301
385
  const $45e3093e7de8dca2$export$bae498c4212cce68 = (0, $k7rGe$sanity.createPlugin)((options)=>{
386
+ const { onSelectedIdsChange: onSelectedIdsChange , subscribeSelectedIds: subscribeSelectedIds } = (0, $a3222324b33f4bdf$export$de189c01fb1f896d)();
302
387
  const RenderLanguageFilter = ()=>{
303
388
  return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $4de932c0c6553dd2$export$85fc605f11895007), {
304
- options: options
389
+ options: options,
390
+ onSelectedIdsChange: onSelectedIdsChange
305
391
  });
306
392
  };
307
393
  return {
@@ -318,11 +404,18 @@ const $45e3093e7de8dca2$export$bae498c4212cce68 = (0, $k7rGe$sanity.createPlugin
318
404
  form: {
319
405
  renderInput (props, next) {
320
406
  const enabled = (0, $f29012bc04d39674$export$fe9baa09973dbf22)(props.schemaType, options);
321
- if (enabled && props.schemaType.jsonType === "object") return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $a0f4109b367c6ff0$export$7f9ce1f19dc34df5), {
407
+ // will only be considered enabled for document, so this is only done once
408
+ if (enabled) return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $bb26db9356030deb$export$f00537e9911d9516), {
409
+ enabled: enabled,
410
+ options: options,
411
+ children: next(props)
412
+ });
413
+ if (props.schemaType.jsonType === "object") return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $a0f4109b367c6ff0$export$7f9ce1f19dc34df5), {
322
414
  ...props,
323
- options: options
415
+ next: next,
416
+ subscribeSelectedIds: subscribeSelectedIds
324
417
  });
325
- return next(props);
418
+ return undefined;
326
419
  }
327
420
  }
328
421
  };
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/LanguageFilterObjectInput.tsx","src/usePaneLanguages.ts","src/filterField.ts","src/LanguageFilterMenuButton.tsx"],"sourcesContent":["/**\n * Plugin function\n */\nexport {languageFilter} from './plugin'\n\nexport {defaultFilterField, isLanguageFilterEnabled} from './filterField'\n\nexport type {\n LanguageFilterConfig,\n LanguageFilterSchema,\n LanguageFilterOptions,\n FilterFieldFunction,\n Language,\n} from './types'\n\nexport {\n LanguageFilterObjectInput,\n type LanguageFilterObjectInputProps,\n} from './LanguageFilterObjectInput'\n\nexport {\n LanguageFilterMenuButton,\n type LanguageFilterMenuButtonProps,\n} from './LanguageFilterMenuButton'\n\nexport {usePaneLanguages} from './usePaneLanguages'\n","import React from 'react'\nimport {_DocumentLanguageFilterComponent, createPlugin, ObjectInputProps} from 'sanity'\nimport {LanguageFilterObjectInput} from './LanguageFilterObjectInput'\nimport {LanguageFilterMenuButton} from './LanguageFilterMenuButton'\nimport {LanguageFilterConfig} from './types'\nimport {isLanguageFilterEnabled} from './filterField'\n\n/**\n * ## Usage in sanity.config.ts (or .js)\n *\n * ```\n * import {createConfig} from 'sanity'\n * import {languageFilter} from '@sanity/language-filter'\n *\n * export const createConfig({\n * /...\n * plugins: [\n * languageFilter({\n * supportedLanguages: [\n * {id: 'nb', title: 'Norwegian (Bokmål)'},\n * {id: 'nn', title: 'Norwegian (Nynorsk)'},\n * {id: 'en', title: 'English'},\n * {id: 'es', title: 'Spanish'},\n * {id: 'arb', title: 'Arabic'},\n * {id: 'pt', title: 'Portuguese'},\n * //...\n * ],\n * // Select Norwegian (Bokmål) by default\n * defaultLanguages: ['nb'],\n * // Only show language filter for document type `page` (schemaType.name)\n * // Can also enable via document-options: options.languageFilter: true\n * documentTypes: ['page'],\n * // default filter function shown\n * filterField: (enclosingType, field, selectedLanguageIds) =>\n * !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),\n * })\n * ]\n * })\n * ```\n */\nexport const languageFilter = createPlugin<LanguageFilterConfig>((options) => {\n const RenderLanguageFilter: _DocumentLanguageFilterComponent = () => {\n return <LanguageFilterMenuButton options={options} />\n }\n\n return {\n name: '@sanity/language-filter',\n document: {\n unstable_languageFilter: (prev, {schemaType, schema}) => {\n if (isLanguageFilterEnabled(schema.get(schemaType), options)) {\n return [...prev, RenderLanguageFilter]\n }\n return prev\n },\n },\n\n form: {\n renderInput(props, next) {\n const enabled = isLanguageFilterEnabled(props.schemaType, options)\n if (enabled && props.schemaType.jsonType === 'object') {\n return <LanguageFilterObjectInput {...(props as ObjectInputProps)} options={options} />\n }\n return next(props)\n },\n },\n }\n})\n","import React, {useMemo} from 'react'\nimport {ObjectInputProps, ObjectMember} from 'sanity'\nimport {ObjectInput} from 'sanity/form'\nimport {usePaneLanguages} from './usePaneLanguages'\nimport {LanguageFilterConfig} from './types'\nimport {defaultFilterField} from './filterField'\n\nexport type LanguageFilterObjectInputProps = {options: LanguageFilterConfig} & ObjectInputProps\n\nexport function LanguageFilterObjectInput(props: LanguageFilterObjectInputProps) {\n const {members: membersProp, level, options, path, schemaType, ...restProps} = props\n const {visibleLanguages} = usePaneLanguages({options})\n\n const filterField = options.filterField ?? defaultFilterField\n\n const members: ObjectMember[] = useMemo(() => {\n return membersProp.filter(\n (member) =>\n (member.kind === 'field' && filterField(schemaType, member, visibleLanguages)) ||\n (member.kind === 'fieldSet' && filterField(schemaType, member.fieldSet, visibleLanguages))\n )\n }, [schemaType, membersProp, filterField, visibleLanguages])\n\n return (\n <ObjectInput\n {...restProps}\n level={level}\n members={members}\n path={path}\n schemaType={schemaType}\n />\n )\n}\n","import {useCallback, useMemo} from 'react'\nimport {usePaneRouter} from 'sanity/desk'\nimport {LanguageFilterConfig} from './types'\n\n// NOTE: use `+` instead of `,` since the desk tool URL format already uses comma\nconst LANG_ID_SEPARATOR = '+'\n\nexport function usePaneLanguages(props: {options: LanguageFilterConfig}): {\n visibleLanguages: string[]\n allSelected: boolean\n selectAll: () => void\n selectNone: () => void\n toggleLanguage: (languageId: string) => void\n} {\n const {options} = props\n const {params, setParams} = usePaneRouter()\n const {supportedLanguages, defaultLanguages} = options\n\n const selectableLanguages = useMemo(\n () => supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id)),\n [supportedLanguages, defaultLanguages]\n )\n\n const selectedLanguages = useMemo(() => {\n if (params?.langs === '$none') {\n return []\n }\n\n if (params?.langs === '$all') {\n return selectableLanguages.map((lang) => lang.id)\n }\n\n return params?.langs?.split(LANG_ID_SEPARATOR) || selectableLanguages.map((lang) => lang.id)\n }, [params, selectableLanguages])\n\n const selectAll = useCallback(() => {\n setParams({...params, langs: '$all'})\n }, [params, setParams])\n\n const selectNone = useCallback(() => {\n setParams({...params, langs: '$none'})\n }, [params, setParams])\n\n const toggleLanguage = useCallback(\n (languageId: string) => {\n let lang = selectedLanguages\n\n if (lang.includes(languageId)) {\n lang = lang.filter((l) => l !== languageId)\n } else {\n lang = [...lang, languageId]\n }\n\n if (lang.length === 0) {\n setParams({...params, langs: '$none'}) // none\n return\n }\n\n if (lang.length === selectableLanguages.length) {\n setParams({...params, langs: '$all'})\n return\n }\n\n setParams({...params, langs: lang.join(LANG_ID_SEPARATOR)})\n },\n [params, selectableLanguages, selectedLanguages, setParams]\n )\n\n const visibleLanguages = useMemo(\n () => [...(defaultLanguages ?? []), ...selectedLanguages],\n [defaultLanguages, selectedLanguages]\n )\n\n return {\n visibleLanguages,\n allSelected: selectedLanguages.length === selectableLanguages.length,\n selectAll,\n selectNone,\n toggleLanguage,\n }\n}\n","import type {SchemaType} from 'sanity'\nimport {FilterFieldFunction, LanguageFilterConfig, LanguageFilterSchema} from './types'\n\nexport const defaultFilterField: FilterFieldFunction = (\n enclosingType,\n field,\n selectedLanguageIds\n) => !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)\n\nexport function isLanguageFilterEnabled(\n schemaType: SchemaType | undefined,\n options: LanguageFilterConfig\n): boolean {\n const schemaFilter =\n isDocument(schemaType) && (schemaType as LanguageFilterSchema)?.options?.languageFilter\n const defaultEnabled = !options.documentTypes\n\n return !!(\n (defaultEnabled && schemaFilter !== false) ||\n (!defaultEnabled && schemaFilter) ||\n (schemaType && options.documentTypes?.includes(schemaType.name))\n )\n}\n\nfunction isDocument(schemaType?: SchemaType) {\n return schemaType?.jsonType === 'object' && getRootType(schemaType).name === 'document'\n}\n\nfunction getRootType(schema: SchemaType): SchemaType {\n if (schema.type) {\n return getRootType(schema.type)\n }\n return schema\n}\n","import {TranslateIcon} from '@sanity/icons'\nimport {Box, Button, Card, Checkbox, Flex, Popover, Stack, Text, useClickOutside} from '@sanity/ui'\nimport React, {FormEvent, useCallback, useState} from 'react'\nimport {usePaneLanguages} from './usePaneLanguages'\nimport {LanguageFilterConfig} from './types'\n\nexport interface LanguageFilterMenuButtonProps {\n options: LanguageFilterConfig\n}\n\nexport function LanguageFilterMenuButton(props: LanguageFilterMenuButtonProps) {\n const {options} = props\n const defaultLanguages = options.supportedLanguages.filter((l) =>\n options.defaultLanguages?.includes(l.id)\n )\n const languageOptions = options.supportedLanguages.filter(\n (l) => !options.defaultLanguages?.includes(l.id)\n )\n const [open, setOpen] = useState(false)\n const {visibleLanguages, allSelected, selectAll, selectNone, toggleLanguage} = usePaneLanguages({\n options,\n })\n const [button, setButton] = useState<HTMLElement | null>(null)\n const [popover, setPopover] = useState<HTMLElement | null>(null)\n\n const handleToggleAll = useCallback(\n (event: FormEvent<HTMLInputElement>) => {\n const checked = event.currentTarget.checked\n\n if (checked) {\n selectAll()\n } else {\n selectNone()\n }\n },\n [selectAll, selectNone]\n )\n\n const handleClick = useCallback(() => setOpen((o) => !o), [])\n\n const handleClickOutside = useCallback(() => setOpen(false), [])\n\n useClickOutside(handleClickOutside, [button, popover])\n\n const content = (\n <Box overflow=\"auto\" padding={1}>\n {defaultLanguages.length > 0 && (\n <Card radius={2} tone=\"primary\">\n <Stack padding={2} space={3}>\n <Text size={1} weight=\"semibold\">\n Default language{defaultLanguages.length > 1 && <>s</>}\n </Text>\n\n {defaultLanguages.map((l) => (\n <Text key={l.id}>{l.title}</Text>\n ))}\n </Stack>\n </Card>\n )}\n\n <Stack marginTop={3} padding={2} space={2}>\n <Box paddingBottom={1}>\n <Text size={1} weight=\"semibold\">\n Show translations\n </Text>\n </Box>\n\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={allSelected} name=\"_allSelected\" onChange={handleToggleAll} />\n <Box flex={1}>\n <Text muted={!allSelected} weight=\"semibold\">\n All translations\n </Text>\n </Box>\n </Flex>\n </Card>\n\n {languageOptions.map((lang) => (\n <LanguageFilterOption\n id={lang.id}\n key={lang.id}\n onToggle={toggleLanguage}\n selected={visibleLanguages.includes(lang.id)}\n title={lang.title}\n />\n ))}\n </Stack>\n </Box>\n )\n\n return (\n <Popover constrainSize content={content} open={open} portal ref={setPopover}>\n <Button\n icon={TranslateIcon}\n text={`Filter languages (${visibleLanguages.length}/${options.supportedLanguages.length})`}\n mode=\"bleed\"\n onClick={handleClick}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nfunction LanguageFilterOption(props: {\n id: string\n onToggle: (id: string) => void\n selected: boolean\n title: string\n}) {\n const {id, onToggle, selected, title} = props\n\n const handleChange = useCallback(() => {\n onToggle(id)\n }, [id, onToggle])\n\n return (\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={selected} name={`language-${id}`} onChange={handleChange} />\n <Box flex={1}>\n <Text muted={!selected}>{title}</Text>\n </Box>\n </Flex>\n </Card>\n )\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
1
+ {"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/LanguageFilterObjectInput.tsx","src/filterField.ts","src/LanguageFilterContext.tsx","src/useSelectedLanguageIds.ts","src/LanguageFilterMenuButton.tsx","src/usePaneLanguages.ts","src/languageSubscription.ts"],"sourcesContent":["/**\n * Plugin function\n */\nexport {languageFilter} from './plugin'\n\nexport {defaultFilterField, isLanguageFilterEnabled} from './filterField'\n\nexport type {\n LanguageFilterConfig,\n LanguageFilterSchema,\n LanguageFilterOptions,\n FilterFieldFunction,\n Language,\n} from './types'\n\nexport {\n LanguageFilterObjectInput,\n type LanguageFilterObjectInputProps,\n} from './LanguageFilterObjectInput'\n\nexport {\n LanguageFilterMenuButton,\n type LanguageFilterMenuButtonProps,\n} from './LanguageFilterMenuButton'\n\nexport {usePaneLanguages} from './usePaneLanguages'\n","import React from 'react'\nimport {_DocumentLanguageFilterComponent, createPlugin, ObjectInputProps} from 'sanity'\nimport {LanguageFilterObjectInput} from './LanguageFilterObjectInput'\nimport {LanguageFilterMenuButton} from './LanguageFilterMenuButton'\nimport {LanguageFilterConfig} from './types'\nimport {isLanguageFilterEnabled} from './filterField'\nimport {LanguageFilterProvider} from './LanguageFilterContext'\nimport {createSelectedLanguageIdsBus} from './languageSubscription'\n\n/**\n * ## Usage in sanity.config.ts (or .js)\n *\n * ```\n * import {createConfig} from 'sanity'\n * import {languageFilter} from '@sanity/language-filter'\n *\n * export const createConfig({\n * /...\n * plugins: [\n * languageFilter({\n * supportedLanguages: [\n * {id: 'nb', title: 'Norwegian (Bokmål)'},\n * {id: 'nn', title: 'Norwegian (Nynorsk)'},\n * {id: 'en', title: 'English'},\n * {id: 'es', title: 'Spanish'},\n * {id: 'arb', title: 'Arabic'},\n * {id: 'pt', title: 'Portuguese'},\n * //...\n * ],\n * // Select Norwegian (Bokmål) by default\n * defaultLanguages: ['nb'],\n * // Only show language filter for document type `page` (schemaType.name)\n * // Can also enable via document-options: options.languageFilter: true\n * documentTypes: ['page'],\n * // default filter function shown\n * filterField: (enclosingType, field, selectedLanguageIds) =>\n * !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),\n * })\n * ]\n * })\n * ```\n */\nexport const languageFilter = createPlugin<LanguageFilterConfig>((options) => {\n const {onSelectedIdsChange, subscribeSelectedIds} = createSelectedLanguageIdsBus()\n\n const RenderLanguageFilter: _DocumentLanguageFilterComponent = () => {\n return <LanguageFilterMenuButton options={options} onSelectedIdsChange={onSelectedIdsChange} />\n }\n\n return {\n name: '@sanity/language-filter',\n document: {\n unstable_languageFilter: (prev, {schemaType, schema}) => {\n if (isLanguageFilterEnabled(schema.get(schemaType), options)) {\n return [...prev, RenderLanguageFilter]\n }\n return prev\n },\n },\n\n form: {\n renderInput(props, next) {\n const enabled = isLanguageFilterEnabled(props.schemaType, options)\n // will only be considered enabled for document, so this is only done once\n if (enabled) {\n return (\n <LanguageFilterProvider enabled={enabled} options={options}>\n {next(props)}\n </LanguageFilterProvider>\n )\n }\n if (props.schemaType.jsonType === 'object') {\n return (\n <LanguageFilterObjectInput\n {...(props as ObjectInputProps)}\n next={next}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n }\n\n return undefined\n },\n },\n }\n})\n","import React, {useEffect, useMemo} from 'react'\nimport {ObjectInputProps, ObjectMember, RenderInputCallback} from 'sanity'\nimport {LanguageFilterConfig} from './types'\nimport {defaultFilterField} from './filterField'\nimport {useLanguageFilterContext} from './LanguageFilterContext'\nimport {useSelectedLanguageIds} from './useSelectedLanguageIds'\n\nexport type LanguageFilterObjectInputProps = {\n options: LanguageFilterConfig\n next: RenderInputCallback\n /**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\n subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void\n} & ObjectInputProps\n\nexport function LanguageFilterObjectInput(\n props: ObjectInputProps & {\n next: RenderInputCallback\n subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void\n }\n) {\n const {options, enabled} = useLanguageFilterContext()\n const {next, subscribeSelectedIds, ...restProps} = props\n if (!enabled || !options) {\n return <>{next(restProps)}</>\n }\n return (\n <FilteredObjectInput\n {...restProps}\n next={next}\n options={options}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n}\n\nfunction FilteredObjectInput(props: LanguageFilterObjectInputProps) {\n const {\n members: membersProp,\n options,\n schemaType,\n next,\n subscribeSelectedIds,\n ...restProps\n } = props\n const [selectedIds, setSelectedIds] = useSelectedLanguageIds(options)\n\n useEffect(() => {\n const unsubscribe = subscribeSelectedIds(setSelectedIds)\n return () => unsubscribe()\n }, [subscribeSelectedIds, setSelectedIds])\n\n const activeLanguages = useMemo(\n () => [...(options.defaultLanguages ?? []), ...selectedIds],\n [options.defaultLanguages, selectedIds]\n )\n\n const filterField = options.filterField ?? defaultFilterField\n\n const members: ObjectMember[] = useMemo(() => {\n return membersProp.filter(\n (member) =>\n (member.kind === 'field' && filterField(schemaType, member, activeLanguages)) ||\n (member.kind === 'fieldSet' && filterField(schemaType, member.fieldSet, activeLanguages))\n )\n }, [schemaType, membersProp, filterField, activeLanguages])\n\n return <>{next({...restProps, members, schemaType})}</>\n}\n","import type {SchemaType} from 'sanity'\nimport {FilterFieldFunction, LanguageFilterConfig, LanguageFilterSchema} from './types'\n\nexport const defaultFilterField: FilterFieldFunction = (\n enclosingType,\n field,\n selectedLanguageIds\n) => !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)\n\nexport function isLanguageFilterEnabled(\n schemaType: SchemaType | undefined,\n options: LanguageFilterConfig\n): boolean {\n const schemaFilter =\n isDocument(schemaType) && (schemaType as LanguageFilterSchema)?.options?.languageFilter\n const defaultEnabled = !options.documentTypes\n\n return !!(\n (defaultEnabled && schemaFilter !== false) ||\n (!defaultEnabled && schemaFilter) ||\n (schemaType && options.documentTypes?.includes(schemaType.name))\n )\n}\n\nfunction isDocument(schemaType?: SchemaType) {\n return schemaType?.jsonType === 'object' && getRootType(schemaType).name === 'document'\n}\n\nfunction getRootType(schema: SchemaType): SchemaType {\n if (schema.type) {\n return getRootType(schema.type)\n }\n return schema\n}\n","import React, {createContext, PropsWithChildren, useContext, useMemo} from 'react'\nimport {LanguageFilterConfig} from './types'\n\nexport interface LanguageFilterContextValue {\n // eslint-disable-next-line react/require-default-props\n options: LanguageFilterConfig\n // eslint-disable-next-line react/require-default-props\n enabled: boolean\n}\n\nconst LanguageFilterContext = createContext<LanguageFilterContextValue | undefined>(undefined)\n\nexport function LanguageFilterProvider({\n options,\n enabled,\n children,\n}: PropsWithChildren<\n Omit<LanguageFilterContextValue, 'selectedLanguageIds' | 'setSelectedLanguageIds'>\n>) {\n const value = useMemo(() => ({options, enabled}), [options, enabled])\n return <LanguageFilterContext.Provider value={value}>{children}</LanguageFilterContext.Provider>\n}\n\nexport function useLanguageFilterContext() {\n const value = useContext(LanguageFilterContext)\n if (!value) {\n throw new Error('LanguageFilterContext is missing')\n }\n return value\n}\n","import {Language, LanguageFilterConfig} from './types'\nimport {useState} from 'react'\nconst storageKey = '@sanity/plugin/language-filter/selected-languages'\n\nexport function getPersistedLanguageIds(options: LanguageFilterConfig): string[] {\n const selectableLangs = getSelectableLanguages(options).map((l) => l.id)\n\n let selected: string[] = selectableLangs\n try {\n const persistedValue = window.localStorage.getItem(storageKey)\n if (persistedValue) {\n selected = JSON.parse(persistedValue)\n }\n } catch (err) {} // eslint-disable-line no-empty\n\n // constrain persisted/selected languages to the ones currently supported\n selected = intersection(selected, selectableLangs)\n return selected\n}\n\nexport function persistLanguageIds(languageIds: string[]): void {\n window.localStorage.setItem(storageKey, JSON.stringify(languageIds))\n}\n\nfunction intersection(array1: string[], array2: string[]) {\n return array1.filter((value) => array2.includes(value))\n}\n\nexport function getSelectableLanguages({\n supportedLanguages,\n defaultLanguages,\n}: LanguageFilterConfig): Language[] {\n return supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id))\n}\n\nexport function useSelectedLanguageIds(\n options: LanguageFilterConfig\n): [string[], (ids: string[]) => void] {\n return useState(() => getPersistedLanguageIds(options))\n}\n","import {Box, Button, Card, Checkbox, Flex, Popover, Stack, Text, useClickOutside} from '@sanity/ui'\nimport React, {FormEvent, useCallback, useState} from 'react'\nimport {usePaneLanguages} from './usePaneLanguages'\nimport {LanguageFilterConfig} from './types'\n\nexport interface LanguageFilterMenuButtonProps {\n options: LanguageFilterConfig\n onSelectedIdsChange: (ids: string[]) => void\n}\n\nexport function LanguageFilterMenuButton(props: LanguageFilterMenuButtonProps) {\n const {options, onSelectedIdsChange} = props\n\n const defaultLanguages = options.supportedLanguages.filter((l) =>\n options.defaultLanguages?.includes(l.id)\n )\n\n const languageOptions = options.supportedLanguages.filter(\n (l) => !options.defaultLanguages?.includes(l.id)\n )\n const [open, setOpen] = useState(false)\n const {activeLanguages, allSelected, selectAll, selectNone, toggleLanguage} = usePaneLanguages({\n options,\n onSelectedIdsChange,\n })\n const [button, setButton] = useState<HTMLElement | null>(null)\n const [popover, setPopover] = useState<HTMLElement | null>(null)\n\n const handleToggleAll = useCallback(\n (event: FormEvent<HTMLInputElement>) => {\n const checked = event.currentTarget.checked\n\n if (checked) {\n selectAll()\n } else {\n selectNone()\n }\n },\n [selectAll, selectNone]\n )\n\n const handleClick = useCallback(() => setOpen((o) => !o), [])\n\n const handleClickOutside = useCallback(() => setOpen(false), [])\n\n useClickOutside(handleClickOutside, [button, popover])\n\n const content = (\n <Box overflow=\"auto\" padding={1}>\n {defaultLanguages.length > 0 && (\n <Card radius={2}>\n <Stack padding={2} space={3}>\n <Box paddingBottom={2}>\n <Text size={1} weight=\"semibold\">\n Default language{defaultLanguages.length > 1 && <>s</>}\n </Text>\n </Box>\n\n {defaultLanguages.map((l) => (\n <Text key={l.id}>{l.title}</Text>\n ))}\n </Stack>\n </Card>\n )}\n\n <Stack marginTop={3} padding={2} space={2}>\n <Box paddingBottom={2}>\n <Text size={1} weight=\"semibold\">\n Show translations\n </Text>\n </Box>\n\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={allSelected} name=\"_allSelected\" onChange={handleToggleAll} />\n <Box flex={1}>\n <Text muted={!allSelected} weight=\"semibold\">\n All translations\n </Text>\n </Box>\n </Flex>\n </Card>\n\n {languageOptions.map((lang) => (\n <LanguageFilterOption\n id={lang.id}\n key={lang.id}\n onToggle={toggleLanguage}\n selected={activeLanguages.includes(lang.id)}\n title={lang.title}\n />\n ))}\n </Stack>\n </Box>\n )\n\n const langCount = options.supportedLanguages.length\n return (\n <Popover content={content} open={open} portal ref={setPopover}>\n <Button\n text={\n <Flex gap={1}>\n <Box>Filter languages:</Box>\n <Flex gap={1} justify=\"space-around\">\n <Flex\n style={{width: `${Math.floor(Math.log10(langCount) + 1)}ch`}}\n justify=\"flex-end\"\n >\n {activeLanguages.length}\n </Flex>\n <Box>/</Box>\n <Box>{langCount}</Box>\n </Flex>\n </Flex>\n }\n mode=\"bleed\"\n onClick={handleClick}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nfunction LanguageFilterOption(props: {\n id: string\n onToggle: (id: string) => void\n selected: boolean\n title: string\n}) {\n const {id, onToggle, selected, title} = props\n\n const handleChange = useCallback(() => {\n onToggle(id)\n }, [id, onToggle])\n\n return (\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={selected} name={`language-${id}`} onChange={handleChange} />\n <Box flex={1}>\n <Text muted={!selected}>{title}</Text>\n </Box>\n </Flex>\n </Card>\n )\n}\n","import {useCallback, useMemo} from 'react'\nimport {LanguageFilterConfig} from './types'\nimport {\n getSelectableLanguages,\n persistLanguageIds,\n useSelectedLanguageIds,\n} from './useSelectedLanguageIds'\n\nexport interface UsePaneLanguagesParams {\n options: LanguageFilterConfig\n /**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\n onSelectedIdsChange: (ids: string[]) => void\n}\n\nexport function usePaneLanguages(props: UsePaneLanguagesParams): {\n activeLanguages: string[]\n allSelected: boolean\n selectAll: () => void\n selectNone: () => void\n toggleLanguage: (languageId: string) => void\n} {\n const {options, onSelectedIdsChange} = props\n const {defaultLanguages} = options\n\n const [selectedIds, setSelectedIds] = useSelectedLanguageIds(options)\n\n const selectableLanguages = useMemo(() => getSelectableLanguages(options), [options])\n\n const updateSelectedIds = useCallback(\n (ids: string[]) => {\n setSelectedIds(ids)\n persistLanguageIds(ids)\n onSelectedIdsChange(ids)\n },\n [onSelectedIdsChange, setSelectedIds]\n )\n\n const selectAll = useCallback(\n () => updateSelectedIds(selectableLanguages.map((l) => l.id)),\n [updateSelectedIds, selectableLanguages]\n )\n\n const selectNone = useCallback(() => {\n updateSelectedIds([])\n }, [updateSelectedIds])\n\n const toggleLanguage = useCallback(\n (languageId: string) => {\n let lang = selectedIds\n\n if (lang.includes(languageId)) {\n lang = lang.filter((l) => l !== languageId)\n } else {\n lang = [...lang, languageId]\n }\n\n updateSelectedIds(lang)\n },\n [updateSelectedIds, selectedIds]\n )\n\n const activeLanguages = useMemo(\n () => [...(defaultLanguages ?? []), ...selectedIds],\n [defaultLanguages, selectedIds]\n )\n\n return {\n activeLanguages,\n allSelected: selectedIds.length === selectableLanguages.length,\n selectAll,\n selectNone,\n toggleLanguage,\n }\n}\n","export type LanguageSubscription = (ids: string[]) => void\nexport type Unsubscribe = () => void\nexport type LanguageSubscribe = (subscription: LanguageSubscription) => Unsubscribe\n\nexport interface SelectedLanguageIdsBus {\n onSelectedIdsChange: (ids: string[]) => void\n subscribeSelectedIds: LanguageSubscribe\n}\n\n/**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\nexport function createSelectedLanguageIdsBus(): SelectedLanguageIdsBus {\n const subs: LanguageSubscription[] = []\n\n const onSelectedIdsChange = (ids: string[]) => {\n subs.forEach((s) => s(ids))\n }\n const subscribeSelectedIds = (subscription: LanguageSubscription) => {\n subs.push(subscription)\n return () => {\n subs.splice(subs.indexOf(subscription), 1)\n }\n }\n\n return {\n onSelectedIdsChange,\n subscribeSelectedIds,\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}