{"version":3,"file":"index.cjs","sources":["../../src/settings/index.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport { ReactNode } from \"react\";\nimport { createContext, useState, useContext } from \"react\";\nimport update, { Spec } from \"immutability-helper\";\nimport { LocalStorage } from \"../util/local-storage\";\n\ninterface SettingsProviderProps {\n  children: ReactNode;\n  storageID?: string;\n}\n\n// Could rework this to use `zustand` or similar\n\nfunction createSettingsContext<T extends object>(\n  defaultValue: T,\n): [any, any, any] {\n  /** Function that creates a context with an updateable settings object\n   */\n  const Context = createContext<T>(defaultValue);\n\n  type SettingsUpdateSpec = Spec<T>;\n  type Updater = (spec: SettingsUpdateSpec) => void;\n  const UpdateContext = createContext<Updater | null>(null);\n\n  const Provider = function (props: SettingsProviderProps & T) {\n    /*\n    A settings provider that can be used with LocalStorage\n    */\n    let { storageID, children, ...defaultSettings } = props;\n    // Update from local storage\n    let storage = null;\n    console.log(\"Setting up SettingsProvider [ui-components]\");\n    if (storageID != null) {\n      // Merge initial options if set\n      storage = new LocalStorage(storageID);\n      const v = storage.get() || {};\n      console.log(\"Loading from local storage\", v);\n      // @ts-ignore\n      defaultSettings = update(defaultSettings, { $merge: v });\n    }\n\n    // @ts-ignore\n    const [settings, setState] = useState<T>(defaultSettings);\n    const updateState = function (spec: SettingsUpdateSpec) {\n      const newSettings = update(settings, spec);\n      setState(newSettings);\n      if (storage != null) {\n        return storage.set(newSettings);\n      }\n    };\n\n    return h(Context.Provider, { value: settings }, [\n      h(UpdateContext.Provider, { value: updateState }, children),\n    ]);\n  };\n\n  const useValue = () => useContext(Context);\n\n  const useUpdater: (key?: string) => Updater = (\n    key: string | undefined = null,\n  ) => {\n    const updater = useContext(UpdateContext);\n    if (key == null) return updater;\n    //@ts-ignore\n    return (spec: Spec<any>) => updater({ [key]: spec });\n  };\n\n  return [Provider, useValue, useUpdater];\n}\n\nconst [SettingsProvider, useSettings, useSettingsUpdater] =\n  createSettingsContext<object>({});\n\n// Deprecated: this is kind of confusing\nconst updateSettings = function (func) {\n  // Update settings using `immutability-helper` semantics\n  //@ts-ignore\n  const updater = useSettingsUpdater();\n  return function () {\n    //@ts-ignore\n    return updater(func(...arguments));\n  };\n};\n\nexport { SettingsProvider, useSettings, updateSettings, createSettingsContext };\n"],"names":["createContext","LocalStorage","update","useState","h","useContext"],"mappings":";;;;;;;;;AAaA,SAAS,sBACP,cACiB;AAGjB,QAAM,UAAUA,MAAAA,cAAiB,YAAY;AAI7C,QAAM,gBAAgBA,MAAAA,cAA8B,IAAI;AAExD,QAAM,WAAW,SAAU,OAAkC;AAI3D,QAAI,EAAE,WAAW,UAAU,GAAG,oBAAoB;AAElD,QAAI,UAAU;AACd,YAAQ,IAAI,6CAA6C;AACzD,QAAI,aAAa,MAAM;AAErB,gBAAU,IAAIC,aAAAA,aAAa,SAAS;AACpC,YAAM,IAAI,QAAQ,IAAA,KAAS,CAAA;AAC3B,cAAQ,IAAI,8BAA8B,CAAC;AAE3C,wBAAkBC,gBAAAA,QAAO,iBAAiB,EAAE,QAAQ,GAAG;AAAA,IACzD;AAGA,UAAM,CAAC,UAAU,QAAQ,IAAIC,MAAAA,SAAY,eAAe;AACxD,UAAM,cAAc,SAAU,MAA0B;AACtD,YAAM,cAAcD,gBAAAA,QAAO,UAAU,IAAI;AACzC,eAAS,WAAW;AACpB,UAAI,WAAW,MAAM;AACnB,eAAO,QAAQ,IAAI,WAAW;AAAA,MAChC;AAAA,IACF;AAEA,WAAOE,WAAAA,QAAE,QAAQ,UAAU,EAAE,OAAO,YAAY;AAAA,MAC9CA,WAAAA,QAAE,cAAc,UAAU,EAAE,OAAO,YAAA,GAAe,QAAQ;AAAA,IAAA,CAC3D;AAAA,EACH;AAEA,QAAM,WAAW,MAAMC,MAAAA,WAAW,OAAO;AAEzC,QAAM,aAAwC,CAC5C,MAA0B,SACvB;AACH,UAAM,UAAUA,MAAAA,WAAW,aAAa;AACxC,QAAI,OAAO,KAAM,QAAO;AAExB,WAAO,CAAC,SAAoB,QAAQ,EAAE,CAAC,GAAG,GAAG,MAAM;AAAA,EACrD;AAEA,SAAO,CAAC,UAAU,UAAU,UAAU;AACxC;AAEA,MAAM,CAAC,kBAAkB,aAAa,kBAAkB,IACtD,sBAA8B,CAAA,CAAE;AAGlC,MAAM,iBAAiB,SAAU,MAAM;AAGrC,QAAM,UAAU,mBAAA;AAChB,SAAO,WAAY;AAEjB,WAAO,QAAQ,KAAK,GAAG,SAAS,CAAC;AAAA,EACnC;AACF;;;;;"}