@sanity/personalization-plugin 2.2.0-growthbook.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var jsxRuntime = require("react/jsx-runtime"), sanity = require("sanity"), ui = require("@sanity/ui"), uuid = require("@sanity/uuid"), react = require("react"), equal = require("fast-deep-equal"), suspendReact = require("suspend-react"), gi = require("react-icons/gi"), studioSecrets = require("@sanity/studio-secrets");
3
+ var jsxRuntime = require("react/jsx-runtime"), sanity = require("sanity"), ui = require("@sanity/ui"), uuid = require("@sanity/uuid"), react = require("react"), equal = require("fast-deep-equal"), suspendReact = require("suspend-react"), gi = require("react-icons/gi");
4
4
  function _interopDefaultCompat(e) {
5
5
  return e && typeof e == "object" && "default" in e ? e : { default: e };
6
6
  }
@@ -15,23 +15,20 @@ const CONFIG_DEFAULT = {
15
15
  experimentId: "experimentId"
16
16
  }, ExperimentContext = react.createContext({
17
17
  ...CONFIG_DEFAULT,
18
- experiments: [],
19
- setSecret: () => {
20
- },
21
- secret: void 0
18
+ experiments: []
22
19
  });
23
20
  function useExperimentContext() {
24
21
  return react.useContext(ExperimentContext);
25
22
  }
26
23
  function ExperimentProvider(props) {
27
- const { experimentFieldPluginConfig } = props, [secret, setSecret] = react.useState(), client = sanity.useClient({ apiVersion: experimentFieldPluginConfig.apiVersion }), workspace = sanity.useWorkspace(), experiments = Array.isArray(experimentFieldPluginConfig.experiments) ? experimentFieldPluginConfig.experiments : suspendReact.suspend(
24
+ const { experimentFieldPluginConfig } = props, client = sanity.useClient({ apiVersion: experimentFieldPluginConfig.apiVersion }), workspace = sanity.useWorkspace(), experiments = Array.isArray(experimentFieldPluginConfig.experiments) ? experimentFieldPluginConfig.experiments : suspendReact.suspend(
28
25
  // eslint-disable-next-line require-await
29
- async () => typeof experimentFieldPluginConfig.experiments == "function" ? experimentFieldPluginConfig.experiments(client, secret) : experimentFieldPluginConfig.experiments,
30
- [workspace, secret],
26
+ async () => typeof experimentFieldPluginConfig.experiments == "function" ? experimentFieldPluginConfig.experiments(client) : experimentFieldPluginConfig.experiments,
27
+ [workspace],
31
28
  { equal: equal__default.default }
32
29
  ), context = react.useMemo(
33
- () => ({ ...experimentFieldPluginConfig, experiments, secret, setSecret }),
34
- [experimentFieldPluginConfig, experiments, secret, setSecret]
30
+ () => ({ ...experimentFieldPluginConfig, experiments }),
31
+ [experimentFieldPluginConfig, experiments]
35
32
  );
36
33
  return /* @__PURE__ */ jsxRuntime.jsx(ExperimentContext.Provider, { value: context, children: props.renderDefault(props) });
37
34
  }
@@ -6408,9 +6405,9 @@ const icons = {
6408
6405
  });
6409
6406
  Icon.displayName = "ForwardRef(Icon)";
6410
6407
  const useAddExperimentAction = (props) => {
6411
- const { onChange, active, experimentNameOverride } = props, handleAddAction = react.useCallback(() => {
6412
- onChange([sanity.set(!active, ["active"])]);
6413
- }, [onChange, active]);
6408
+ const { onChange, experimentNameOverride } = props, handleAddAction = () => {
6409
+ onChange([sanity.set(!0, ["active"])]);
6410
+ };
6414
6411
  return {
6415
6412
  title: `Add ${experimentNameOverride}`,
6416
6413
  type: "action",
@@ -6419,10 +6416,13 @@ const useAddExperimentAction = (props) => {
6419
6416
  renderAsButton: !0
6420
6417
  };
6421
6418
  }, useRemoveExperimentAction = (props) => {
6422
- const { onChange, active, experimentId, experimentNameOverride, variantNameOverride } = props, handleClearAction = react.useCallback(() => {
6423
- const activeId = ["active"], experiment = [experimentId], variants = [`${variantNameOverride}s`];
6424
- onChange([sanity.set(!active, activeId), sanity.unset(experiment), sanity.unset(variants)]);
6425
- }, [onChange, active, experimentId, variantNameOverride]);
6419
+ const { onChange, experimentId, experimentNameOverride } = props, patchActiveFalseEvent = () => sanity.set(!1, ["active"]), patchClearEvent = () => {
6420
+ const experiment = [experimentId], variants = [experimentNameOverride];
6421
+ return [sanity.unset(experiment), sanity.unset(variants)];
6422
+ }, handleClearAction = () => {
6423
+ const clearEvents = patchClearEvent(), activeEvent = patchActiveFalseEvent();
6424
+ onChange([activeEvent, ...clearEvents]);
6425
+ };
6426
6426
  return {
6427
6427
  title: `Remove ${experimentNameOverride}`,
6428
6428
  type: "action",
@@ -6430,53 +6430,36 @@ const useAddExperimentAction = (props) => {
6430
6430
  onAction: handleClearAction,
6431
6431
  renderAsButton: !0
6432
6432
  };
6433
- }, createActions = ({
6433
+ }, newActions = ({
6434
6434
  onChange,
6435
6435
  inputId,
6436
6436
  active,
6437
6437
  experimentNameOverride,
6438
- experimentId,
6439
- variantNameOverride
6438
+ experimentId
6440
6439
  }) => {
6441
6440
  const removeAction = sanity.defineDocumentFieldAction({
6442
6441
  name: `Remove ${experimentNameOverride}`,
6443
6442
  useAction: (props) => useRemoveExperimentAction({
6444
- active: !0,
6445
6443
  onChange,
6446
6444
  experimentNameOverride,
6447
- experimentId,
6448
- variantNameOverride
6445
+ experimentId
6449
6446
  })
6450
6447
  }), addAction = sanity.defineDocumentFieldAction({
6451
6448
  name: `Add ${experimentNameOverride}`,
6452
6449
  useAction: (props) => useAddExperimentAction({
6453
- active: !1,
6454
6450
  onChange,
6455
6451
  experimentNameOverride
6456
6452
  })
6457
6453
  });
6458
6454
  return active ? removeAction : addAction;
6459
6455
  }, ExperimentField = (props) => {
6460
- const { onChange } = props.inputProps, { inputId, experimentNameOverride, experimentId, variantNameOverride } = props, active = props.value?.active, actionProps = react.useMemo(
6461
- () => ({
6462
- onChange,
6463
- inputId,
6464
- active,
6465
- experimentNameOverride,
6466
- experimentId,
6467
- variantNameOverride
6468
- }),
6469
- [onChange, inputId, active, experimentNameOverride, experimentId, variantNameOverride]
6470
- ), memoizedActions = react.useMemo(() => {
6471
- const oldActions = props.actions || [];
6472
- return [createActions(actionProps), ...oldActions];
6473
- }, [actionProps, props.actions]), withActionProps = react.useMemo(
6474
- () => ({
6475
- ...props,
6476
- actions: memoizedActions
6477
- }),
6478
- [props, memoizedActions]
6479
- );
6456
+ const { onChange } = props.inputProps, { inputId, experimentNameOverride, experimentId } = props, active = props.value?.active, oldActions = props.actions || [], withActionProps = {
6457
+ ...props,
6458
+ actions: [
6459
+ newActions({ onChange, inputId, active, experimentNameOverride, experimentId }),
6460
+ ...oldActions
6461
+ ]
6462
+ };
6480
6463
  return props.renderDefault(withActionProps);
6481
6464
  }, Select = (props) => {
6482
6465
  const {
@@ -6508,7 +6491,7 @@ const useAddExperimentAction = (props) => {
6508
6491
  value: experiment.id
6509
6492
  })), ExperimentInput = (props) => {
6510
6493
  const { experiments } = useExperimentContext(), id = sanity.useFormValue(["_id"]), aditionalChangePath = react.useMemo(
6511
- () => [...props.path.slice(0, -1), `${props.variantNameOverride}s`],
6494
+ () => [...props.path.slice(0, -1), props.variantNameOverride],
6512
6495
  [props.variantNameOverride, props.path]
6513
6496
  ), subValues = sanity.useFormValue(aditionalChangePath), { patch } = sanity.useDocumentOperation(id.replace("drafts.", ""), props.schemaType.name), handleChange = react.useCallback(
6514
6497
  (event, onChange) => {
@@ -6522,7 +6505,11 @@ const useAddExperimentAction = (props) => {
6522
6505
  },
6523
6506
  [patch, subValues, aditionalChangePath]
6524
6507
  );
6525
- return experiments.length ? /* @__PURE__ */ jsxRuntime.jsx(Select, { ...props, listOptions: formatlistOptions(experiments), handleChange }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
6508
+ return experiments.length ? /* @__PURE__ */ jsxRuntime.jsx(Select, { ...props, listOptions: formatlistOptions(experiments), handleChange }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { padding: [3, 3, 4], radius: 2, shadow: 1, tone: "caution", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { align: "center", size: [2, 2, 3], children: [
6509
+ "There are no defined ",
6510
+ props.experimentNameOverride,
6511
+ "s"
6512
+ ] }) });
6526
6513
  }, VariantInput = (props) => {
6527
6514
  const defaultValue = sanity.useFormValue([props.path[0], "default"]), handleClick = () => {
6528
6515
  props.onChange(sanity.set(defaultValue, ["value"]));
@@ -6596,8 +6583,7 @@ const createExperimentType = ({
6596
6583
  {
6597
6584
  ...props,
6598
6585
  experimentId,
6599
- experimentNameOverride,
6600
- variantNameOverride
6586
+ experimentNameOverride
6601
6587
  }
6602
6588
  )
6603
6589
  },
@@ -6624,7 +6610,14 @@ const createExperimentType = ({
6624
6610
  name: experimentId,
6625
6611
  type: "string",
6626
6612
  components: {
6627
- input: (props) => /* @__PURE__ */ jsxRuntime.jsx(ExperimentInput, { ...props, variantNameOverride })
6613
+ input: (props) => /* @__PURE__ */ jsxRuntime.jsx(
6614
+ ExperimentInput,
6615
+ {
6616
+ ...props,
6617
+ experimentNameOverride,
6618
+ variantNameOverride
6619
+ }
6620
+ )
6628
6621
  },
6629
6622
  hidden: ({ parent }) => !parent?.active
6630
6623
  }),
@@ -6760,91 +6753,7 @@ const createExperimentType = ({
6760
6753
  }
6761
6754
  }
6762
6755
  };
6763
- }), namespace = "growthbook", pluginConfigKeys = [
6764
- {
6765
- key: "apiKey",
6766
- title: "Your secret API key"
6767
- }
6768
- ], Secrets = (props) => {
6769
- const { secrets, loading } = studioSecrets.useSecrets(namespace), { setSecret } = useExperimentContext(), [showSettings, setShowSettings] = react.useState(!1);
6770
- return react.useEffect(() => {
6771
- if (!loading)
6772
- return !secrets && !loading ? (setSecret(void 0), setShowSettings(!0)) : (setSecret(secrets.apiKey), setShowSettings(!1));
6773
- }, [secrets, loading, setSecret]), showSettings ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6774
- /* @__PURE__ */ jsxRuntime.jsx(
6775
- studioSecrets.SettingsView,
6776
- {
6777
- title: "Growthbook secret",
6778
- namespace,
6779
- keys: pluginConfigKeys,
6780
- onClose: () => {
6781
- setShowSettings(!1);
6782
- }
6783
- }
6784
- ),
6785
- props.renderDefault(props)
6786
- ] }) : props.renderDefault(props);
6787
- }, getBooleanConversion = (value) => value === "true" ? "variant" : value === "false" ? "control" : value, getExperiments = async ({
6788
- client,
6789
- environment,
6790
- baseUrl,
6791
- project,
6792
- convertBooleans
6793
- }) => {
6794
- const secret = await client.fetch("*[_id == 'secrets.growthbook'][0].secrets.apiKey");
6795
- if (!secret) return [];
6796
- const featureExperiments = [];
6797
- let hasMore = !0, offset = 0;
6798
- const url = new URL(baseUrl ?? "https://api.growthbook.io/api/v1/features");
6799
- for (project && url.searchParams.set("projectId", project); hasMore; ) {
6800
- url.searchParams.set("offset", offset.toString());
6801
- const response = await fetch(url, {
6802
- headers: {
6803
- Authorization: `Bearer ${secret}`
6804
- }
6805
- }), { features, hasMore: responseHasMore, nextOffset } = await response.json();
6806
- hasMore = responseHasMore, offset = nextOffset, features && features.forEach((feature) => {
6807
- if (feature.archived)
6808
- return;
6809
- const experiments = feature.environments[environment]?.rules.filter(
6810
- (experiment) => experiment.type === "experiment-ref" || experiment.type === "experiment"
6811
- );
6812
- if (!experiments)
6813
- return;
6814
- const variations = /* @__PURE__ */ new Set();
6815
- experiments.forEach((experiment) => {
6816
- experiment?.variations.forEach((variant) => {
6817
- variations.add({
6818
- id: convertBooleans ? getBooleanConversion(variant.value) : variant.value,
6819
- label: convertBooleans ? getBooleanConversion(variant.value) : variant.value
6820
- });
6821
- });
6822
- });
6823
- const value = { id: feature.id, label: feature.id, variants: [...variations] };
6824
- featureExperiments.push(value);
6825
- });
6826
- }
6827
- return featureExperiments;
6828
- }, growthbookFieldLevel = sanity.definePlugin((config) => {
6829
- const { fields, environment, project, convertBooleans, baseUrl } = config;
6830
- return {
6831
- name: "sanity-growthbook-personalistaion-plugin-field-level-experiments",
6832
- plugins: [
6833
- fieldLevelExperiments({
6834
- fields,
6835
- experiments: (client) => getExperiments({ client, environment, baseUrl, project, convertBooleans })
6836
- })
6837
- ],
6838
- form: {
6839
- components: {
6840
- input: (props) => !(props.id === "root" && sanity.isObjectInputProps(props)) || !flattenSchemaType(props.schemaType).map(
6841
- (field) => field.type.name
6842
- ).some((name) => name.startsWith("experiment")) ? props.renderDefault(props) : Secrets(props)
6843
- }
6844
- }
6845
- };
6846
6756
  });
6847
6757
  exports.fieldLevelExperiments = fieldLevelExperiments;
6848
6758
  exports.flattenSchemaType = flattenSchemaType;
6849
- exports.growthbookFieldLevel = growthbookFieldLevel;
6850
6759
  //# sourceMappingURL=index.js.map