@saasquatch/component-boilerplate 1.3.1-2 → 1.3.1-3
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/CHANGELOG.md +12 -2
- package/dist/environment/LocaleContext.d.ts +0 -6
- package/dist/environment/environment.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +4 -4
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/dist/environment/GraphQLRequestManager.d.ts +0 -1
- package/dist/environment/SquatchPortal.d.ts +0 -26
- package/dist/hooks/graphql/useBatchedQuery.d.ts +0 -45
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/hooks/useHost.ts","../src/environment/ProgramContext.ts","../node_modules/tslib/tslib.es6.js","../node_modules/graphql-tag/lib/index.js","../node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../src/environment/UserIdentityContext.ts","../src/environment/BatchedGraphQLClient.ts","../src/hooks/graphql/useGraphQLClient.ts","../src/hooks/graphql/useBaseQuery.ts","../src/hooks/graphql/useMutation.ts","../src/hooks/managedIdentity/useAuthenticateWithEmailAndPasswordMutation.ts","../src/hooks/managedIdentity/useRegisterWithEmailAndPasswordMutation.ts","../src/hooks/managedIdentity/useChangePasswordMutation.ts","../src/hooks/managedIdentity/useResetPasswordMutation.ts","../src/hooks/managedIdentity/useVerifyPasswordResetCodeMutation.ts","../src/hooks/graphql/Refresh.ts","../src/hooks/useDeepEffect.ts","../src/hooks/graphql/useLazyQuery.ts","../src/hooks/managedIdentity/useManagedIdentityQuery.ts","../src/hooks/managedIdentity/useVerifyEmailMutation.ts","../src/hooks/managedIdentity/useRequestPasswordResetEmailMutation.ts","../src/hooks/managedIdentity/useRequestVerificationEmailMutation.ts","../src/hooks/useDeepMemo.ts","../src/hooks/useTick.ts","../src/hooks/graphql/useQuery.ts","../src/hooks/useNavigation.ts","../src/hooks/pagination/usePagination.ts","../src/hooks/useDebounce.ts","../src/hooks/useShareEvent.ts","../src/hooks/useForm.ts","../src/environment/LocaleContext.ts","../src/environment/environment.ts","../src/hooks/pagination/usePaginatedQuery.ts"],"sourcesContent":["const ref = { current: undefined };\r\n\r\nexport function useHost(): HTMLElement {\r\n if (ref.current === undefined) {\r\n throw new Error(\"no implementation of useHost provided\");\r\n }\r\n\r\n return ref.current();\r\n}\r\n\r\nexport function setImplementation(implementation: () => HTMLElement) {\r\n if (!implementation) {\r\n throw new Error(\"Must supply an implementation\");\r\n }\r\n\r\n if (typeof implementation !== \"function\") {\r\n throw new Error(\"implementation must be a function\");\r\n }\r\n\r\n ref.current = implementation;\r\n}","import { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { ContextProvider } from \"dom-context\";\r\nimport { useHost } from \"../hooks/useHost\";\r\nimport { WidgetIdent } from \"./environment\";\r\n\r\nconst CONTEXT_NAME = \"sq:program-id\";\r\n\r\ndeclare global {\r\n interface Window {\r\n widgetIdent: WidgetIdent;\r\n squatchProgramId: ContextProvider<string>;\r\n }\r\n}\r\n\r\nfunction _lazilyStartGlobally() {\r\n const globalProvider = window.squatchProgramId;\r\n if (!globalProvider) {\r\n // Lazily creates a global provider\r\n window.squatchProgramId = new ContextProvider<string>({\r\n element: document.documentElement,\r\n initialState: window.widgetIdent?.programId || undefined,\r\n contextName: CONTEXT_NAME,\r\n }).start();\r\n }\r\n}\r\n\r\nexport function useProgramId(): string | undefined {\r\n _lazilyStartGlobally();\r\n const host = useHost();\r\n return useDomContext<string>(host, CONTEXT_NAME);\r\n}\r\n\r\n/**\r\n * Overide the globally defined Program ID context\r\n *\r\n * @param programId the new programID used by the user, or undefined if logged out\r\n */\r\nexport function setProgramId(programId: string) {\r\n _lazilyStartGlobally();\r\n const globalProvider = window.squatchProgramId;\r\n globalProvider.context = programId;\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { __assign } from \"tslib\";\nimport { parse } from 'graphql';\nvar docCache = new Map();\nvar fragmentSourceMap = new Map();\nvar printFragmentWarnings = true;\nvar experimentalFragmentVariables = false;\nfunction normalize(string) {\n return string.replace(/[\\s,]+/g, ' ').trim();\n}\nfunction cacheKeyFromLoc(loc) {\n return normalize(loc.source.body.substring(loc.start, loc.end));\n}\nfunction processFragments(ast) {\n var seenKeys = new Set();\n var definitions = [];\n ast.definitions.forEach(function (fragmentDefinition) {\n if (fragmentDefinition.kind === 'FragmentDefinition') {\n var fragmentName = fragmentDefinition.name.value;\n var sourceKey = cacheKeyFromLoc(fragmentDefinition.loc);\n var sourceKeySet = fragmentSourceMap.get(fragmentName);\n if (sourceKeySet && !sourceKeySet.has(sourceKey)) {\n if (printFragmentWarnings) {\n console.warn(\"Warning: fragment with name \" + fragmentName + \" already exists.\\n\"\n + \"graphql-tag enforces all fragment names across your application to be unique; read more about\\n\"\n + \"this in the docs: http://dev.apollodata.com/core/fragments.html#unique-names\");\n }\n }\n else if (!sourceKeySet) {\n fragmentSourceMap.set(fragmentName, sourceKeySet = new Set);\n }\n sourceKeySet.add(sourceKey);\n if (!seenKeys.has(sourceKey)) {\n seenKeys.add(sourceKey);\n definitions.push(fragmentDefinition);\n }\n }\n else {\n definitions.push(fragmentDefinition);\n }\n });\n return __assign(__assign({}, ast), { definitions: definitions });\n}\nfunction stripLoc(doc) {\n var workSet = new Set(doc.definitions);\n workSet.forEach(function (node) {\n if (node.loc)\n delete node.loc;\n Object.keys(node).forEach(function (key) {\n var value = node[key];\n if (value && typeof value === 'object') {\n workSet.add(value);\n }\n });\n });\n var loc = doc.loc;\n if (loc) {\n delete loc.startToken;\n delete loc.endToken;\n }\n return doc;\n}\nfunction parseDocument(source) {\n var cacheKey = normalize(source);\n if (!docCache.has(cacheKey)) {\n var parsed = parse(source, {\n experimentalFragmentVariables: experimentalFragmentVariables\n });\n if (!parsed || parsed.kind !== 'Document') {\n throw new Error('Not a valid GraphQL document.');\n }\n docCache.set(cacheKey, stripLoc(processFragments(parsed)));\n }\n return docCache.get(cacheKey);\n}\nexport function gql(literals) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (typeof literals === 'string') {\n literals = [literals];\n }\n var result = literals[0];\n args.forEach(function (arg, i) {\n if (arg && arg.kind === 'Document') {\n result += arg.loc.source.body;\n }\n else {\n result += arg;\n }\n result += literals[i + 1];\n });\n return parseDocument(result);\n}\nexport function resetCaches() {\n docCache.clear();\n fragmentSourceMap.clear();\n}\nexport function disableFragmentWarnings() {\n printFragmentWarnings = false;\n}\nexport function enableExperimentalFragmentVariables() {\n experimentalFragmentVariables = true;\n}\nexport function disableExperimentalFragmentVariables() {\n experimentalFragmentVariables = false;\n}\nvar extras = {\n gql: gql,\n resetCaches: resetCaches,\n disableFragmentWarnings: disableFragmentWarnings,\n enableExperimentalFragmentVariables: enableExperimentalFragmentVariables,\n disableExperimentalFragmentVariables: disableExperimentalFragmentVariables\n};\n(function (gql_1) {\n gql_1.gql = extras.gql, gql_1.resetCaches = extras.resetCaches, gql_1.disableFragmentWarnings = extras.disableFragmentWarnings, gql_1.enableExperimentalFragmentVariables = extras.enableExperimentalFragmentVariables, gql_1.disableExperimentalFragmentVariables = extras.disableExperimentalFragmentVariables;\n})(gql || (gql = {}));\ngql[\"default\"] = gql;\nexport default gql;\n//# sourceMappingURL=index.js.map","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => enableOverride === null ? createDebug.enabled(namespace) : enableOverride,\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","import decode from \"jwt-decode\";\r\nimport { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { ContextProvider } from \"dom-context\";\r\nimport { getEnvironmentSDK } from \"./environment\";\r\nimport { useHost } from \"../hooks/useHost\";\r\nimport { equal } from \"@wry/equality\";\r\nimport debugFn from \"debug\";\r\nexport const debug = debugFn(\"sq:user-identity\");\r\n\r\nconst CONTEXT_NAME = \"sq:user-identity\";\r\nconst USER_LOCAL_STORAGE_KEY = CONTEXT_NAME;\r\n\r\nexport type UserIdentity = {\r\n id: string;\r\n accountId: string;\r\n jwt?: string;\r\n managedIdentity?: {\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData?: { [key: string]: any };\r\n };\r\n};\r\n\r\nexport interface DecodedSquatchJWT {\r\n exp?: number;\r\n user?: {\r\n accountId: string;\r\n id: string;\r\n };\r\n}\r\n\r\n// NOTE: Classic theme-engine JWT's do not have a typical payload,\r\n// they have a sub in the form base64(accountId):base64(userId)@tenantAlias:users\r\nexport interface DecodedWidgetAPIJWT {\r\n exp?: number;\r\n sub?: string;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n squatchUserIdentity: ContextProvider<UserIdentity>;\r\n }\r\n}\r\n\r\nfunction _lazilyStartGlobally() {\r\n const globalProvider = window.squatchUserIdentity;\r\n if (!globalProvider) {\r\n // Lazily creates a global provider\r\n window.squatchUserIdentity = new ContextProvider<UserIdentity>({\r\n element: document.documentElement,\r\n initialState: _getInitialValue(),\r\n contextName: CONTEXT_NAME,\r\n }).start();\r\n }\r\n}\r\n\r\nfunction isDecodedSquatchJWT(decoded: any): decoded is DecodedSquatchJWT {\r\n return decoded.user && decoded.user.id && decoded.user.accountId;\r\n}\r\n\r\nfunction isDecodedWidgetAPIJWT(decoded: any): decoded is DecodedWidgetAPIJWT {\r\n return decoded.sub && /.*:.*@.*:users/.test(decoded.sub);\r\n}\r\n\r\nfunction userIdentityFromJwt(jwt?: string): UserIdentity | undefined {\r\n if (!jwt) return undefined;\r\n\r\n try {\r\n const decoded = decode<DecodedSquatchJWT | DecodedWidgetAPIJWT>(jwt);\r\n const exp = decoded.exp;\r\n\r\n let userId: string, accountId: string;\r\n\r\n if (isDecodedWidgetAPIJWT(decoded)) {\r\n // Pull the accountId and userId from the subject and Base64-decode them\r\n // NOTE: This is to support classic theme engine widget token generation\r\n const matches = decoded.sub.match(/(.*):(.*)@(.*):users/);\r\n accountId = atob(matches[1]);\r\n userId = atob(matches[2]);\r\n } else if (isDecodedSquatchJWT(decoded)) {\r\n accountId = decoded.user.accountId;\r\n userId = decoded.user.id;\r\n }\r\n\r\n if (!userId || !accountId) {\r\n return undefined;\r\n }\r\n\r\n // Check if the JWT has expired\r\n if (exp && Date.now() >= exp * 1000) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n id: userId,\r\n accountId: accountId,\r\n jwt,\r\n };\r\n } catch (e) {\r\n // Invalid JWT\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction _getInitialValue(): UserIdentity | undefined {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchAndroid\":\r\n case \"SquatchJS2\":\r\n return {\r\n id: sdk.widgetIdent.userId,\r\n accountId: sdk.widgetIdent.accountId,\r\n jwt: sdk.widgetIdent.token,\r\n };\r\n case \"SquatchPortal\":\r\n // Portals can have the jwt provided as a URL parameter, so look for that first\r\n const searchParams = new URLSearchParams(document.location.search);\r\n if (searchParams.has(\"jwt\")) {\r\n return userIdentityFromJwt(searchParams.get(\"jwt\"));\r\n }\r\n\r\n // Look for user identity in local storage\r\n const stored = localStorage.getItem(USER_LOCAL_STORAGE_KEY);\r\n if (!stored) return undefined;\r\n try {\r\n const potentialUserIdent = JSON.parse(stored) as UserIdentity;\r\n const identity = userIdentityFromJwt(potentialUserIdent.jwt);\r\n if (identity) {\r\n return {\r\n ...potentialUserIdent, // for any stored managedIdentity fields\r\n ...identity,\r\n };\r\n }\r\n return undefined;\r\n } catch (e) {\r\n // Not valid JSON\r\n return undefined;\r\n }\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n // Not logged in for admin portal / none default case\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Overide the globally defined user context, and persists the user identity in local storage\r\n *\r\n * @param identity the new identity of the user, or undefined if logged out\r\n */\r\nexport function setUserIdentity(identity?: UserIdentity) {\r\n _lazilyStartGlobally();\r\n const globalProvider = window.squatchUserIdentity;\r\n\r\n if (!equal(globalProvider.context, identity)) {\r\n globalProvider.context = identity;\r\n }\r\n\r\n // Portals store identity in local storage\r\n if (identity && getEnvironmentSDK().type === \"SquatchPortal\") {\r\n localStorage.setItem(USER_LOCAL_STORAGE_KEY, JSON.stringify(identity));\r\n } else if (!identity) {\r\n debug(\"Deleting user from localStorage\");\r\n localStorage.removeItem(USER_LOCAL_STORAGE_KEY);\r\n }\r\n}\r\n\r\n/**\r\n * Gets the SessionData of the current user, or undefined if logged out\r\n */\r\nexport function useSessionData(): { [key: string]: any } | undefined {\r\n return useUserIdentity()?.managedIdentity?.sessionData;\r\n}\r\n\r\n/**\r\n * Gets the JWT of the current user, or undefined if logged out\r\n */\r\nexport function useToken(): string | undefined {\r\n return useUserIdentity()?.jwt;\r\n}\r\n\r\n/**\r\n * Get the IDs and JWT of the current user, or undefined if logged out\r\n */\r\nexport function useUserIdentity(): UserIdentity | undefined {\r\n _lazilyStartGlobally();\r\n const host = useHost();\r\n const identity = useDomContext(host, CONTEXT_NAME) as\r\n | UserIdentity\r\n | undefined;\r\n\r\n const validIdentity = userIdentityFromJwt(identity?.jwt);\r\n if (identity && !validIdentity) {\r\n // Likely that the JWT has expired\r\n setUserIdentity(undefined);\r\n return undefined;\r\n }\r\n return identity;\r\n}\r\n","import { Subject } from \"rxjs\";\r\nimport { bufferTime } from \"rxjs/operators\";\r\nimport { nanoid } from \"nanoid\";\r\nimport { ClientError, RequestDocument } from \"graphql-request/dist/types\";\r\nimport { GraphQLClient } from \"graphql-request\";\r\nimport { print, parse, DocumentNode } from \"graphql\";\r\n\r\nimport combineQuery, {\r\n CombinedQueryBuilder,\r\n NewCombinedQueryBuilder,\r\n} from \"graphql-combine-query\";\r\n\r\n/*************\r\n * constants *\r\n *************/\r\nconst MAX_REQUESTS = 10;\r\nconst REQUEST_INTERVAL = 200; //ms\r\n\r\nexport class BatchedGraphQLClient extends GraphQLClient {\r\n subject = new Subject();\r\n\r\n constructor(url: string, opts?: any) {\r\n super(url, opts);\r\n\r\n const unmergable = new Subject();\r\n const buffer = this.subject.pipe(\r\n bufferTime(REQUEST_INTERVAL, undefined, MAX_REQUESTS)\r\n );\r\n\r\n // look into replacing subscribe\r\n buffer.subscribe(async (queryAddedEvents: QueryAddedEvent[]) => {\r\n // no requests in the last REQUEST_INTERVAL ms\r\n if (!queryAddedEvents.length) {\r\n return;\r\n }\r\n // merge the requests\r\n const {\r\n mergedQuery,\r\n mergedVariables,\r\n mergedQueryAddedEvents,\r\n unmergedQueryAddedEvents,\r\n } = mergeQueryAddedEvents(queryAddedEvents);\r\n\r\n // push queries that failed to merge to a separate stream to be processed\r\n for (const unmergedQuery of unmergedQueryAddedEvents)\r\n unmergable.next(unmergedQuery);\r\n\r\n // If there are no merged queries, all were unmergeable and we can exit here\r\n if (!mergedQueryAddedEvents.length) {\r\n return;\r\n }\r\n\r\n try {\r\n // make the request\r\n const mergedQueryResult = await this.superRequest(\r\n mergedQuery,\r\n mergedVariables\r\n );\r\n //resolve the results\r\n resolveMergedQueryResult(mergedQueryResult, mergedQueryAddedEvents);\r\n } catch (e) {\r\n // So, there is possibly both data and errors here.\r\n if (e instanceof ClientError) {\r\n const { data, errors } = e.response;\r\n if (!data) {\r\n return rejectAllQueryAddedEventsWithError(\r\n mergedQueryAddedEvents,\r\n e\r\n );\r\n }\r\n const aliases = Object.keys(data);\r\n let eventsToResolve = [...mergedQueryAddedEvents];\r\n // reject all that errored:\r\n for (const error of errors) {\r\n let erroredEvent: QueryAddedEvent;\r\n // todo: this needs testing, is path going to work??\r\n error.path.find((key, index, path) => {\r\n if (aliases.includes(key)) {\r\n const erroredId = getIdFromAliasedField(key);\r\n const indexOfErroredEvent = eventsToResolve.findIndex(\r\n (event) => event.id === erroredId\r\n );\r\n if (indexOfErroredEvent === -1) return false;\r\n // remove from aliases\r\n aliases.splice(index, 1);\r\n // remove from events\r\n erroredEvent = eventsToResolve.splice(\r\n indexOfErroredEvent,\r\n 1\r\n )[0];\r\n // rebuild data\r\n const eventSpecificData = removeAliasesFromDataResult(\r\n e.response.data,\r\n erroredEvent\r\n );\r\n // fix path\r\n path[index] = removeAliasFromField(path[index], erroredId);\r\n const { query, variables } = erroredEvent;\r\n // rebuild error to be event specific\r\n const errorResponse = {\r\n ...e.response,\r\n errors: [error],\r\n data: eventSpecificData,\r\n path,\r\n };\r\n const newError = new ClientError(errorResponse, {\r\n query: typeof query !== \"string\" ? print(query) : query,\r\n variables,\r\n });\r\n rejectQueryAddedEventWithError(erroredEvent, newError);\r\n return true;\r\n }\r\n return false;\r\n });\r\n }\r\n // resolve the rest:\r\n resolveMergedQueryResult(data, eventsToResolve);\r\n } else rejectAllQueryAddedEventsWithError(mergedQueryAddedEvents, e);\r\n }\r\n });\r\n\r\n //process unmergable requests as they come in\r\n unmergable.subscribe(async (event: QueryAddedEvent) => {\r\n try {\r\n const { query, variables } = event;\r\n const result = await this.superRequest(query, variables);\r\n resolveSingleQueryResult(result, event);\r\n } catch (e) {\r\n rejectQueryAddedEventWithError(event, e);\r\n }\r\n });\r\n }\r\n\r\n superRequest<T>(query: RequestDocument, variables?: any) {\r\n return super.request<T>(query, variables);\r\n }\r\n\r\n request<T>(query, variables) {\r\n return new Promise<T>((resolve, reject) => {\r\n const queryAddedEvent: QueryAddedEvent = {\r\n query,\r\n variables,\r\n id: generateQueryAddedEventId(),\r\n resolve,\r\n reject,\r\n };\r\n this.subject.next(queryAddedEvent);\r\n });\r\n }\r\n}\r\n\r\n/*************\r\n * types *\r\n *************/\r\n\r\ninterface QueryAddedEvent {\r\n query: RequestDocument;\r\n variables: { [key: string]: unknown };\r\n id: string; // nanoid with '-'s removed\r\n resolve: (data: any) => void;\r\n reject: (err: any) => void;\r\n}\r\n\r\ninterface MergedQueryAddedEvents {\r\n mergedQuery?: RequestDocument;\r\n mergedVariables?: { [key: string]: unknown };\r\n mergedQueryAddedEvents: QueryAddedEvent[];\r\n unmergedQueryAddedEvents: QueryAddedEvent[];\r\n}\r\n\r\n/*************\r\n * utils *\r\n *************/\r\n// Remove dashes and underscores from alias\r\nconst generateQueryAddedEventId = () => nanoid().replace(/[-_]/g, \"\");\r\n\r\n// Numbers not allowed in graphQL alias, so ID must be added to the end\r\nconst aliasFieldOrVariableFn = (name, id) => `${name}_${id}`;\r\n\r\n// ID will always be at the end of the alias separated by a single \"_\"\r\nconst removeAliasFromField = (field: string, id: string) =>\r\n field.replace(`_${id}`, \"\");\r\n\r\nconst getIdFromAliasedField = (field: string): string => {\r\n const fieldArray = field.split(\"_\");\r\n return fieldArray[fieldArray.length - 1];\r\n};\r\n\r\nconst mergeQueryAddedEvents = (\r\n events: QueryAddedEvent[]\r\n): MergedQueryAddedEvents => {\r\n const mergedQueryAddedEvents = [];\r\n const unmergedQueryAddedEvents = [];\r\n const { document, variables } = events.reduce(\r\n (\r\n acc: NewCombinedQueryBuilder | CombinedQueryBuilder,\r\n curr: QueryAddedEvent\r\n ): NewCombinedQueryBuilder | CombinedQueryBuilder => {\r\n const { query, variables, id } = curr;\r\n try {\r\n const parsedQuery: DocumentNode =\r\n typeof query === \"string\" ? parse(query) : query;\r\n // if fragment exists, this request should be processed separately\r\n const fragmentDefinition = parsedQuery.definitions.find(\r\n (node) => node.kind === \"FragmentDefinition\"\r\n );\r\n // '@' is reserved for directives, and since both top level and nested directives are broken, we dont want any.\r\n const queryStr = typeof query === \"string\" ? query : print(query);\r\n const containsDirective = /@/.test(queryStr);\r\n\r\n if (fragmentDefinition || containsDirective) {\r\n unmergedQueryAddedEvents.push(curr);\r\n return acc;\r\n }\r\n\r\n const renameFn = (name) => aliasFieldOrVariableFn(name, id);\r\n // if this fails, event will be added to unmergedQueryAddedEvents\r\n acc = acc.addN(parsedQuery, [variables], renameFn, renameFn);\r\n mergedQueryAddedEvents.push(curr);\r\n return acc;\r\n } catch (e) {\r\n unmergedQueryAddedEvents.push(curr);\r\n return acc;\r\n }\r\n },\r\n combineQuery(\"BatchedQuery\")\r\n ) as CombinedQueryBuilder;\r\n\r\n const mergedQuery = document && print(document);\r\n const mergedVariables = variables;\r\n\r\n return {\r\n mergedQuery,\r\n mergedVariables,\r\n mergedQueryAddedEvents,\r\n unmergedQueryAddedEvents,\r\n };\r\n};\r\n\r\nconst removeAliasesFromDataResult = (\r\n queryResult: any,\r\n event: QueryAddedEvent\r\n) => {\r\n if (!queryResult) return queryResult;\r\n const aliases = Object.keys(queryResult);\r\n const { id } = event;\r\n return aliases.reduce((data, key) => {\r\n if (key.endsWith(id)) {\r\n data = {\r\n ...data,\r\n [removeAliasFromField(key, id)]: queryResult[key],\r\n };\r\n }\r\n return data;\r\n }, {});\r\n};\r\n\r\nconst resolveSingleQueryResult = (queryResult: any, event: QueryAddedEvent) => {\r\n const { resolve } = event;\r\n resolve(queryResult);\r\n};\r\n\r\nconst resolveMergedQueryResult = (\r\n mergedQueryResult: any,\r\n events: QueryAddedEvent[]\r\n): void => {\r\n for (const event of events) {\r\n //figure out what data we need\r\n const data = removeAliasesFromDataResult(mergedQueryResult, event);\r\n event.resolve(data);\r\n }\r\n};\r\n\r\nconst rejectQueryAddedEventWithError = (\r\n event: QueryAddedEvent,\r\n err: Error\r\n): void => {\r\n const { reject } = event;\r\n reject(err);\r\n};\r\n\r\nconst rejectAllQueryAddedEventsWithError = (\r\n events: QueryAddedEvent[],\r\n err: Error\r\n): void => {\r\n for (const event of events) {\r\n const { reject } = event;\r\n reject(err);\r\n }\r\n};\r\n","import memoize from \"fast-memoize\";\r\nimport { BatchedGraphQLClient } from \"../../environment/BatchedGraphQLClient\";\r\nimport { useAppDomain, useTenantAlias, useToken } from \"../../environment\";\r\nimport { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { useHost } from \"../useHost\";\r\nimport { GraphQLClient } from \"graphql-request\";\r\n\r\nexport const GRAPHQL_CONTEXT = \"sq:graphql-client\";\r\n\r\nfunction createGraphQlClient(\r\n appDomain: string,\r\n tenantAlias: string,\r\n token?: string\r\n): GraphQLClient {\r\n const uri = appDomain + \"/api/v1/\" + tenantAlias + \"/graphql\";\r\n const headers = {\r\n Authorization: `Bearer ${token || \"\"}`,\r\n };\r\n const newClient = new BatchedGraphQLClient(uri, {\r\n headers,\r\n });\r\n return newClient;\r\n}\r\n\r\nexport const memoizedGraphQLClient = memoize(createGraphQlClient);\r\n\r\nfunction useGraphQLClient(): GraphQLClient {\r\n const token = useToken();\r\n const appDomain = useAppDomain();\r\n const tenantAlias = useTenantAlias();\r\n\r\n // Memoization is shared. One client per domain, tenant and token (or null)\r\n const localClient: GraphQLClient = memoizedGraphQLClient(\r\n appDomain,\r\n tenantAlias,\r\n token\r\n );\r\n const host = useHost();\r\n const clientFromContext = useDomContext<GraphQLClient>(\r\n host,\r\n GRAPHQL_CONTEXT,\r\n // Won't poll / re-attempt\r\n { attempts: 0 }\r\n );\r\n return clientFromContext ?? localClient;\r\n}\r\n\r\nexport default useGraphQLClient;\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useReducer,\r\n useRef,\r\n} from \"@saasquatch/universal-hooks\";\r\nimport useGraphQLClient from \"./useGraphQLClient\";\r\nimport { RequestDocument } from \"graphql-request/dist/types\";\r\nimport { GraphQLClient } from \"graphql-request\";\r\n\r\nexport type GqlType = RequestDocument;\r\n\r\nexport interface BaseQueryData<T = unknown> {\r\n loading: boolean;\r\n data?: T;\r\n errors?: GraphQlRequestError<T>;\r\n}\r\n\r\nexport type QueryData<T> = BaseQueryData<T> & {\r\n refetch: (variables?: unknown) => unknown;\r\n};\r\n\r\n/**\r\n * Note: reverse-engineered from a returned error. May not capture all error types.\r\n */\r\n\r\nexport type GraphQlRequestError<T> = {\r\n response: {\r\n errors: [\r\n {\r\n message: string;\r\n locations: [{ line: number; column: number }];\r\n path: string[];\r\n extensions: {\r\n apiError: {\r\n message: string;\r\n statusCode: number;\r\n apiErrorCode: string;\r\n rsCode: string;\r\n };\r\n classification: string;\r\n };\r\n }\r\n ];\r\n data: Partial<T>;\r\n status: number;\r\n };\r\n request: {\r\n query: string;\r\n variables: { [key: string]: unknown };\r\n };\r\n message?: string;\r\n};\r\n\r\ntype Action<T> =\r\n | {\r\n type: \"loading\";\r\n }\r\n | {\r\n type: \"data\";\r\n payload?: T;\r\n }\r\n | {\r\n type: \"errors\";\r\n payload: GraphQlRequestError<T>;\r\n };\r\n\r\nfunction reducer<T>(\r\n // @ts-ignore = unused\r\n state: BaseQueryData<T>,\r\n action: Action<T>\r\n): BaseQueryData<T> {\r\n switch (action.type) {\r\n case \"loading\":\r\n return { data: undefined, errors: undefined, loading: true };\r\n case \"data\":\r\n return { data: action.payload, errors: undefined, loading: false };\r\n case \"errors\":\r\n return { data: undefined, errors: action.payload, loading: false };\r\n }\r\n}\r\n\r\nexport function useBaseQuery<T = any>(\r\n query: GqlType,\r\n initialState: BaseQueryData<T>\r\n): [\r\n BaseQueryData<T>,\r\n (variables: unknown, skipLoading?: boolean) => Promise<void>\r\n] {\r\n const client: GraphQLClient = useGraphQLClient();\r\n const [state, dispatch] = useReducer<BaseQueryData<T>, Action<T>>(\r\n reducer,\r\n initialState\r\n );\r\n const update = useCallback(\r\n async function (variables: unknown, skipLoading = false) {\r\n if (!client) {\r\n // Hook will return an error state when no client exists (used to be a loading state)\r\n dispatch({\r\n type: \"errors\",\r\n // @ts-expect-error -- Need to fix this\r\n payload: new Error(\"No GraphQL client found\"),\r\n });\r\n return;\r\n }\r\n try {\r\n // Skips showing a \"loading\" state before the data appears\r\n if (!skipLoading) dispatch({ type: \"loading\" });\r\n const res = await client.request<T>(query, variables);\r\n dispatch({ type: \"data\", payload: res });\r\n } catch (error) {\r\n dispatch({ type: \"errors\", payload: error });\r\n }\r\n },\r\n [client, query, dispatch]\r\n );\r\n\r\n return [state, update];\r\n}\r\n","import { BaseQueryData, GqlType, useBaseQuery } from \"./useBaseQuery\";\r\n\r\nconst initialMutationState: BaseQueryData = {\r\n loading: false,\r\n data: undefined,\r\n errors: undefined,\r\n} as const;\r\n\r\nexport function useMutation<T = any>(\r\n query: GqlType\r\n): [(e: unknown) => unknown, BaseQueryData<T>] {\r\n const [state, update] = useBaseQuery<T>(\r\n query,\r\n initialMutationState as BaseQueryData<T>\r\n );\r\n return [update, state];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport decode from \"jwt-decode\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n setUserIdentity,\r\n DecodedSquatchJWT,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst AuthenticateWithEmailAndPasswordMutation = gql`\r\n mutation AuthenticateWithEmailAndPassword(\r\n $email: String!\r\n $password: String!\r\n ) {\r\n authenticateManagedIdentityWithEmailAndPassword(\r\n authenticateManagedIdentityWithEmailAndPasswordInput: {\r\n email: $email\r\n password: $password\r\n }\r\n ) {\r\n token\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface AuthenticateWithEmailAndPasswordResult {\r\n authenticateManagedIdentityWithEmailAndPassword: {\r\n token: string;\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useAuthenticateWithEmailAndPasswordMutation(): [\r\n (e: { email: string; password: string }) => unknown,\r\n BaseQueryData<AuthenticateWithEmailAndPasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] =\r\n useMutation<AuthenticateWithEmailAndPasswordResult>(\r\n AuthenticateWithEmailAndPasswordMutation\r\n );\r\n\r\n useEffect(() => {\r\n if (data?.authenticateManagedIdentityWithEmailAndPassword) {\r\n const { authenticateManagedIdentityWithEmailAndPassword: res } = data;\r\n const jwt = res.token;\r\n const { user } = decode<DecodedSquatchJWT>(jwt);\r\n setUserIdentity({\r\n jwt,\r\n id: user.id,\r\n accountId: user.accountId,\r\n managedIdentity: {\r\n email: res.email,\r\n emailVerified: res.emailVerified,\r\n sessionData: res.sessionData,\r\n },\r\n });\r\n }\r\n }, [data?.authenticateManagedIdentityWithEmailAndPassword]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport decode from \"jwt-decode\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n setUserIdentity,\r\n DecodedSquatchJWT,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst RegisterWithEmailAndPasswordMutation = gql`\r\n mutation RegisterWithEmailAndPassword(\r\n $email: String!\r\n $password: String!\r\n $formData: RSJsonNode\r\n $redirectPath: String\r\n ) {\r\n registerManagedIdentityWithEmailAndPassword(\r\n registerManagedIdentityWithEmailAndPasswordInput: {\r\n email: $email\r\n password: $password\r\n formData: $formData\r\n redirectPath: $redirectPath\r\n }\r\n ) {\r\n token\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface RegisterWithEmailAndPasswordResult {\r\n registerManagedIdentityWithEmailAndPassword: {\r\n token: string;\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useRegisterWithEmailAndPasswordMutation(): [\r\n (e: {\r\n email: string;\r\n password: string;\r\n formData?: Record<string, any>;\r\n }) => unknown,\r\n BaseQueryData<RegisterWithEmailAndPasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] =\r\n useMutation<RegisterWithEmailAndPasswordResult>(\r\n RegisterWithEmailAndPasswordMutation\r\n );\r\n\r\n useEffect(() => {\r\n if (data?.registerManagedIdentityWithEmailAndPassword) {\r\n const { registerManagedIdentityWithEmailAndPassword: res } = data;\r\n const jwt = res.token;\r\n const { user } = decode<DecodedSquatchJWT>(jwt);\r\n setUserIdentity({\r\n jwt,\r\n id: user.id,\r\n accountId: user.accountId,\r\n managedIdentity: {\r\n email: res.email,\r\n emailVerified: res.emailVerified,\r\n sessionData: res.sessionData,\r\n },\r\n });\r\n }\r\n }, [data?.registerManagedIdentityWithEmailAndPassword]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst ChangePasswordMutation = gql`\r\n mutation ChangePassword($password: String!) {\r\n changeManagedIdentityPassword(\r\n changeManagedIdentityPasswordInput: { password: $password }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface ChangePasswordResult {\r\n changeManagedIdentityPassword: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useChangePasswordMutation(): [\r\n (e: { password: string }) => unknown,\r\n BaseQueryData<ChangePasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] =\r\n useMutation<ChangePasswordResult>(ChangePasswordMutation);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport decode from \"jwt-decode\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n setUserIdentity,\r\n DecodedSquatchJWT,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst ResetPasswordMutation = gql`\r\n mutation ResetPassword($oobCode: String!, $password: String!) {\r\n resetManagedIdentityPassword(\r\n resetManagedIdentityPasswordInput: {\r\n password: $password\r\n oobCode: $oobCode\r\n }\r\n ) {\r\n token\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface ResetPasswordResult {\r\n resetManagedIdentityPassword: {\r\n token: string;\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useResetPasswordMutation(): [\r\n (e: { oobCode: string; password: string }) => unknown,\r\n BaseQueryData<ResetPasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] = useMutation<ResetPasswordResult>(\r\n ResetPasswordMutation\r\n );\r\n\r\n useEffect(() => {\r\n if (data?.resetManagedIdentityPassword) {\r\n const { resetManagedIdentityPassword: res } = data;\r\n const jwt = res.token;\r\n const { user } = decode<DecodedSquatchJWT>(jwt);\r\n setUserIdentity({\r\n jwt,\r\n id: user.id,\r\n accountId: user.accountId,\r\n managedIdentity: {\r\n email: res.email,\r\n emailVerified: res.emailVerified,\r\n sessionData: res.sessionData,\r\n },\r\n });\r\n }\r\n }, [data?.resetManagedIdentityPassword]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst VerifyPasswordResetCodeMutation = gql`\r\n mutation VerifyPasswordResetCode($oobCode: String!) {\r\n verifyManagedIdentityPasswordResetCode(\r\n verifyManagedIdentityPasswordResetCodeInput: { oobCode: $oobCode }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface VerifyPasswordResetCodeResult {\r\n verifyManagedIdentityPasswordResetCode: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useVerifyPasswordResetCodeMutation(): [\r\n (e: { oobCode: string }) => unknown,\r\n BaseQueryData<VerifyPasswordResetCodeResult>\r\n] {\r\n return useMutation<VerifyPasswordResetCodeResult>(\r\n VerifyPasswordResetCodeMutation\r\n );\r\n}\r\n","import { useCallback } from \"@saasquatch/universal-hooks\";\r\nimport { useDeepCompareEffect } from \"../useDeepEffect\";\r\nimport { useHost } from \"../useHost\";\r\nimport { GqlType } from \"./useBaseQuery\";\r\n\r\nexport const REFRESH_EVENT_NAME = \"sq:refresh\";\r\n\r\nexport function useRefreshDispatcher() {\r\n const host = useHost();\r\n\r\n const refresh = useCallback(() => {\r\n host.dispatchEvent(\r\n new CustomEvent(REFRESH_EVENT_NAME, {\r\n bubbles: true,\r\n composed: true,\r\n cancelable: true,\r\n detail: {\r\n // Could add some \"scope\" for more granular refresh\r\n },\r\n })\r\n );\r\n }, [host]);\r\n\r\n return { refresh };\r\n}\r\n\r\nexport function useRefreshListener({\r\n skip = false,\r\n update,\r\n variables,\r\n}: {\r\n skip?: boolean;\r\n update: (variables: unknown, skipLoading?: boolean) => unknown;\r\n variables: unknown;\r\n}) {\r\n useDeepCompareEffect(() => {\r\n const listener = (e: CustomEvent) => {\r\n !skip && update(variables, true);\r\n };\r\n document.addEventListener(REFRESH_EVENT_NAME, listener);\r\n return () => document.removeEventListener(REFRESH_EVENT_NAME, listener);\r\n }, [variables, update, skip]);\r\n}\r\n","/*\r\n * Forked From: https://github.com/kentcdodds/use-deep-compare-effect/blob/main/src/index.ts\r\n *\r\n * The MIT License (MIT)\r\n * Copyright (c) 2020 Kent C. Dodds\r\n *\r\n */\r\n\r\nimport { useEffect, useRef, useMemo } from \"@saasquatch/universal-hooks\";\r\nimport { equal as deepEqual } from \"@wry/equality\";\r\n\r\ntype UseEffectParams = Parameters<typeof useEffect>;\r\ntype EffectCallback = UseEffectParams[0];\r\ntype DependencyList = UseEffectParams[1];\r\n// yes, I know it's void, but I like what this communicates about\r\n// the intent of these functions: It's just like useEffect\r\ntype UseEffectReturn = ReturnType<typeof useEffect>;\r\n\r\n\r\n/**\r\n * @param value the value to be memoized (usually a dependency list)\r\n * @returns a memoized version of the value as long as it remains deeply equal\r\n */\r\nexport function useDeepCompareMemoize<T>(value: T) {\r\n const ref = useRef<T>(value);\r\n const signalRef = useRef<number>(0);\r\n\r\n if (!deepEqual(value, ref.current)) {\r\n ref.current = value;\r\n signalRef.current += 1;\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return useMemo(() => ref.current, [signalRef.current]);\r\n}\r\n\r\nexport function useDeepCompareEffect(\r\n callback: EffectCallback,\r\n dependencies: DependencyList\r\n): UseEffectReturn {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return useEffect(callback, useDeepCompareMemoize(dependencies));\r\n}\r\n\r\nexport default useDeepCompareEffect;\r\n","import { useRef } from \"@saasquatch/universal-hooks\";\r\nimport { useRefreshListener } from \"./Refresh\";\r\nimport {\r\n BaseQueryData,\r\n GqlType,\r\n QueryData,\r\n useBaseQuery,\r\n} from \"./useBaseQuery\";\r\n\r\nconst initialLazyQueryState: BaseQueryData = {\r\n loading: false,\r\n data: undefined,\r\n errors: undefined,\r\n} as const;\r\n\r\nconst NOTLOADED = Symbol();\r\nexport function useLazyQuery<T = any>(\r\n query: GqlType\r\n): [(e: unknown) => unknown, QueryData<T>] {\r\n const [state, update] = useBaseQuery<T>(\r\n query,\r\n initialLazyQueryState as BaseQueryData<T>\r\n );\r\n\r\n const variablesRef = useRef<unknown>(NOTLOADED);\r\n // To preserve laziness, this query will not refresh if the query has not already been run at least once\r\n const skip = variablesRef.current === NOTLOADED;\r\n useRefreshListener({\r\n skip,\r\n update,\r\n variables: variablesRef.current,\r\n });\r\n\r\n return [\r\n update,\r\n {\r\n ...state,\r\n // can override props when refetching for new pagination, offset, etc\r\n refetch: (variables) => {\r\n variablesRef.current = variables;\r\n update(variables);\r\n },\r\n },\r\n ];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { useEffect, useCallback } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { QueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n useUserIdentity,\r\n setUserIdentity,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useLazyQuery } from \"../graphql/useLazyQuery\";\r\n\r\nconst ManagedIdentityQuery = gql`\r\n query ManagedIdentity {\r\n managedIdentity {\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface ManagedIdentityResult {\r\n managedIdentity: {\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useManagedIdentityQuery(): [\r\n () => unknown,\r\n QueryData<ManagedIdentityResult>\r\n] {\r\n const userIdentity = useUserIdentity();\r\n const [request, { loading, data, errors, refetch }] =\r\n useLazyQuery<ManagedIdentityResult>(ManagedIdentityQuery);\r\n\r\n useEffect(() => {\r\n if (data?.managedIdentity) {\r\n const { managedIdentity: res } = data;\r\n setUserIdentity({\r\n ...userIdentity,\r\n managedIdentity: res,\r\n });\r\n }\r\n }, [data?.managedIdentity]);\r\n\r\n const requestNoParams = useCallback(() => request({}), [request]);\r\n\r\n return [requestNoParams, { loading, data, errors, refetch }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\nimport { useManagedIdentityQuery } from \"./useManagedIdentityQuery\";\r\n\r\nconst VerifyEmailMutation = gql`\r\n mutation VerifyEmail($oobCode: String!) {\r\n verifyManagedIdentityEmail(\r\n verifyManagedIdentityEmailInput: { oobCode: $oobCode }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface VerifyEmailResult {\r\n verifyManagedIdentityEmail: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useVerifyEmailMutation(): [\r\n (e: { oobCode: string }) => unknown,\r\n BaseQueryData<VerifyEmailResult>\r\n] {\r\n const [refreshManagedIdentity] = useManagedIdentityQuery();\r\n const [request, { loading, data, errors }] =\r\n useMutation<VerifyEmailResult>(VerifyEmailMutation);\r\n\r\n useEffect(() => {\r\n if (data?.verifyManagedIdentityEmail?.success) {\r\n refreshManagedIdentity();\r\n }\r\n }, [data?.verifyManagedIdentityEmail?.success]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst RequestPasswordResetEmailMutation = gql`\r\n mutation RequestPasswordResetEmail(\r\n $email: String!\r\n $urlParams: RSJsonNode\r\n $redirectPath: String\r\n ) {\r\n requestManagedIdentityPasswordResetEmail(\r\n requestManagedIdentityPasswordResetEmailInput: {\r\n email: $email\r\n urlParams: $urlParams\r\n redirectPath: $redirectPath\r\n }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface RequestPasswordResetEmailResult {\r\n requestManagedIdentityPasswordResetEmail: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useRequestPasswordResetEmailMutation(): [\r\n (e: { email: string; urlParams?: Record<string, any> }) => unknown,\r\n BaseQueryData<RequestPasswordResetEmailResult>\r\n] {\r\n return useMutation<RequestPasswordResetEmailResult>(\r\n RequestPasswordResetEmailMutation\r\n );\r\n}\r\n","import gql from \"graphql-tag\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst RequestVerificationEmailMutation = gql`\r\n mutation RequestVerificationEmail(\r\n $email: String!\r\n $urlParams: RSJsonNode\r\n $redirectPath: String\r\n ) {\r\n requestManagedIdentityVerificationEmail(\r\n requestManagedIdentityVerificationEmailInput: {\r\n email: $email\r\n urlParams: $urlParams\r\n redirectPath: $redirectPath\r\n }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface RequestVerificationEmailResult {\r\n requestManagedIdentityVerificationEmail: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useRequestVerificationEmailMutation(): [\r\n (e: { email: string; urlParams?: Record<string, any> }) => unknown,\r\n BaseQueryData<RequestVerificationEmailResult>\r\n] {\r\n return useMutation<RequestVerificationEmailResult>(\r\n RequestVerificationEmailMutation\r\n );\r\n}\r\n","import { equal } from \"@wry/equality\";\r\nimport { useRef } from \"@saasquatch/universal-hooks\";\r\n\r\nexport function useDeepMemo<TKey, TValue>(\r\n memoFn: () => TValue,\r\n key: TKey\r\n): TValue {\r\n //@ts-ignore\r\n const ref = useRef<{ key: TKey; value: TValue }>();\r\n\r\n if (!ref.current || !equal(key, ref.current.key)) {\r\n ref.current = { key, value: memoFn() };\r\n }\r\n\r\n return ref.current.value;\r\n}\r\n","import { useReducer } from \"@saasquatch/universal-hooks\";\r\n\r\nexport function useTick(): readonly [number, () => unknown] {\r\n //@ts-expect-error -- bad typing on callback\r\n return useReducer<number, number, number>((x) => x + 1, 0);\r\n}\r\n","import { useDeepMemo } from \"../useDeepMemo\";\r\nimport { useTick } from \"../useTick\";\r\nimport { useRefreshListener } from \"./Refresh\";\r\nimport {\r\n BaseQueryData,\r\n GqlType,\r\n QueryData,\r\n useBaseQuery,\r\n} from \"./useBaseQuery\";\r\n\r\n// from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\r\nfunction deepFreeze(object) {\r\n // Retrieve the property names defined on object\r\n const propNames = Object.getOwnPropertyNames(object);\r\n\r\n // Freeze properties before freezing self\r\n\r\n for (const name of propNames) {\r\n const value = object[name];\r\n\r\n if (value && typeof value === \"object\") {\r\n deepFreeze(value);\r\n }\r\n }\r\n\r\n return Object.freeze(object);\r\n}\r\n\r\nexport const initialQueryState: BaseQueryData = {\r\n loading: true,\r\n data: undefined,\r\n errors: undefined,\r\n} as const;\r\n\r\nexport function useQuery<T = any>(\r\n query: GqlType,\r\n variables: unknown,\r\n skip?: boolean\r\n): QueryData<T> {\r\n const [state, update] = useBaseQuery<T>(\r\n query,\r\n initialQueryState as BaseQueryData<T>\r\n );\r\n\r\n const [tick, forceUpdate] = useTick();\r\n\r\n useDeepMemo(() => {\r\n !skip && update(variables);\r\n }, [query, variables, update, tick, skip]);\r\n\r\n useRefreshListener({ skip, update, variables });\r\n\r\n return deepFreeze({\r\n ...state,\r\n // can override props when refetching for new pagination, offset, etc\r\n refetch: forceUpdate,\r\n });\r\n}\r\n","import { useEffect } from \"@saasquatch/universal-hooks\";\r\nimport {\r\n createBrowserHistory,\r\n createMemoryHistory,\r\n History,\r\n Location as HistLocation,\r\n To,\r\n} from \"history\";\r\nimport { getEnvironmentSDK } from \"../environment/environment\";\r\nimport { useTick } from \"./useTick\";\r\n\r\n/**\r\n * Instatiates a global `history` object that everything will connect to.\r\n *\r\n * This is not set in context, because it really should be global in a similar way to `window.location.push` for simplicity in setting up navigation\r\n */\r\nfunction makeHistory(): History {\r\n switch (getEnvironmentSDK().type) {\r\n case \"SquatchPortal\":\r\n return createBrowserHistory();\r\n default:\r\n return createMemoryHistory();\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n squatchHistory: History;\r\n }\r\n}\r\n\r\nfunction lazyHistory() {\r\n window.squatchHistory = window.squatchHistory || makeHistory();\r\n return window.squatchHistory;\r\n}\r\n\r\n/**\r\n * Provides a way of navigating pages. Can be called from views or hooks or any code on the page.\r\n *\r\n * Doesn't include any information about the current page since the current page can change.\r\n *\r\n * To listen to page changes use `useCurrentPage`\r\n */\r\nexport const navigation: Navigation = {\r\n createHref: (...args) => lazyHistory().createHref(...args),\r\n push: (...args) => lazyHistory().push(...args),\r\n replace: (...args) => lazyHistory().replace(...args),\r\n go: (...args) => lazyHistory().go(...args),\r\n back: () => lazyHistory().back(),\r\n forward: (...args) => lazyHistory().forward(...args),\r\n};\r\n\r\n/**\r\n * Returns the current location. Similar to `window.location` but works with SPA page changes and virtual pages in Squatch.js\r\n */\r\nexport function useCurrentPage(): HistLocation {\r\n const [, tick] = useTick();\r\n useEffect(() => {\r\n const cleanup = lazyHistory().listen(() => {\r\n // re-render\r\n tick();\r\n });\r\n return cleanup;\r\n }, []);\r\n\r\n return lazyHistory().location;\r\n}\r\n\r\n/**\r\n * An immutable subset of the `History` API.\r\n *\r\n * Removes the mutable properties (action, block, actions, listen)\r\n */\r\nexport type Navigation = Omit<\r\n Omit<Omit<Omit<History, \"location\">, \"block\">, \"action\">,\r\n \"listen\"\r\n>;\r\n","import { useState } from \"@saasquatch/universal-hooks\";\r\n\r\nexport function usePagination(pageVars: { limit: number; offset: number }) {\r\n const [pageState, setPageState] = useState({\r\n limit: pageVars.limit,\r\n offset: pageVars.offset,\r\n });\r\n const { offset, limit } = pageState;\r\n\r\n const calcOffset = (limit: number, page: number) => limit * page;\r\n const calcPage = (offset: number, limit: number) =>\r\n Math.ceil(offset / limit) || 0;\r\n const calcPageCount = (totalCount: number, limit: number) =>\r\n Math.ceil(totalCount / limit) || 0;\r\n\r\n const setLimit = (newLimit: number) => {\r\n const newPage = calcPage(offset, newLimit);\r\n const newOffset = calcOffset(newLimit, newPage);\r\n setPageState({\r\n ...pageState,\r\n limit: newLimit,\r\n offset: newOffset,\r\n });\r\n };\r\n\r\n // page numbering starts at 0\r\n const setCurrentPage = (newPage: number) => {\r\n let newOffset = calcOffset(newPage, limit);\r\n setPageState((pageState) => ({\r\n ...pageState,\r\n offset: newOffset,\r\n }));\r\n };\r\n\r\n // there are no safety guards here for invalid inputs\r\n function calculatePagination(count: number, totalCount: number) {\r\n const currentPage = calcPage(offset, limit);\r\n const pageCount = calcPageCount(totalCount, limit);\r\n\r\n const rangeOnPage: string =\r\n count === 0\r\n ? \"0\"\r\n : count > 1\r\n ? `${offset + 1}-${offset + count}`\r\n : `${offset + 1}`;\r\n const pageProgress: string = `${rangeOnPage} of ${totalCount}`;\r\n\r\n return { currentPage, pageCount, rangeOnPage, pageProgress };\r\n }\r\n\r\n return {\r\n limit,\r\n setLimit,\r\n offset,\r\n setCurrentPage,\r\n calculatePagination,\r\n };\r\n}\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"@saasquatch/universal-hooks\";\r\nimport debounce from \"debounce\";\r\n\r\nfunction valueEquality<T>(left: T, right: T): boolean {\r\n return left === right;\r\n}\r\n\r\n/**\r\n * Provides a debounced value\r\n *\r\n * Forked from React version here: https://github.com/xnimorz/use-debounce\r\n *\r\n * @param value\r\n * @param delay\r\n * @param options\r\n */\r\nexport function useDebounce<T>(\r\n value: T,\r\n delay: number,\r\n options?: {\r\n maxWait?: number;\r\n leading?: boolean;\r\n trailing?: boolean;\r\n equalityFn?: (left: T, right: T) => boolean;\r\n }\r\n) {\r\n const eq = (options && options.equalityFn) || valueEquality;\r\n\r\n const [state, dispatch] = useState(value);\r\n const debounced = useDebouncedCallback(\r\n useCallback((value: T) => dispatch(value), []),\r\n delay,\r\n options\r\n );\r\n const previousValue = useRef(value);\r\n\r\n useEffect(() => {\r\n // We need to use this condition otherwise we will run debounce timer for the first render (including maxWait option)\r\n if (!eq(previousValue.current, value)) {\r\n debounced.callback(value);\r\n previousValue.current = value;\r\n }\r\n }, [value, debounced, eq]);\r\n\r\n return [\r\n state,\r\n {\r\n cancel: debounced.cancel,\r\n flush: debounced.flush,\r\n },\r\n ] as const;\r\n}\r\n\r\nexport interface CallOptions {\r\n leading?: boolean;\r\n trailing?: boolean;\r\n}\r\n\r\nexport interface ControlFunctions {\r\n cancel: () => void;\r\n flush: () => void;\r\n}\r\n\r\n/**\r\n * Subsequent calls to the debounced function `debounced.callback` return the result of the last func invocation.\r\n * Note, that if there are no previous invocations it's mean you will get undefined. You should check it in your code properly.\r\n */\r\nexport interface DebouncedState<T extends (...args: any[]) => ReturnType<T>>\r\n extends ControlFunctions {\r\n callback: (...args: Parameters<T>) => ReturnType<T>;\r\n}\r\n\r\n/**\r\n * Creates a debounced function that delays invoking `func` until after `wait`\r\n * milliseconds have elapsed since the last time the debounced function was\r\n * invoked, or until the next browser frame is drawn. The debounced function\r\n * comes with a `cancel` method to cancel delayed `func` invocations and a\r\n * `flush` method to immediately invoke them. Provide `options` to indicate\r\n * whether `func` should be invoked on the leading and/or trailing edge of the\r\n * `wait` timeout. The `func` is invoked with the last arguments provided to the\r\n * debounced function. Subsequent calls to the debounced function return the\r\n * result of the last `func` invocation.\r\n\r\n *\r\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\r\n * for details over the differences between `debounce` and `throttle`.\r\n *\r\n * @category Function\r\n * @param {Function} func The function to debounce.\r\n * @param {number} [wait=0]\r\n * The number of milliseconds to delay\r\n * @param {Object} [options={}] The options object.\r\n * @param {boolean} [options.leading=false]\r\n * Specify invoking on the leading edge of the timeout.\r\n * @returns {Function} Returns the new debounced function.\r\n * @example\r\n */\r\nexport function useDebouncedCallback<\r\n T extends (...args: any[]) => ReturnType<T>\r\n>(\r\n func: T,\r\n wait: number = 0,\r\n options: CallOptions = { leading: false }\r\n): DebouncedState<T> {\r\n const callback = useMemo(() => debounce(func, wait, options.leading), [\r\n func,\r\n wait,\r\n options.leading,\r\n ]);\r\n\r\n const { flush, clear } = callback;\r\n\r\n return {\r\n flush,\r\n cancel: clear,\r\n callback,\r\n };\r\n}\r\n","import { gql } from \"graphql-request\";\r\nimport {\r\n useEngagementMedium,\r\n useProgramId,\r\n useUserIdentity,\r\n} from \"../environment\";\r\nimport { useMutation } from \"./graphql/useMutation\";\r\n\r\nconst FIRE_EVENT = gql`\r\n mutation ($eventMeta: UserAnalyticsEvent!) {\r\n createUserAnalyticsEvent(eventMeta: $eventMeta)\r\n }\r\n`;\r\n\r\nexport function useShareEvent() {\r\n const engagementMedium = useEngagementMedium();\r\n const userIdentity = useUserIdentity();\r\n const program = useProgramId();\r\n const [dispatch] = useMutation(FIRE_EVENT);\r\n\r\n if (!userIdentity) {\r\n // Not logged in. No-op callback for tracking sharing.\r\n return () => {};\r\n }\r\n\r\n return (shareMedium: string) => {\r\n const variables = {\r\n eventMeta: {\r\n id: userIdentity.id,\r\n accountId: userIdentity.accountId,\r\n programId: program,\r\n type: \"USER_REFERRAL_PROGRAM_ENGAGEMENT_EVENT\",\r\n meta: {\r\n engagementMedium: engagementMedium,\r\n shareMedium,\r\n },\r\n },\r\n };\r\n dispatch(variables);\r\n };\r\n}\r\n","import { useEffect, useReducer } from \"@saasquatch/universal-hooks\";\r\nimport { gql } from \"graphql-request\";\r\nimport debugFn from \"debug\";\r\nimport jsonpointer from \"jsonpointer\";\r\nimport { useMutation } from \"./graphql/useMutation\";\r\nimport { useLazyQuery } from \"./graphql/useLazyQuery\";\r\nimport { useDeepMemo } from \"./useDeepMemo\";\r\nexport const debug = debugFn(\"sq:useForm\");\r\n\r\nconst GET_FORM = gql`\r\n query ($key: String!) {\r\n form(key: $key) {\r\n schema\r\n initialData {\r\n initialData\r\n isEnabled\r\n isEnabledErrorMessage\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst SUBMIT_FORM = gql`\r\n mutation ($formSubmissionInput: FormSubmissionInput!) {\r\n submitForm(formSubmissionInput: $formSubmissionInput) {\r\n success\r\n results {\r\n ... on FormHandlerSubmissionResult {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n result\r\n }\r\n ... on FormHandlerError {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n errorType\r\n error\r\n errorCode\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst VALIDATE_FORM = gql`\r\n query ($formValidationInput: FormValidationInput!) {\r\n validateForm(formValidationInput: $formValidationInput) {\r\n valid\r\n results {\r\n ... on FormHandlerValidationResult {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n result\r\n }\r\n ... on FormHandlerError {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n errorType\r\n error\r\n errorCode\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\ntype UseFormProps = {\r\n formKey: string;\r\n formRef: HTMLFormElement;\r\n /** Flag to submit the form automatically once validated */\r\n autoSubmit?: boolean;\r\n setInitialData?: (htmlForm?: HTMLFormElement, initialData?: unknown) => void;\r\n};\r\n\r\ntype FormState = {\r\n validating: boolean;\r\n valid: boolean;\r\n enabled: boolean;\r\n disabledMessage: string;\r\n error: string;\r\n formData: object;\r\n validationData: any;\r\n submitData: any;\r\n};\r\n\r\nexport function useForm(props: UseFormProps) {\r\n const { formKey, formRef, autoSubmit = false } = props;\r\n\r\n const [getForm, { data, loading: loadingForm }] = useLazyQuery(GET_FORM);\r\n const [submit, submitData] = useMutation(SUBMIT_FORM);\r\n const [validate, validationData] = useLazyQuery(VALIDATE_FORM);\r\n\r\n const initialState = {\r\n enabled: false,\r\n validating: false,\r\n valid: true,\r\n validationMessage: \"\",\r\n error: \"\",\r\n disabledMessage: \"\",\r\n formData: {},\r\n validationData,\r\n submitData,\r\n };\r\n\r\n const [formState, setFormState] = useReducer<FormState, Partial<FormState>>(\r\n (state, next) => ({\r\n ...state,\r\n ...next,\r\n }),\r\n initialState\r\n );\r\n\r\n const { enabled, disabledMessage, validating, valid, error, formData } =\r\n formState;\r\n\r\n useDeepMemo(() => {\r\n debug(\"submitData useEffect\", submitData);\r\n setFormState({ submitData });\r\n }, [submitData]);\r\n\r\n useDeepMemo(() => {\r\n debug(\"validationData useEffect\", validationData);\r\n setFormState({ validationData });\r\n }, [validationData]);\r\n\r\n // load initial data into form\r\n useEffect(() => {\r\n async function setInitialData(htmlForm, initialData) {\r\n const inputs = htmlForm.elements;\r\n\r\n const formContent = new FormData(htmlForm);\r\n\r\n debug({ htmlForm, formContent });\r\n formContent?.forEach((value, key) => {\r\n debug({ value, key, inputs });\r\n const input = inputs.namedItem(key) as HTMLInputElement;\r\n\r\n try {\r\n if (input.type == \"checkbox\") {\r\n input.checked = jsonpointer.get(initialData, key);\r\n } else {\r\n input.value = jsonpointer.get(initialData, key) || \"\";\r\n }\r\n } catch (error) {\r\n debug(\"no initialData found for key\", key);\r\n }\r\n });\r\n }\r\n function initialize() {\r\n setFormState({\r\n enabled: data?.form.initialData?.isEnabled,\r\n disabledMessage: data?.form?.initialData?.isEnabledErrorMessage,\r\n });\r\n const htmlForm = formRef;\r\n\r\n if (!htmlForm) return;\r\n\r\n const initialData = data?.form?.initialData?.initialData;\r\n\r\n props.setInitialData !== undefined\r\n ? props.setInitialData(htmlForm, initialData)\r\n : setInitialData(htmlForm, initialData);\r\n }\r\n if (!loadingForm && data) initialize();\r\n }, [loadingForm]);\r\n\r\n // submit if form data is valid\r\n useEffect(() => {\r\n if (!!formState.validationData) {\r\n setFormState({\r\n validating: false,\r\n valid: formState.validationData?.data?.validateForm?.valid || false,\r\n });\r\n\r\n if (autoSubmit && formState.validationData?.data?.validateForm?.valid) {\r\n submit({\r\n formSubmissionInput: { key: formKey, formData },\r\n });\r\n }\r\n }\r\n }, [formState.validationData?.data?.validateForm?.valid]);\r\n\r\n /**\r\n * Schema, network, and integration errors after submission to GraphQL\r\n */\r\n function getSubmissionErrors(): Array<SubmissionError> {\r\n if (!formState.submitData) return [];\r\n\r\n const submissionResults = formState.submitData.data?.submitForm.results;\r\n\r\n return (\r\n submissionResults?.map((error) => {\r\n // salesforce errors\r\n const messages = error.result?.results\r\n ?.flatMap((res) => !res.success && res.message)\r\n .filter((message) => message);\r\n\r\n // fatal errors\r\n const errors = error.result?.results\r\n ?.flatMap(\r\n (res) =>\r\n !res.success && {\r\n error: res.error,\r\n errorType: res.errorType,\r\n errorCode: res.errorCode,\r\n }\r\n )\r\n .filter(({ error }) => error);\r\n\r\n return {\r\n integration: error.formHandler?.integration?.name,\r\n formHandler: error.formHandler?.name,\r\n messages,\r\n errors,\r\n };\r\n }) || []\r\n );\r\n }\r\n\r\n /**\r\n * Schema validation based on return data from validateForm results\r\n */\r\n function getValidationErrors(): ValidationErrors {\r\n const validationErrors =\r\n validationData?.data?.validateForm?.results[0]?.result?.errors;\r\n\r\n /**\r\n * Provide a JSON path and receive any errors at that path\r\n */\r\n function getErrorAtPath(path: string) {\r\n return validationErrors?.filter((result) => {\r\n const instanceLocation = result.instanceLocation.substring(1);\r\n return instanceLocation === path;\r\n });\r\n }\r\n\r\n /**\r\n * Provide a JSON path and receive any errors at that path,\r\n * and any errors for nested paths\r\n */\r\n function getSubErrorsAtPath(path: string) {\r\n return validationErrors?.filter((result: ValidationError) => {\r\n const instanceLocation = result.instanceLocation.substring(1);\r\n return instanceLocation.startsWith(`${path}`);\r\n });\r\n }\r\n\r\n return {\r\n getErrorAtPath,\r\n getSubErrorsAtPath,\r\n hasSubErrors: (path) => getSubErrorsAtPath(path)?.length > 0,\r\n };\r\n }\r\n\r\n async function validateForm(formData) {\r\n await validate({\r\n formValidationInput: {\r\n key: formKey,\r\n formData,\r\n },\r\n });\r\n }\r\n\r\n async function submitForm(formData) {\r\n await submit({\r\n formSubmissionInput: {\r\n key: formKey,\r\n formData,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Submit function for regular <form> submissions\r\n */\r\n async function handleSubmit(e: any) {\r\n e.preventDefault();\r\n\r\n setFormState({ validating: true });\r\n const form = e.target;\r\n debug(\"submit form\", form);\r\n const data = new FormData(form);\r\n\r\n let formData = {};\r\n\r\n //@ts-ignore\r\n for (var pair of data.entries()) {\r\n jsonpointer.set(formData, pair[0], pair[1]);\r\n }\r\n\r\n setFormState({ formData });\r\n\r\n await validateForm(formData);\r\n }\r\n\r\n return {\r\n states: {\r\n enabled,\r\n disabledMessage,\r\n loadingForm,\r\n validating,\r\n valid,\r\n error,\r\n validationData: formState.validationData,\r\n submitData: formState.submitData,\r\n },\r\n data: {\r\n formKey,\r\n schema: data?.form?.schema,\r\n },\r\n callbacks: {\r\n /** Retrieve schema and initial data if provided from backend */\r\n getForm,\r\n /** Validate and submit <form> element data */\r\n handleSubmit,\r\n /** Validates form data and submits form if autoSubmit flag is true */\r\n validateForm,\r\n /** Submits form data */\r\n submitForm,\r\n /** Set form state for custom validation errors and multi-page forms */\r\n setFormState,\r\n getValidationErrors,\r\n getSubmissionErrors,\r\n },\r\n };\r\n}\r\n\r\ninterface ValidationErrors {\r\n getErrorAtPath(path: string): ValidationError[];\r\n getSubErrorsAtPath(path: string): ValidationError[];\r\n // TODO: implement ajv-i18n for translatable errors\r\n // getHumanizedErrorAtPath(path: string): string;\r\n hasSubErrors(path: string): boolean;\r\n}\r\n\r\ntype ValidationError = {\r\n error: string;\r\n keywordLocation: string;\r\n instanceLocation: string;\r\n};\r\n\r\ntype SubmissionError = {\r\n formHandler: string;\r\n integration: string;\r\n messages: string[];\r\n};\r\n\r\nexport type UseFormViewProps = ReturnType<typeof useForm>;\r\n","import { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { ContextProvider } from \"dom-context\";\r\nimport { gql } from \"graphql-request\";\r\nimport { useQuery, useUserIdentity } from \"..\";\r\nimport { useHost } from \"../hooks/useHost\";\r\nimport { WidgetIdent } from \"./environment\";\r\n\r\nconst CONTEXT_NAME = \"sq:locale\";\r\n\r\ndeclare global {\r\n interface Window {\r\n widgetIdent: WidgetIdent;\r\n squatchLocale: ContextProvider<string>;\r\n }\r\n}\r\n\r\nconst GET_LOCALE = gql`\r\n query {\r\n viewer {\r\n ... on User {\r\n locale\r\n }\r\n }\r\n }\r\n`;\r\n\r\nfunction _lazilyStartGlobally() {\r\n const globalProvider = window.squatchLocale;\r\n const user = useUserIdentity();\r\n\r\n const { data } = useQuery(GET_LOCALE, {}, !user);\r\n const locale = data?.viewer?.locale;\r\n\r\n if (!globalProvider) {\r\n // Lazily creates a global provider\r\n window.squatchLocale = new ContextProvider<string>({\r\n element: document.documentElement,\r\n initialState: locale ||\r\n window.widgetIdent?.locale || undefined,\r\n contextName: CONTEXT_NAME,\r\n }).start();\r\n } else if (locale && locale !== globalProvider.context) {\r\n globalProvider.context = locale;\r\n }\r\n}\r\n\r\nexport function useLocale(): string | undefined {\r\n _lazilyStartGlobally();\r\n const host = useHost();\r\n return useDomContext<string>(host, CONTEXT_NAME);\r\n}\r\n\r\n// not sure if this is even needed\r\n/**\r\n * Overide the globally defined Locale context\r\n *\r\n * @param locale the new locale used by the user\r\n */\r\nexport function setLocale(locale: string) {\r\n const globalProvider = window.squatchLocale;\r\n globalProvider.context = locale;\r\n}\r\n","/**\r\n * Environment provided by components hosted in a web component (`sqh-widget`)\r\n */\r\n\r\n declare global {\r\n interface Window {\r\n SquatchPortal?: PortalEnv;\r\n }\r\n}\r\n\r\n/**\r\n * Portal env doesn't include User Id\r\n */\r\nexport type PortalEnv = Pick<\r\n WidgetIdent,\r\n \"tenantAlias\" | \"appDomain\" | \"programId\"\r\n>;\r\n\r\n/**\r\n * Program ID context helpers\r\n */\r\nexport { useProgramId, setProgramId } from \"./ProgramContext\";\r\n\r\n/**\r\n * Locale context helpers\r\n */\r\nexport { useLocale, setLocale } from \"./LocaleContext\";\r\n\r\n/**\r\n * Provided by the SaaSquatch GraphQL backend when a widget is rendered.\r\n *\r\n * Source: https://github.com/saasquatch/saasquatch/blob/805e51284f818f8656b6458bcee6181f378819d3/packages/saasquatch-core/app/saasquatch/controllers/api/widget/WidgetApi.java\r\n *\r\n */\r\nexport interface WidgetIdent {\r\n tenantAlias: string;\r\n appDomain: string;\r\n token: string;\r\n userId: string;\r\n accountId: string;\r\n locale?: string;\r\n engagementMedium?: \"POPUP\" | \"EMBED\";\r\n programId?: string;\r\n env?: string;\r\n}\r\n\r\n/**\r\n * An interface for interacting with the SaaSquatch Admin Portal.\r\n *\r\n * Used for rendering widgets in a preview/demo mode.\r\n */\r\nexport interface SquatchAdmin {\r\n /**\r\n * Provides a way of providing user feedback when a widget is rendered in the SaaSquatch admin portal\r\n *\r\n * @param text\r\n */\r\n showMessage(text: string): void;\r\n}\r\n\r\n/**\r\n * Type for the Javascript environment added by https://github.com/saasquatch/squatch-android\r\n *\r\n * Should exist as `window.SquatchAndroid`\r\n */\r\nexport interface SquatchAndroid {\r\n /**\r\n *\r\n * @param shareLink\r\n * @param messageLink fallback URL to redirect to if the app is not installed\r\n */\r\n shareOnFacebook(shareLink: string, messageLink: string): void;\r\n\r\n /**\r\n * Shows a native Android toast\r\n *\r\n * @param text\r\n */\r\n showToast(text: string): void;\r\n}\r\n\r\n/**\r\n * An interface provided by Squatch.js V2 for widgets.\r\n *\r\n * See: https://github.com/saasquatch/squatch-js/blob/8f2b218c9d55567e0cc12d27d635a5fb545e6842/src/widgets/Widget.ts#L47\r\n *\r\n */\r\nexport interface SquatchJS2 {\r\n /**\r\n * Opens the current popup widget (if loaded as a popup)\r\n */\r\n open?: () => void;\r\n\r\n /**\r\n * Closes the current popup widget (if loaded as a popup)\r\n */\r\n close?: () => void;\r\n\r\n /**\r\n * DEPRECATED used to update user details from inside the widget.\r\n *\r\n * Should no longer be used. Replace with natively using the GraphQL API and re-rendering locally. Will be removed in a future version of Squatch.js\r\n *\r\n * @deprecated\r\n */\r\n reload(\r\n userDetails: { email: string; firstName: string; lastName: string },\r\n jwt: string\r\n ): void;\r\n}\r\n\r\nexport type Environment = EnvironmentSDK[\"type\"];\r\n\r\nexport type EnvironmentSDK =\r\n | {\r\n type: \"SquatchJS2\";\r\n api: SquatchJS2;\r\n widgetIdent: WidgetIdent;\r\n }\r\n | {\r\n type: \"SquatchAndroid\";\r\n android: SquatchAndroid;\r\n widgetIdent: WidgetIdent;\r\n }\r\n | {\r\n type: \"SquatchPortal\";\r\n env: PortalEnv;\r\n }\r\n | {\r\n type: \"SquatchAdmin\";\r\n adminSDK: SquatchAdmin;\r\n }\r\n | {\r\n type: \"None\";\r\n };\r\n\r\n/**\r\n * Get the type of environment that this widget is being rendered in\r\n *\r\n * Should never return null.\r\n */\r\nexport function getEnvironment(): Environment {\r\n return getEnvironmentSDK().type;\r\n}\r\n\r\n/**\r\n * Get the SDK for interacting with the host environment\r\n */\r\nexport function getEnvironmentSDK(): EnvironmentSDK {\r\n //@ts-ignore\r\n if (window[\"SquatchAndroid\"]) {\r\n return {\r\n type: \"SquatchAndroid\",\r\n //@ts-ignore\r\n android: window[\"SquatchAndroid\"] as SquatchAndroid,\r\n //@ts-ignore\r\n widgetIdent: window[\"widgetIdent\"],\r\n };\r\n }\r\n\r\n //@ts-ignore\r\n if (window[\"SquatchPortal\"]) {\r\n return {\r\n type: \"SquatchPortal\",\r\n //@ts-ignore\r\n env: window[\"SquatchPortal\"],\r\n };\r\n }\r\n\r\n //@ts-ignore\r\n if (window[\"SquatchAdmin\"]) {\r\n return {\r\n type: \"SquatchAdmin\",\r\n //@ts-ignore\r\n adminSDK: window[\"SquatchAdmin\"] as SquatchAdmin,\r\n };\r\n }\r\n\r\n // Vanilla components mutates `widgetIdent` for portal, causing boilerplate to render as SquatchJS2\r\n if (window[\"widgetIdent\"] && window[\"widgetIdent\"]?.env !== \"demo\") {\r\n return {\r\n type: \"SquatchJS2\",\r\n //@ts-ignore\r\n api: window.frameElement?.[\"squatchJsApi\"],\r\n //@ts-ignore\r\n widgetIdent: window[\"widgetIdent\"],\r\n };\r\n }\r\n\r\n return {\r\n type: \"None\",\r\n };\r\n}\r\n\r\nexport function isDemo() {\r\n const sdk = getEnvironmentSDK();\r\n return sdk.type === \"None\" || sdk.type === \"SquatchAdmin\";\r\n}\r\n\r\n// Fake tenant alias in\r\nconst FAKE_TENANT = \"demo\";\r\n\r\nexport function useTenantAlias(): string {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchAndroid\":\r\n case \"SquatchJS2\":\r\n return sdk.widgetIdent.tenantAlias;\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n return FAKE_TENANT;\r\n case \"SquatchPortal\":\r\n return sdk.env.tenantAlias;\r\n }\r\n}\r\n\r\nconst DEFAULT_DOMAIN = \"https://app.referralsaasquatch.com\";\r\nexport function useAppDomain(): string {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchAndroid\":\r\n case \"SquatchJS2\":\r\n return sdk.widgetIdent.appDomain;\r\n case \"SquatchPortal\":\r\n return sdk.env?.appDomain || DEFAULT_DOMAIN;\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n return DEFAULT_DOMAIN;\r\n }\r\n}\r\n\r\nexport type UserId = {\r\n id: string;\r\n accountId: string;\r\n};\r\n\r\ntype EngagementMedium = \"EMBED\" | \"POPUP\";\r\nconst DEFAULT_MEDIUM = \"EMBED\";\r\n\r\nexport function useEngagementMedium(): EngagementMedium {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchJS2\":\r\n return sdk.widgetIdent.engagementMedium || DEFAULT_MEDIUM;\r\n case \"SquatchAndroid\":\r\n case \"SquatchPortal\":\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n return DEFAULT_MEDIUM;\r\n }\r\n}\r\n\r\n// export function useLocale(): string {\r\n// // TODO: Widgets might provide this and portals might override this\r\n// return getCleanLocale();\r\n// }\r\n\r\n// function getCleanLocale() {\r\n// const locale = navigator.language;\r\n// const splitLocale = locale?.split(\"-\");\r\n// if (!splitLocale || splitLocale.length === 1) return locale;\r\n// const language = splitLocale[0];\r\n// const country = splitLocale[1];\r\n// return `${language}_${country.toUpperCase()}`;\r\n// }\r\n","import { useQuery } from \"../graphql/useQuery\";\r\nimport { usePagination } from \"./usePagination\";\r\n\r\nexport type Envelope<T = unknown> = {\r\n data: T[];\r\n totalCount?: number;\r\n};\r\n\r\nexport type PageVars = {\r\n offset: number;\r\n limit: number;\r\n};\r\n\r\n/**\r\n * dataPath MUST use the question mark operator when accessing fields.\r\n * If it doesn't then it will violate a Rule of Hooks\r\n */\r\nexport function usePaginatedQuery<\r\n TData,\r\n TVars extends { [key: string]: any } = {}\r\n>(\r\n query: any,\r\n dataPath: (data: any) => Envelope<TData>,\r\n pageVars: PageVars,\r\n extraVars: TVars = {} as TVars,\r\n skip: boolean = false,\r\n) {\r\n const {\r\n limit,\r\n offset,\r\n setLimit,\r\n setCurrentPage,\r\n calculatePagination,\r\n } = usePagination(pageVars);\r\n\r\n const variables = { limit, offset, ...extraVars };\r\n\r\n const { loading, errors, data, refetch } = useQuery(query, variables, skip);\r\n\r\n // this value needs to be accessed using the ? operator\r\n // react throws a hook error otherwise\r\n const envelope = dataPath(data);\r\n\r\n const { currentPage, pageCount, pageProgress } = calculatePagination(\r\n envelope?.data?.length || 0,\r\n envelope?.totalCount || 0\r\n );\r\n\r\n return {\r\n envelope,\r\n states: {\r\n errors,\r\n loading,\r\n limit,\r\n currentPage,\r\n pageCount,\r\n pageProgress,\r\n },\r\n callbacks: {\r\n refetch,\r\n setLimit,\r\n setCurrentPage,\r\n },\r\n };\r\n}\r\n"],"names":["ref","current","undefined","useHost","Error","_lazilyStartGlobally","window","squatchProgramId","ContextProvider","element","document","documentElement","initialState","widgetIdent","programId","contextName","start","useProgramId","host","useDomContext","__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","docCache","Map","fragmentSourceMap","printFragmentWarnings","experimentalFragmentVariables","normalize","string","replace","trim","parseDocument","source","ast","seenKeys","definitions","cacheKey","has","parsed","parse","kind","set","doc","workSet","Set","forEach","node","loc","keys","key","value","add","startToken","endToken","stripLoc","fragmentDefinition","fragmentName","name","sourceKey","body","substring","end","sourceKeySet","get","console","warn","push","gql","literals","args","_i","result","arg","gql_1","extras","resetCaches","clear","disableFragmentWarnings","enableExperimentalFragmentVariables","disableExperimentalFragmentVariables","m","h","d","val","options","type","str","String","match","exec","parseFloat","toLowerCase","isFinite","long","ms","msAbs","Math","abs","plural","fmtLong","round","fmtShort","JSON","stringify","isPlural","exports","useColors","namespace","module","humanize","diff","c","color","splice","index","lastC","namespaces","storage","setItem","removeItem","error","r","getItem","process","env","DEBUG","__nwjs","navigator","userAgent","style","WebkitAppearance","firebug","exception","table","parseInt","RegExp","$1","localStorage","localstorage","warned","debug","log","createDebug","prevTime","enableOverride","enabled","self","curr","Number","Date","prev","coerce","unshift","format","formatter","formatters","formatArgs","selectColor","extend","destroy","defineProperty","enumerable","configurable","v","init","delimiter","newDebug","toNamespace","regexp","toString","default","stack","message","disable","names","map","skips","join","enable","save","split","len","substr","test","require$$0","hash","charCodeAt","colors","load","j","debugFn","squatchUserIdentity","_getInitialValue","userIdentityFromJwt","jwt","userId","accountId","decoded","decode","exp","sub","isDecodedWidgetAPIJWT","matches","atob","user","id","isDecodedSquatchJWT","now","e","sdk","getEnvironmentSDK","token","searchParams","URLSearchParams","location","search","stored","potentialUserIdent","identity","setUserIdentity","globalProvider","equal","context","useToken","useUserIdentity","_useUserIdentity2","validIdentity","BatchedGraphQLClient","url","opts","_this","Subject","unmergable","subject","pipe","bufferTime","subscribe","queryAddedEvents","mergeQueryAddedEvents","mergedQuery","mergedVariables","mergedQueryAddedEvents","unmergedQueryAddedEvents","next","superRequest","mergedQueryResult","resolveMergedQueryResult","ClientError","response","data","errors","rejectAllQueryAddedEventsWithError","aliases","eventsToResolve","erroredEvent","path","find","includes","erroredId","getIdFromAliasedField","indexOfErroredEvent","findIndex","event","eventSpecificData","removeAliasesFromDataResult","removeAliasFromField","query","variables","errorResponse","newError","print","rejectQueryAddedEventWithError","resolveSingleQueryResult","request","Promise","resolve","reject","queryAddedEvent","generateQueryAddedEventId","_this2","GraphQLClient","nanoid","field","fieldArray","events","reduce","acc","parsedQuery","queryStr","containsDirective","renameFn","aliasFieldOrVariableFn","addN","combineQuery","queryResult","endsWith","err","memoizedGraphQLClient","memoize","appDomain","tenantAlias","headers","Authorization","reducer","state","action","loading","payload","useBaseQuery","localClient","clientFromContext","client","useAppDomain","useTenantAlias","attempts","useReducer","dispatch","useCallback","skipLoading","res","initialMutationState","useMutation","AuthenticateWithEmailAndPasswordMutation","RegisterWithEmailAndPasswordMutation","ChangePasswordMutation","ResetPasswordMutation","VerifyPasswordResetCodeMutation","useRefreshListener","skip","update","useEffect","listener","addEventListener","removeEventListener","useRef","signalRef","deepEqual","useMemo","useDeepCompareMemoize","initialLazyQueryState","NOTLOADED","Symbol","useLazyQuery","variablesRef","refetch","ManagedIdentityQuery","useManagedIdentityQuery","userIdentity","managedIdentity","VerifyEmailMutation","RequestPasswordResetEmailMutation","RequestVerificationEmailMutation","useDeepMemo","memoFn","useTick","x","deepFreeze","object","getOwnPropertyNames","freeze","initialQueryState","useQuery","forceUpdate","lazyHistory","squatchHistory","createBrowserHistory","createMemoryHistory","makeHistory","navigation","createHref","go","back","forward","usePagination","pageVars","useState","limit","offset","pageState","setPageState","calcOffset","page","calcPage","ceil","setLimit","newLimit","newPage","newOffset","setCurrentPage","calculatePagination","count","totalCount","currentPage","pageCount","calcPageCount","rangeOnPage","pageProgress","valueEquality","left","right","useDebouncedCallback","func","wait","leading","callback","debounce","flush","cancel","FIRE_EVENT","GET_FORM","SUBMIT_FORM","VALIDATE_FORM","GET_LOCALE","android","adminSDK","api","frameElement","_window$frameElement","useEngagementMedium","engagementMedium","locale","squatchLocale","implementation","authenticateManagedIdentityWithEmailAndPassword","email","emailVerified","sessionData","tick","listen","delay","eq","equalityFn","debounced","previousValue","props","validateForm","formData","validate","formValidationInput","formKey","formRef","autoSubmit","getForm","loadingForm","submit","submitData","validationData","validating","valid","validationMessage","disabledMessage","formState","setFormState","form","initialData","_data$form$initialDat","isEnabled","_data$form","_data$form$initialDat2","isEnabledErrorMessage","htmlForm","_data$form2","_data$form2$initialDa","setInitialData","inputs","elements","formContent","FormData","input","namedItem","checked","jsonpointer","initialize","_formState$validation4","_formState$validation5","_formState$validation6","formSubmissionInput","_formState$validation7","_formState$validation8","_formState$validation9","states","schema","_data$form3","callbacks","handleSubmit","preventDefault","target","entries","pair","submitForm","getValidationErrors","validationErrors","_validationData$data","_validationData$data$","results","_validationData$data$2","_validationData$data$3","getSubErrorsAtPath","filter","instanceLocation","startsWith","getErrorAtPath","hasSubErrors","getSubmissionErrors","submissionResults","_formState$submitData","messages","_error$result","_error$result$results","flatMap","success","_error$result2","_error$result2$result","errorType","errorCode","integration","formHandler","_error$formHandler","_error$formHandler$in","_error$formHandler2","viewer","_data$viewer","_window$widgetIdent","dataPath","extraVars","envelope","refresh","dispatchEvent","CustomEvent","bubbles","composed","cancelable","detail","registerManagedIdentityWithEmailAndPassword","resetManagedIdentityPassword","program","shareMedium","eventMeta","meta","refreshManagedIdentity","verifyManagedIdentityEmail","_data$verifyManagedId","_data$verifyManagedId2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/hooks/useHost.ts","../src/environment/ProgramContext.ts","../node_modules/tslib/tslib.es6.js","../node_modules/graphql-tag/lib/index.js","../node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../src/environment/UserIdentityContext.ts","../src/environment/BatchedGraphQLClient.ts","../src/hooks/graphql/useGraphQLClient.ts","../src/hooks/graphql/useBaseQuery.ts","../src/hooks/graphql/useMutation.ts","../src/hooks/managedIdentity/useAuthenticateWithEmailAndPasswordMutation.ts","../src/hooks/managedIdentity/useRegisterWithEmailAndPasswordMutation.ts","../src/hooks/managedIdentity/useChangePasswordMutation.ts","../src/hooks/managedIdentity/useResetPasswordMutation.ts","../src/hooks/managedIdentity/useVerifyPasswordResetCodeMutation.ts","../src/hooks/graphql/Refresh.ts","../src/hooks/useDeepEffect.ts","../src/hooks/graphql/useLazyQuery.ts","../src/hooks/managedIdentity/useManagedIdentityQuery.ts","../src/hooks/managedIdentity/useVerifyEmailMutation.ts","../src/hooks/managedIdentity/useRequestPasswordResetEmailMutation.ts","../src/hooks/managedIdentity/useRequestVerificationEmailMutation.ts","../src/hooks/useDeepMemo.ts","../src/hooks/useTick.ts","../src/hooks/graphql/useQuery.ts","../src/hooks/useNavigation.ts","../src/hooks/pagination/usePagination.ts","../src/hooks/useDebounce.ts","../src/hooks/useShareEvent.ts","../src/hooks/useForm.ts","../src/environment/LocaleContext.ts","../src/environment/environment.ts","../src/hooks/pagination/usePaginatedQuery.ts"],"sourcesContent":["const ref = { current: undefined };\r\n\r\nexport function useHost(): HTMLElement {\r\n if (ref.current === undefined) {\r\n throw new Error(\"no implementation of useHost provided\");\r\n }\r\n\r\n return ref.current();\r\n}\r\n\r\nexport function setImplementation(implementation: () => HTMLElement) {\r\n if (!implementation) {\r\n throw new Error(\"Must supply an implementation\");\r\n }\r\n\r\n if (typeof implementation !== \"function\") {\r\n throw new Error(\"implementation must be a function\");\r\n }\r\n\r\n ref.current = implementation;\r\n}","import { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { ContextProvider } from \"dom-context\";\r\nimport { useHost } from \"../hooks/useHost\";\r\nimport { WidgetIdent } from \"./environment\";\r\n\r\nconst CONTEXT_NAME = \"sq:program-id\";\r\n\r\ndeclare global {\r\n interface Window {\r\n widgetIdent: WidgetIdent;\r\n squatchProgramId: ContextProvider<string>;\r\n }\r\n}\r\n\r\nfunction _lazilyStartGlobally() {\r\n const globalProvider = window.squatchProgramId;\r\n if (!globalProvider) {\r\n // Lazily creates a global provider\r\n window.squatchProgramId = new ContextProvider<string>({\r\n element: document.documentElement,\r\n initialState: window.widgetIdent?.programId || undefined,\r\n contextName: CONTEXT_NAME,\r\n }).start();\r\n }\r\n}\r\n\r\nexport function useProgramId(): string | undefined {\r\n _lazilyStartGlobally();\r\n const host = useHost();\r\n return useDomContext<string>(host, CONTEXT_NAME);\r\n}\r\n\r\n/**\r\n * Overide the globally defined Program ID context\r\n *\r\n * @param programId the new programID used by the user, or undefined if logged out\r\n */\r\nexport function setProgramId(programId: string) {\r\n _lazilyStartGlobally();\r\n const globalProvider = window.squatchProgramId;\r\n globalProvider.context = programId;\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { __assign } from \"tslib\";\nimport { parse } from 'graphql';\nvar docCache = new Map();\nvar fragmentSourceMap = new Map();\nvar printFragmentWarnings = true;\nvar experimentalFragmentVariables = false;\nfunction normalize(string) {\n return string.replace(/[\\s,]+/g, ' ').trim();\n}\nfunction cacheKeyFromLoc(loc) {\n return normalize(loc.source.body.substring(loc.start, loc.end));\n}\nfunction processFragments(ast) {\n var seenKeys = new Set();\n var definitions = [];\n ast.definitions.forEach(function (fragmentDefinition) {\n if (fragmentDefinition.kind === 'FragmentDefinition') {\n var fragmentName = fragmentDefinition.name.value;\n var sourceKey = cacheKeyFromLoc(fragmentDefinition.loc);\n var sourceKeySet = fragmentSourceMap.get(fragmentName);\n if (sourceKeySet && !sourceKeySet.has(sourceKey)) {\n if (printFragmentWarnings) {\n console.warn(\"Warning: fragment with name \" + fragmentName + \" already exists.\\n\"\n + \"graphql-tag enforces all fragment names across your application to be unique; read more about\\n\"\n + \"this in the docs: http://dev.apollodata.com/core/fragments.html#unique-names\");\n }\n }\n else if (!sourceKeySet) {\n fragmentSourceMap.set(fragmentName, sourceKeySet = new Set);\n }\n sourceKeySet.add(sourceKey);\n if (!seenKeys.has(sourceKey)) {\n seenKeys.add(sourceKey);\n definitions.push(fragmentDefinition);\n }\n }\n else {\n definitions.push(fragmentDefinition);\n }\n });\n return __assign(__assign({}, ast), { definitions: definitions });\n}\nfunction stripLoc(doc) {\n var workSet = new Set(doc.definitions);\n workSet.forEach(function (node) {\n if (node.loc)\n delete node.loc;\n Object.keys(node).forEach(function (key) {\n var value = node[key];\n if (value && typeof value === 'object') {\n workSet.add(value);\n }\n });\n });\n var loc = doc.loc;\n if (loc) {\n delete loc.startToken;\n delete loc.endToken;\n }\n return doc;\n}\nfunction parseDocument(source) {\n var cacheKey = normalize(source);\n if (!docCache.has(cacheKey)) {\n var parsed = parse(source, {\n experimentalFragmentVariables: experimentalFragmentVariables\n });\n if (!parsed || parsed.kind !== 'Document') {\n throw new Error('Not a valid GraphQL document.');\n }\n docCache.set(cacheKey, stripLoc(processFragments(parsed)));\n }\n return docCache.get(cacheKey);\n}\nexport function gql(literals) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (typeof literals === 'string') {\n literals = [literals];\n }\n var result = literals[0];\n args.forEach(function (arg, i) {\n if (arg && arg.kind === 'Document') {\n result += arg.loc.source.body;\n }\n else {\n result += arg;\n }\n result += literals[i + 1];\n });\n return parseDocument(result);\n}\nexport function resetCaches() {\n docCache.clear();\n fragmentSourceMap.clear();\n}\nexport function disableFragmentWarnings() {\n printFragmentWarnings = false;\n}\nexport function enableExperimentalFragmentVariables() {\n experimentalFragmentVariables = true;\n}\nexport function disableExperimentalFragmentVariables() {\n experimentalFragmentVariables = false;\n}\nvar extras = {\n gql: gql,\n resetCaches: resetCaches,\n disableFragmentWarnings: disableFragmentWarnings,\n enableExperimentalFragmentVariables: enableExperimentalFragmentVariables,\n disableExperimentalFragmentVariables: disableExperimentalFragmentVariables\n};\n(function (gql_1) {\n gql_1.gql = extras.gql, gql_1.resetCaches = extras.resetCaches, gql_1.disableFragmentWarnings = extras.disableFragmentWarnings, gql_1.enableExperimentalFragmentVariables = extras.enableExperimentalFragmentVariables, gql_1.disableExperimentalFragmentVariables = extras.disableExperimentalFragmentVariables;\n})(gql || (gql = {}));\ngql[\"default\"] = gql;\nexport default gql;\n//# sourceMappingURL=index.js.map","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => enableOverride === null ? createDebug.enabled(namespace) : enableOverride,\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","import decode from \"jwt-decode\";\r\nimport { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { ContextProvider } from \"dom-context\";\r\nimport { getEnvironmentSDK } from \"./environment\";\r\nimport { useHost } from \"../hooks/useHost\";\r\nimport { equal } from \"@wry/equality\";\r\nimport debugFn from \"debug\";\r\nexport const debug = debugFn(\"sq:user-identity\");\r\n\r\nconst CONTEXT_NAME = \"sq:user-identity\";\r\nconst USER_LOCAL_STORAGE_KEY = CONTEXT_NAME;\r\n\r\nexport type UserIdentity = {\r\n id: string;\r\n accountId: string;\r\n jwt?: string;\r\n managedIdentity?: {\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData?: { [key: string]: any };\r\n };\r\n};\r\n\r\nexport interface DecodedSquatchJWT {\r\n exp?: number;\r\n user?: {\r\n accountId: string;\r\n id: string;\r\n };\r\n}\r\n\r\n// NOTE: Classic theme-engine JWT's do not have a typical payload,\r\n// they have a sub in the form base64(accountId):base64(userId)@tenantAlias:users\r\nexport interface DecodedWidgetAPIJWT {\r\n exp?: number;\r\n sub?: string;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n squatchUserIdentity: ContextProvider<UserIdentity>;\r\n }\r\n}\r\n\r\nfunction _lazilyStartGlobally() {\r\n const globalProvider = window.squatchUserIdentity;\r\n if (!globalProvider) {\r\n // Lazily creates a global provider\r\n window.squatchUserIdentity = new ContextProvider<UserIdentity>({\r\n element: document.documentElement,\r\n initialState: _getInitialValue(),\r\n contextName: CONTEXT_NAME,\r\n }).start();\r\n }\r\n}\r\n\r\nfunction isDecodedSquatchJWT(decoded: any): decoded is DecodedSquatchJWT {\r\n return decoded.user && decoded.user.id && decoded.user.accountId;\r\n}\r\n\r\nfunction isDecodedWidgetAPIJWT(decoded: any): decoded is DecodedWidgetAPIJWT {\r\n return decoded.sub && /.*:.*@.*:users/.test(decoded.sub);\r\n}\r\n\r\nfunction userIdentityFromJwt(jwt?: string): UserIdentity | undefined {\r\n if (!jwt) return undefined;\r\n\r\n try {\r\n const decoded = decode<DecodedSquatchJWT | DecodedWidgetAPIJWT>(jwt);\r\n const exp = decoded.exp;\r\n\r\n let userId: string, accountId: string;\r\n\r\n if (isDecodedWidgetAPIJWT(decoded)) {\r\n // Pull the accountId and userId from the subject and Base64-decode them\r\n // NOTE: This is to support classic theme engine widget token generation\r\n const matches = decoded.sub.match(/(.*):(.*)@(.*):users/);\r\n accountId = atob(matches[1]);\r\n userId = atob(matches[2]);\r\n } else if (isDecodedSquatchJWT(decoded)) {\r\n accountId = decoded.user.accountId;\r\n userId = decoded.user.id;\r\n }\r\n\r\n if (!userId || !accountId) {\r\n return undefined;\r\n }\r\n\r\n // Check if the JWT has expired\r\n if (exp && Date.now() >= exp * 1000) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n id: userId,\r\n accountId: accountId,\r\n jwt,\r\n };\r\n } catch (e) {\r\n // Invalid JWT\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction _getInitialValue(): UserIdentity | undefined {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchAndroid\":\r\n case \"SquatchJS2\":\r\n return {\r\n id: sdk.widgetIdent.userId,\r\n accountId: sdk.widgetIdent.accountId,\r\n jwt: sdk.widgetIdent.token,\r\n };\r\n case \"SquatchPortal\":\r\n // Portals can have the jwt provided as a URL parameter, so look for that first\r\n const searchParams = new URLSearchParams(document.location.search);\r\n if (searchParams.has(\"jwt\")) {\r\n return userIdentityFromJwt(searchParams.get(\"jwt\"));\r\n }\r\n\r\n // Look for user identity in local storage\r\n const stored = localStorage.getItem(USER_LOCAL_STORAGE_KEY);\r\n if (!stored) return undefined;\r\n try {\r\n const potentialUserIdent = JSON.parse(stored) as UserIdentity;\r\n const identity = userIdentityFromJwt(potentialUserIdent.jwt);\r\n if (identity) {\r\n return {\r\n ...potentialUserIdent, // for any stored managedIdentity fields\r\n ...identity,\r\n };\r\n }\r\n return undefined;\r\n } catch (e) {\r\n // Not valid JSON\r\n return undefined;\r\n }\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n // Not logged in for admin portal / none default case\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Overide the globally defined user context, and persists the user identity in local storage\r\n *\r\n * @param identity the new identity of the user, or undefined if logged out\r\n */\r\nexport function setUserIdentity(identity?: UserIdentity) {\r\n _lazilyStartGlobally();\r\n const globalProvider = window.squatchUserIdentity;\r\n\r\n if (!equal(globalProvider.context, identity)) {\r\n globalProvider.context = identity;\r\n }\r\n\r\n // Portals store identity in local storage\r\n if (identity && getEnvironmentSDK().type === \"SquatchPortal\") {\r\n localStorage.setItem(USER_LOCAL_STORAGE_KEY, JSON.stringify(identity));\r\n } else if (!identity) {\r\n debug(\"Deleting user from localStorage\");\r\n localStorage.removeItem(USER_LOCAL_STORAGE_KEY);\r\n }\r\n}\r\n\r\n/**\r\n * Gets the SessionData of the current user, or undefined if logged out\r\n */\r\nexport function useSessionData(): { [key: string]: any } | undefined {\r\n return useUserIdentity()?.managedIdentity?.sessionData;\r\n}\r\n\r\n/**\r\n * Gets the JWT of the current user, or undefined if logged out\r\n */\r\nexport function useToken(): string | undefined {\r\n return useUserIdentity()?.jwt;\r\n}\r\n\r\n/**\r\n * Get the IDs and JWT of the current user, or undefined if logged out\r\n */\r\nexport function useUserIdentity(): UserIdentity | undefined {\r\n _lazilyStartGlobally();\r\n const host = useHost();\r\n const identity = useDomContext(host, CONTEXT_NAME) as\r\n | UserIdentity\r\n | undefined;\r\n\r\n const validIdentity = userIdentityFromJwt(identity?.jwt);\r\n if (identity && !validIdentity) {\r\n // Likely that the JWT has expired\r\n setUserIdentity(undefined);\r\n return undefined;\r\n }\r\n return identity;\r\n}\r\n","import { Subject } from \"rxjs\";\r\nimport { bufferTime } from \"rxjs/operators\";\r\nimport { nanoid } from \"nanoid\";\r\nimport { ClientError, RequestDocument } from \"graphql-request/dist/types\";\r\nimport { GraphQLClient } from \"graphql-request\";\r\nimport { print, parse, DocumentNode } from \"graphql\";\r\n\r\nimport combineQuery, {\r\n CombinedQueryBuilder,\r\n NewCombinedQueryBuilder,\r\n} from \"graphql-combine-query\";\r\n\r\n/*************\r\n * constants *\r\n *************/\r\nconst MAX_REQUESTS = 10;\r\nconst REQUEST_INTERVAL = 200; //ms\r\n\r\nexport class BatchedGraphQLClient extends GraphQLClient {\r\n subject = new Subject();\r\n\r\n constructor(url: string, opts?: any) {\r\n super(url, opts);\r\n\r\n const unmergable = new Subject();\r\n const buffer = this.subject.pipe(\r\n bufferTime(REQUEST_INTERVAL, undefined, MAX_REQUESTS)\r\n );\r\n\r\n // look into replacing subscribe\r\n buffer.subscribe(async (queryAddedEvents: QueryAddedEvent[]) => {\r\n // no requests in the last REQUEST_INTERVAL ms\r\n if (!queryAddedEvents.length) {\r\n return;\r\n }\r\n // merge the requests\r\n const {\r\n mergedQuery,\r\n mergedVariables,\r\n mergedQueryAddedEvents,\r\n unmergedQueryAddedEvents,\r\n } = mergeQueryAddedEvents(queryAddedEvents);\r\n\r\n // push queries that failed to merge to a separate stream to be processed\r\n for (const unmergedQuery of unmergedQueryAddedEvents)\r\n unmergable.next(unmergedQuery);\r\n\r\n // If there are no merged queries, all were unmergeable and we can exit here\r\n if (!mergedQueryAddedEvents.length) {\r\n return;\r\n }\r\n\r\n try {\r\n // make the request\r\n const mergedQueryResult = await this.superRequest(\r\n mergedQuery,\r\n mergedVariables\r\n );\r\n //resolve the results\r\n resolveMergedQueryResult(mergedQueryResult, mergedQueryAddedEvents);\r\n } catch (e) {\r\n // So, there is possibly both data and errors here.\r\n if (e instanceof ClientError) {\r\n const { data, errors } = e.response;\r\n if (!data) {\r\n return rejectAllQueryAddedEventsWithError(\r\n mergedQueryAddedEvents,\r\n e\r\n );\r\n }\r\n const aliases = Object.keys(data);\r\n let eventsToResolve = [...mergedQueryAddedEvents];\r\n // reject all that errored:\r\n for (const error of errors) {\r\n let erroredEvent: QueryAddedEvent;\r\n // todo: this needs testing, is path going to work??\r\n error.path.find((key, index, path) => {\r\n if (aliases.includes(key)) {\r\n const erroredId = getIdFromAliasedField(key);\r\n const indexOfErroredEvent = eventsToResolve.findIndex(\r\n (event) => event.id === erroredId\r\n );\r\n if (indexOfErroredEvent === -1) return false;\r\n // remove from aliases\r\n aliases.splice(index, 1);\r\n // remove from events\r\n erroredEvent = eventsToResolve.splice(\r\n indexOfErroredEvent,\r\n 1\r\n )[0];\r\n // rebuild data\r\n const eventSpecificData = removeAliasesFromDataResult(\r\n e.response.data,\r\n erroredEvent\r\n );\r\n // fix path\r\n path[index] = removeAliasFromField(path[index], erroredId);\r\n const { query, variables } = erroredEvent;\r\n // rebuild error to be event specific\r\n const errorResponse = {\r\n ...e.response,\r\n errors: [error],\r\n data: eventSpecificData,\r\n path,\r\n };\r\n const newError = new ClientError(errorResponse, {\r\n query: typeof query !== \"string\" ? print(query) : query,\r\n variables,\r\n });\r\n rejectQueryAddedEventWithError(erroredEvent, newError);\r\n return true;\r\n }\r\n return false;\r\n });\r\n }\r\n // resolve the rest:\r\n resolveMergedQueryResult(data, eventsToResolve);\r\n } else rejectAllQueryAddedEventsWithError(mergedQueryAddedEvents, e);\r\n }\r\n });\r\n\r\n //process unmergable requests as they come in\r\n unmergable.subscribe(async (event: QueryAddedEvent) => {\r\n try {\r\n const { query, variables } = event;\r\n const result = await this.superRequest(query, variables);\r\n resolveSingleQueryResult(result, event);\r\n } catch (e) {\r\n rejectQueryAddedEventWithError(event, e);\r\n }\r\n });\r\n }\r\n\r\n superRequest<T>(query: RequestDocument, variables?: any) {\r\n return super.request<T>(query, variables);\r\n }\r\n\r\n request<T>(query, variables) {\r\n return new Promise<T>((resolve, reject) => {\r\n const queryAddedEvent: QueryAddedEvent = {\r\n query,\r\n variables,\r\n id: generateQueryAddedEventId(),\r\n resolve,\r\n reject,\r\n };\r\n this.subject.next(queryAddedEvent);\r\n });\r\n }\r\n}\r\n\r\n/*************\r\n * types *\r\n *************/\r\n\r\ninterface QueryAddedEvent {\r\n query: RequestDocument;\r\n variables: { [key: string]: unknown };\r\n id: string; // nanoid with '-'s removed\r\n resolve: (data: any) => void;\r\n reject: (err: any) => void;\r\n}\r\n\r\ninterface MergedQueryAddedEvents {\r\n mergedQuery?: RequestDocument;\r\n mergedVariables?: { [key: string]: unknown };\r\n mergedQueryAddedEvents: QueryAddedEvent[];\r\n unmergedQueryAddedEvents: QueryAddedEvent[];\r\n}\r\n\r\n/*************\r\n * utils *\r\n *************/\r\n// Remove dashes and underscores from alias\r\nconst generateQueryAddedEventId = () => nanoid().replace(/[-_]/g, \"\");\r\n\r\n// Numbers not allowed in graphQL alias, so ID must be added to the end\r\nconst aliasFieldOrVariableFn = (name, id) => `${name}_${id}`;\r\n\r\n// ID will always be at the end of the alias separated by a single \"_\"\r\nconst removeAliasFromField = (field: string, id: string) =>\r\n field.replace(`_${id}`, \"\");\r\n\r\nconst getIdFromAliasedField = (field: string): string => {\r\n const fieldArray = field.split(\"_\");\r\n return fieldArray[fieldArray.length - 1];\r\n};\r\n\r\nconst mergeQueryAddedEvents = (\r\n events: QueryAddedEvent[]\r\n): MergedQueryAddedEvents => {\r\n const mergedQueryAddedEvents = [];\r\n const unmergedQueryAddedEvents = [];\r\n const { document, variables } = events.reduce(\r\n (\r\n acc: NewCombinedQueryBuilder | CombinedQueryBuilder,\r\n curr: QueryAddedEvent\r\n ): NewCombinedQueryBuilder | CombinedQueryBuilder => {\r\n const { query, variables, id } = curr;\r\n try {\r\n const parsedQuery: DocumentNode =\r\n typeof query === \"string\" ? parse(query) : query;\r\n // if fragment exists, this request should be processed separately\r\n const fragmentDefinition = parsedQuery.definitions.find(\r\n (node) => node.kind === \"FragmentDefinition\"\r\n );\r\n // '@' is reserved for directives, and since both top level and nested directives are broken, we dont want any.\r\n const queryStr = typeof query === \"string\" ? query : print(query);\r\n const containsDirective = /@/.test(queryStr);\r\n\r\n if (fragmentDefinition || containsDirective) {\r\n unmergedQueryAddedEvents.push(curr);\r\n return acc;\r\n }\r\n\r\n const renameFn = (name) => aliasFieldOrVariableFn(name, id);\r\n // if this fails, event will be added to unmergedQueryAddedEvents\r\n acc = acc.addN(parsedQuery, [variables], renameFn, renameFn);\r\n mergedQueryAddedEvents.push(curr);\r\n return acc;\r\n } catch (e) {\r\n unmergedQueryAddedEvents.push(curr);\r\n return acc;\r\n }\r\n },\r\n combineQuery(\"BatchedQuery\")\r\n ) as CombinedQueryBuilder;\r\n\r\n const mergedQuery = document && print(document);\r\n const mergedVariables = variables;\r\n\r\n return {\r\n mergedQuery,\r\n mergedVariables,\r\n mergedQueryAddedEvents,\r\n unmergedQueryAddedEvents,\r\n };\r\n};\r\n\r\nconst removeAliasesFromDataResult = (\r\n queryResult: any,\r\n event: QueryAddedEvent\r\n) => {\r\n if (!queryResult) return queryResult;\r\n const aliases = Object.keys(queryResult);\r\n const { id } = event;\r\n return aliases.reduce((data, key) => {\r\n if (key.endsWith(id)) {\r\n data = {\r\n ...data,\r\n [removeAliasFromField(key, id)]: queryResult[key],\r\n };\r\n }\r\n return data;\r\n }, {});\r\n};\r\n\r\nconst resolveSingleQueryResult = (queryResult: any, event: QueryAddedEvent) => {\r\n const { resolve } = event;\r\n resolve(queryResult);\r\n};\r\n\r\nconst resolveMergedQueryResult = (\r\n mergedQueryResult: any,\r\n events: QueryAddedEvent[]\r\n): void => {\r\n for (const event of events) {\r\n //figure out what data we need\r\n const data = removeAliasesFromDataResult(mergedQueryResult, event);\r\n event.resolve(data);\r\n }\r\n};\r\n\r\nconst rejectQueryAddedEventWithError = (\r\n event: QueryAddedEvent,\r\n err: Error\r\n): void => {\r\n const { reject } = event;\r\n reject(err);\r\n};\r\n\r\nconst rejectAllQueryAddedEventsWithError = (\r\n events: QueryAddedEvent[],\r\n err: Error\r\n): void => {\r\n for (const event of events) {\r\n const { reject } = event;\r\n reject(err);\r\n }\r\n};\r\n","import memoize from \"fast-memoize\";\r\nimport { BatchedGraphQLClient } from \"../../environment/BatchedGraphQLClient\";\r\nimport { useAppDomain, useTenantAlias, useToken } from \"../../environment\";\r\nimport { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { useHost } from \"../useHost\";\r\nimport { GraphQLClient } from \"graphql-request\";\r\n\r\nexport const GRAPHQL_CONTEXT = \"sq:graphql-client\";\r\n\r\nfunction createGraphQlClient(\r\n appDomain: string,\r\n tenantAlias: string,\r\n token?: string\r\n): GraphQLClient {\r\n const uri = appDomain + \"/api/v1/\" + tenantAlias + \"/graphql\";\r\n const headers = {\r\n Authorization: `Bearer ${token || \"\"}`,\r\n };\r\n const newClient = new BatchedGraphQLClient(uri, {\r\n headers,\r\n });\r\n return newClient;\r\n}\r\n\r\nexport const memoizedGraphQLClient = memoize(createGraphQlClient);\r\n\r\nfunction useGraphQLClient(): GraphQLClient {\r\n const token = useToken();\r\n const appDomain = useAppDomain();\r\n const tenantAlias = useTenantAlias();\r\n\r\n // Memoization is shared. One client per domain, tenant and token (or null)\r\n const localClient: GraphQLClient = memoizedGraphQLClient(\r\n appDomain,\r\n tenantAlias,\r\n token\r\n );\r\n const host = useHost();\r\n const clientFromContext = useDomContext<GraphQLClient>(\r\n host,\r\n GRAPHQL_CONTEXT,\r\n // Won't poll / re-attempt\r\n { attempts: 0 }\r\n );\r\n return clientFromContext ?? localClient;\r\n}\r\n\r\nexport default useGraphQLClient;\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useReducer,\r\n useRef,\r\n} from \"@saasquatch/universal-hooks\";\r\nimport useGraphQLClient from \"./useGraphQLClient\";\r\nimport { RequestDocument } from \"graphql-request/dist/types\";\r\nimport { GraphQLClient } from \"graphql-request\";\r\n\r\nexport type GqlType = RequestDocument;\r\n\r\nexport interface BaseQueryData<T = unknown> {\r\n loading: boolean;\r\n data?: T;\r\n errors?: GraphQlRequestError<T>;\r\n}\r\n\r\nexport type QueryData<T> = BaseQueryData<T> & {\r\n refetch: (variables?: unknown) => unknown;\r\n};\r\n\r\n/**\r\n * Note: reverse-engineered from a returned error. May not capture all error types.\r\n */\r\n\r\nexport type GraphQlRequestError<T> = {\r\n response: {\r\n errors: [\r\n {\r\n message: string;\r\n locations: [{ line: number; column: number }];\r\n path: string[];\r\n extensions: {\r\n apiError: {\r\n message: string;\r\n statusCode: number;\r\n apiErrorCode: string;\r\n rsCode: string;\r\n };\r\n classification: string;\r\n };\r\n }\r\n ];\r\n data: Partial<T>;\r\n status: number;\r\n };\r\n request: {\r\n query: string;\r\n variables: { [key: string]: unknown };\r\n };\r\n message?: string;\r\n};\r\n\r\ntype Action<T> =\r\n | {\r\n type: \"loading\";\r\n }\r\n | {\r\n type: \"data\";\r\n payload?: T;\r\n }\r\n | {\r\n type: \"errors\";\r\n payload: GraphQlRequestError<T>;\r\n };\r\n\r\nfunction reducer<T>(\r\n // @ts-ignore = unused\r\n state: BaseQueryData<T>,\r\n action: Action<T>\r\n): BaseQueryData<T> {\r\n switch (action.type) {\r\n case \"loading\":\r\n return { data: undefined, errors: undefined, loading: true };\r\n case \"data\":\r\n return { data: action.payload, errors: undefined, loading: false };\r\n case \"errors\":\r\n return { data: undefined, errors: action.payload, loading: false };\r\n }\r\n}\r\n\r\nexport function useBaseQuery<T = any>(\r\n query: GqlType,\r\n initialState: BaseQueryData<T>\r\n): [\r\n BaseQueryData<T>,\r\n (variables: unknown, skipLoading?: boolean) => Promise<void>\r\n] {\r\n const client: GraphQLClient = useGraphQLClient();\r\n const [state, dispatch] = useReducer<BaseQueryData<T>, Action<T>>(\r\n reducer,\r\n initialState\r\n );\r\n const update = useCallback(\r\n async function (variables: unknown, skipLoading = false) {\r\n if (!client) {\r\n // Hook will return an error state when no client exists (used to be a loading state)\r\n dispatch({\r\n type: \"errors\",\r\n // @ts-expect-error -- Need to fix this\r\n payload: new Error(\"No GraphQL client found\"),\r\n });\r\n return;\r\n }\r\n try {\r\n // Skips showing a \"loading\" state before the data appears\r\n if (!skipLoading) dispatch({ type: \"loading\" });\r\n const res = await client.request<T>(query, variables);\r\n dispatch({ type: \"data\", payload: res });\r\n } catch (error) {\r\n dispatch({ type: \"errors\", payload: error });\r\n }\r\n },\r\n [client, query, dispatch]\r\n );\r\n\r\n return [state, update];\r\n}\r\n","import { BaseQueryData, GqlType, useBaseQuery } from \"./useBaseQuery\";\r\n\r\nconst initialMutationState: BaseQueryData = {\r\n loading: false,\r\n data: undefined,\r\n errors: undefined,\r\n} as const;\r\n\r\nexport function useMutation<T = any>(\r\n query: GqlType\r\n): [(e: unknown) => unknown, BaseQueryData<T>] {\r\n const [state, update] = useBaseQuery<T>(\r\n query,\r\n initialMutationState as BaseQueryData<T>\r\n );\r\n return [update, state];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport decode from \"jwt-decode\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n setUserIdentity,\r\n DecodedSquatchJWT,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst AuthenticateWithEmailAndPasswordMutation = gql`\r\n mutation AuthenticateWithEmailAndPassword(\r\n $email: String!\r\n $password: String!\r\n ) {\r\n authenticateManagedIdentityWithEmailAndPassword(\r\n authenticateManagedIdentityWithEmailAndPasswordInput: {\r\n email: $email\r\n password: $password\r\n }\r\n ) {\r\n token\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface AuthenticateWithEmailAndPasswordResult {\r\n authenticateManagedIdentityWithEmailAndPassword: {\r\n token: string;\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useAuthenticateWithEmailAndPasswordMutation(): [\r\n (e: { email: string; password: string }) => unknown,\r\n BaseQueryData<AuthenticateWithEmailAndPasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] =\r\n useMutation<AuthenticateWithEmailAndPasswordResult>(\r\n AuthenticateWithEmailAndPasswordMutation\r\n );\r\n\r\n useEffect(() => {\r\n if (data?.authenticateManagedIdentityWithEmailAndPassword) {\r\n const { authenticateManagedIdentityWithEmailAndPassword: res } = data;\r\n const jwt = res.token;\r\n const { user } = decode<DecodedSquatchJWT>(jwt);\r\n setUserIdentity({\r\n jwt,\r\n id: user.id,\r\n accountId: user.accountId,\r\n managedIdentity: {\r\n email: res.email,\r\n emailVerified: res.emailVerified,\r\n sessionData: res.sessionData,\r\n },\r\n });\r\n }\r\n }, [data?.authenticateManagedIdentityWithEmailAndPassword]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport decode from \"jwt-decode\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n setUserIdentity,\r\n DecodedSquatchJWT,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst RegisterWithEmailAndPasswordMutation = gql`\r\n mutation RegisterWithEmailAndPassword(\r\n $email: String!\r\n $password: String!\r\n $formData: RSJsonNode\r\n $redirectPath: String\r\n ) {\r\n registerManagedIdentityWithEmailAndPassword(\r\n registerManagedIdentityWithEmailAndPasswordInput: {\r\n email: $email\r\n password: $password\r\n formData: $formData\r\n redirectPath: $redirectPath\r\n }\r\n ) {\r\n token\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface RegisterWithEmailAndPasswordResult {\r\n registerManagedIdentityWithEmailAndPassword: {\r\n token: string;\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useRegisterWithEmailAndPasswordMutation(): [\r\n (e: {\r\n email: string;\r\n password: string;\r\n formData?: Record<string, any>;\r\n }) => unknown,\r\n BaseQueryData<RegisterWithEmailAndPasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] =\r\n useMutation<RegisterWithEmailAndPasswordResult>(\r\n RegisterWithEmailAndPasswordMutation\r\n );\r\n\r\n useEffect(() => {\r\n if (data?.registerManagedIdentityWithEmailAndPassword) {\r\n const { registerManagedIdentityWithEmailAndPassword: res } = data;\r\n const jwt = res.token;\r\n const { user } = decode<DecodedSquatchJWT>(jwt);\r\n setUserIdentity({\r\n jwt,\r\n id: user.id,\r\n accountId: user.accountId,\r\n managedIdentity: {\r\n email: res.email,\r\n emailVerified: res.emailVerified,\r\n sessionData: res.sessionData,\r\n },\r\n });\r\n }\r\n }, [data?.registerManagedIdentityWithEmailAndPassword]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst ChangePasswordMutation = gql`\r\n mutation ChangePassword($password: String!) {\r\n changeManagedIdentityPassword(\r\n changeManagedIdentityPasswordInput: { password: $password }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface ChangePasswordResult {\r\n changeManagedIdentityPassword: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useChangePasswordMutation(): [\r\n (e: { password: string }) => unknown,\r\n BaseQueryData<ChangePasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] =\r\n useMutation<ChangePasswordResult>(ChangePasswordMutation);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport decode from \"jwt-decode\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n setUserIdentity,\r\n DecodedSquatchJWT,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst ResetPasswordMutation = gql`\r\n mutation ResetPassword($oobCode: String!, $password: String!) {\r\n resetManagedIdentityPassword(\r\n resetManagedIdentityPasswordInput: {\r\n password: $password\r\n oobCode: $oobCode\r\n }\r\n ) {\r\n token\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface ResetPasswordResult {\r\n resetManagedIdentityPassword: {\r\n token: string;\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useResetPasswordMutation(): [\r\n (e: { oobCode: string; password: string }) => unknown,\r\n BaseQueryData<ResetPasswordResult>\r\n] {\r\n const [request, { loading, data, errors }] = useMutation<ResetPasswordResult>(\r\n ResetPasswordMutation\r\n );\r\n\r\n useEffect(() => {\r\n if (data?.resetManagedIdentityPassword) {\r\n const { resetManagedIdentityPassword: res } = data;\r\n const jwt = res.token;\r\n const { user } = decode<DecodedSquatchJWT>(jwt);\r\n setUserIdentity({\r\n jwt,\r\n id: user.id,\r\n accountId: user.accountId,\r\n managedIdentity: {\r\n email: res.email,\r\n emailVerified: res.emailVerified,\r\n sessionData: res.sessionData,\r\n },\r\n });\r\n }\r\n }, [data?.resetManagedIdentityPassword]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst VerifyPasswordResetCodeMutation = gql`\r\n mutation VerifyPasswordResetCode($oobCode: String!) {\r\n verifyManagedIdentityPasswordResetCode(\r\n verifyManagedIdentityPasswordResetCodeInput: { oobCode: $oobCode }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface VerifyPasswordResetCodeResult {\r\n verifyManagedIdentityPasswordResetCode: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useVerifyPasswordResetCodeMutation(): [\r\n (e: { oobCode: string }) => unknown,\r\n BaseQueryData<VerifyPasswordResetCodeResult>\r\n] {\r\n return useMutation<VerifyPasswordResetCodeResult>(\r\n VerifyPasswordResetCodeMutation\r\n );\r\n}\r\n","import { useCallback } from \"@saasquatch/universal-hooks\";\r\nimport { useDeepCompareEffect } from \"../useDeepEffect\";\r\nimport { useHost } from \"../useHost\";\r\n\r\nexport const REFRESH_EVENT_NAME = \"sq:refresh\";\r\n\r\nexport function useRefreshDispatcher() {\r\n const host = useHost();\r\n\r\n const refresh = useCallback(() => {\r\n host.dispatchEvent(\r\n new CustomEvent(REFRESH_EVENT_NAME, {\r\n bubbles: true,\r\n composed: true,\r\n cancelable: true,\r\n detail: {\r\n // Could add some \"scope\" for more granular refresh\r\n },\r\n })\r\n );\r\n }, [host]);\r\n\r\n return { refresh };\r\n}\r\n\r\nexport function useRefreshListener({\r\n skip = false,\r\n update,\r\n variables,\r\n}: {\r\n skip?: boolean;\r\n update: (variables: unknown, skipLoading?: boolean) => unknown;\r\n variables: unknown;\r\n}) {\r\n useDeepCompareEffect(() => {\r\n const listener = (e: CustomEvent) => {\r\n !skip && update(variables, true);\r\n };\r\n document.addEventListener(REFRESH_EVENT_NAME, listener);\r\n return () => document.removeEventListener(REFRESH_EVENT_NAME, listener);\r\n }, [variables, update, skip]);\r\n}\r\n","/*\r\n * Forked From: https://github.com/kentcdodds/use-deep-compare-effect/blob/main/src/index.ts\r\n *\r\n * The MIT License (MIT)\r\n * Copyright (c) 2020 Kent C. Dodds\r\n *\r\n */\r\n\r\nimport { useEffect, useRef, useMemo } from \"@saasquatch/universal-hooks\";\r\nimport { equal as deepEqual } from \"@wry/equality\";\r\n\r\ntype UseEffectParams = Parameters<typeof useEffect>;\r\ntype EffectCallback = UseEffectParams[0];\r\ntype DependencyList = UseEffectParams[1];\r\n// yes, I know it's void, but I like what this communicates about\r\n// the intent of these functions: It's just like useEffect\r\ntype UseEffectReturn = ReturnType<typeof useEffect>;\r\n\r\n\r\n/**\r\n * @param value the value to be memoized (usually a dependency list)\r\n * @returns a memoized version of the value as long as it remains deeply equal\r\n */\r\nexport function useDeepCompareMemoize<T>(value: T) {\r\n const ref = useRef<T>(value);\r\n const signalRef = useRef<number>(0);\r\n\r\n if (!deepEqual(value, ref.current)) {\r\n ref.current = value;\r\n signalRef.current += 1;\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return useMemo(() => ref.current, [signalRef.current]);\r\n}\r\n\r\nexport function useDeepCompareEffect(\r\n callback: EffectCallback,\r\n dependencies: DependencyList\r\n): UseEffectReturn {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return useEffect(callback, useDeepCompareMemoize(dependencies));\r\n}\r\n\r\nexport default useDeepCompareEffect;\r\n","import { useRef } from \"@saasquatch/universal-hooks\";\r\nimport { useRefreshListener } from \"./Refresh\";\r\nimport {\r\n BaseQueryData,\r\n GqlType,\r\n QueryData,\r\n useBaseQuery,\r\n} from \"./useBaseQuery\";\r\n\r\nconst initialLazyQueryState: BaseQueryData = {\r\n loading: false,\r\n data: undefined,\r\n errors: undefined,\r\n} as const;\r\n\r\nconst NOTLOADED = Symbol();\r\nexport function useLazyQuery<T = any>(\r\n query: GqlType\r\n): [(e: unknown) => unknown, QueryData<T>] {\r\n const [state, update] = useBaseQuery<T>(\r\n query,\r\n initialLazyQueryState as BaseQueryData<T>\r\n );\r\n\r\n const variablesRef = useRef<unknown>(NOTLOADED);\r\n // To preserve laziness, this query will not refresh if the query has not already been run at least once\r\n const skip = variablesRef.current === NOTLOADED;\r\n useRefreshListener({\r\n skip,\r\n update,\r\n variables: variablesRef.current,\r\n });\r\n\r\n return [\r\n update,\r\n {\r\n ...state,\r\n // can override props when refetching for new pagination, offset, etc\r\n refetch: (variables) => {\r\n variablesRef.current = variables;\r\n update(variables);\r\n },\r\n },\r\n ];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { useEffect, useCallback } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { QueryData } from \"../graphql/useBaseQuery\";\r\nimport {\r\n useUserIdentity,\r\n setUserIdentity,\r\n} from \"../../environment/UserIdentityContext\";\r\nimport { useLazyQuery } from \"../graphql/useLazyQuery\";\r\n\r\nconst ManagedIdentityQuery = gql`\r\n query ManagedIdentity {\r\n managedIdentity {\r\n email\r\n emailVerified\r\n sessionData\r\n }\r\n }\r\n`;\r\n\r\ninterface ManagedIdentityResult {\r\n managedIdentity: {\r\n email: string;\r\n emailVerified: boolean;\r\n sessionData: Record<string, any>;\r\n };\r\n}\r\n\r\nexport function useManagedIdentityQuery(): [\r\n () => unknown,\r\n QueryData<ManagedIdentityResult>\r\n] {\r\n const userIdentity = useUserIdentity();\r\n const [request, { loading, data, errors, refetch }] =\r\n useLazyQuery<ManagedIdentityResult>(ManagedIdentityQuery);\r\n\r\n useEffect(() => {\r\n if (data?.managedIdentity) {\r\n const { managedIdentity: res } = data;\r\n setUserIdentity({\r\n ...userIdentity,\r\n managedIdentity: res,\r\n });\r\n }\r\n }, [data?.managedIdentity]);\r\n\r\n const requestNoParams = useCallback(() => request({}), [request]);\r\n\r\n return [requestNoParams, { loading, data, errors, refetch }];\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { useEffect } from \"@saasquatch/universal-hooks\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\nimport { useManagedIdentityQuery } from \"./useManagedIdentityQuery\";\r\n\r\nconst VerifyEmailMutation = gql`\r\n mutation VerifyEmail($oobCode: String!) {\r\n verifyManagedIdentityEmail(\r\n verifyManagedIdentityEmailInput: { oobCode: $oobCode }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface VerifyEmailResult {\r\n verifyManagedIdentityEmail: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useVerifyEmailMutation(): [\r\n (e: { oobCode: string }) => unknown,\r\n BaseQueryData<VerifyEmailResult>\r\n] {\r\n const [refreshManagedIdentity] = useManagedIdentityQuery();\r\n const [request, { loading, data, errors }] =\r\n useMutation<VerifyEmailResult>(VerifyEmailMutation);\r\n\r\n useEffect(() => {\r\n if (data?.verifyManagedIdentityEmail?.success) {\r\n refreshManagedIdentity();\r\n }\r\n }, [data?.verifyManagedIdentityEmail?.success]);\r\n\r\n return [request, { loading, data, errors }];\r\n}\r\n","import gql from \"graphql-tag\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst RequestPasswordResetEmailMutation = gql`\r\n mutation RequestPasswordResetEmail(\r\n $email: String!\r\n $urlParams: RSJsonNode\r\n $redirectPath: String\r\n ) {\r\n requestManagedIdentityPasswordResetEmail(\r\n requestManagedIdentityPasswordResetEmailInput: {\r\n email: $email\r\n urlParams: $urlParams\r\n redirectPath: $redirectPath\r\n }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface RequestPasswordResetEmailResult {\r\n requestManagedIdentityPasswordResetEmail: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useRequestPasswordResetEmailMutation(): [\r\n (e: { email: string; urlParams?: Record<string, any> }) => unknown,\r\n BaseQueryData<RequestPasswordResetEmailResult>\r\n] {\r\n return useMutation<RequestPasswordResetEmailResult>(\r\n RequestPasswordResetEmailMutation\r\n );\r\n}\r\n","import gql from \"graphql-tag\";\r\n\r\nimport { BaseQueryData } from \"../graphql/useBaseQuery\";\r\nimport { useMutation } from \"../graphql/useMutation\";\r\n\r\nconst RequestVerificationEmailMutation = gql`\r\n mutation RequestVerificationEmail(\r\n $email: String!\r\n $urlParams: RSJsonNode\r\n $redirectPath: String\r\n ) {\r\n requestManagedIdentityVerificationEmail(\r\n requestManagedIdentityVerificationEmailInput: {\r\n email: $email\r\n urlParams: $urlParams\r\n redirectPath: $redirectPath\r\n }\r\n ) {\r\n success\r\n }\r\n }\r\n`;\r\n\r\ninterface RequestVerificationEmailResult {\r\n requestManagedIdentityVerificationEmail: {\r\n success: boolean;\r\n };\r\n}\r\n\r\nexport function useRequestVerificationEmailMutation(): [\r\n (e: { email: string; urlParams?: Record<string, any> }) => unknown,\r\n BaseQueryData<RequestVerificationEmailResult>\r\n] {\r\n return useMutation<RequestVerificationEmailResult>(\r\n RequestVerificationEmailMutation\r\n );\r\n}\r\n","import { equal } from \"@wry/equality\";\r\nimport { useRef } from \"@saasquatch/universal-hooks\";\r\n\r\nexport function useDeepMemo<TKey, TValue>(\r\n memoFn: () => TValue,\r\n key: TKey\r\n): TValue {\r\n //@ts-ignore\r\n const ref = useRef<{ key: TKey; value: TValue }>();\r\n\r\n if (!ref.current || !equal(key, ref.current.key)) {\r\n ref.current = { key, value: memoFn() };\r\n }\r\n\r\n return ref.current.value;\r\n}\r\n","import { useReducer } from \"@saasquatch/universal-hooks\";\r\n\r\nexport function useTick(): readonly [number, () => unknown] {\r\n //@ts-expect-error -- bad typing on callback\r\n return useReducer<number, number, number>((x) => x + 1, 0);\r\n}\r\n","import { useDeepMemo } from \"../useDeepMemo\";\r\nimport { useTick } from \"../useTick\";\r\nimport { useRefreshListener } from \"./Refresh\";\r\nimport {\r\n BaseQueryData,\r\n GqlType,\r\n QueryData,\r\n useBaseQuery,\r\n} from \"./useBaseQuery\";\r\n\r\n// from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\r\nfunction deepFreeze(object) {\r\n // Retrieve the property names defined on object\r\n const propNames = Object.getOwnPropertyNames(object);\r\n\r\n // Freeze properties before freezing self\r\n\r\n for (const name of propNames) {\r\n const value = object[name];\r\n\r\n if (value && typeof value === \"object\") {\r\n deepFreeze(value);\r\n }\r\n }\r\n\r\n return Object.freeze(object);\r\n}\r\n\r\nexport const initialQueryState: BaseQueryData = {\r\n loading: true,\r\n data: undefined,\r\n errors: undefined,\r\n} as const;\r\n\r\nexport function useQuery<T = any>(\r\n query: GqlType,\r\n variables: unknown,\r\n skip?: boolean\r\n): QueryData<T> {\r\n const [state, update] = useBaseQuery<T>(\r\n query,\r\n initialQueryState as BaseQueryData<T>\r\n );\r\n\r\n const [tick, forceUpdate] = useTick();\r\n\r\n useDeepMemo(() => {\r\n !skip && update(variables);\r\n }, [query, variables, update, tick, skip]);\r\n\r\n useRefreshListener({ skip, update, variables });\r\n\r\n return deepFreeze({\r\n ...state,\r\n // can override props when refetching for new pagination, offset, etc\r\n refetch: forceUpdate,\r\n });\r\n}\r\n","import { useEffect } from \"@saasquatch/universal-hooks\";\r\nimport {\r\n createBrowserHistory,\r\n createMemoryHistory,\r\n History,\r\n Location as HistLocation,\r\n To,\r\n} from \"history\";\r\nimport { getEnvironmentSDK } from \"../environment/environment\";\r\nimport { useTick } from \"./useTick\";\r\n\r\n/**\r\n * Instatiates a global `history` object that everything will connect to.\r\n *\r\n * This is not set in context, because it really should be global in a similar way to `window.location.push` for simplicity in setting up navigation\r\n */\r\nfunction makeHistory(): History {\r\n switch (getEnvironmentSDK().type) {\r\n case \"SquatchPortal\":\r\n return createBrowserHistory();\r\n default:\r\n return createMemoryHistory();\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n squatchHistory: History;\r\n }\r\n}\r\n\r\nfunction lazyHistory() {\r\n window.squatchHistory = window.squatchHistory || makeHistory();\r\n return window.squatchHistory;\r\n}\r\n\r\n/**\r\n * Provides a way of navigating pages. Can be called from views or hooks or any code on the page.\r\n *\r\n * Doesn't include any information about the current page since the current page can change.\r\n *\r\n * To listen to page changes use `useCurrentPage`\r\n */\r\nexport const navigation: Navigation = {\r\n createHref: (...args) => lazyHistory().createHref(...args),\r\n push: (...args) => lazyHistory().push(...args),\r\n replace: (...args) => lazyHistory().replace(...args),\r\n go: (...args) => lazyHistory().go(...args),\r\n back: () => lazyHistory().back(),\r\n forward: (...args) => lazyHistory().forward(...args),\r\n};\r\n\r\n/**\r\n * Returns the current location. Similar to `window.location` but works with SPA page changes and virtual pages in Squatch.js\r\n */\r\nexport function useCurrentPage(): HistLocation {\r\n const [, tick] = useTick();\r\n useEffect(() => {\r\n const cleanup = lazyHistory().listen(() => {\r\n // re-render\r\n tick();\r\n });\r\n return cleanup;\r\n }, []);\r\n\r\n return lazyHistory().location;\r\n}\r\n\r\n/**\r\n * An immutable subset of the `History` API.\r\n *\r\n * Removes the mutable properties (action, block, actions, listen)\r\n */\r\nexport type Navigation = Omit<\r\n Omit<Omit<Omit<History, \"location\">, \"block\">, \"action\">,\r\n \"listen\"\r\n>;\r\n","import { useState } from \"@saasquatch/universal-hooks\";\r\n\r\nexport function usePagination(pageVars: { limit: number; offset: number }) {\r\n const [pageState, setPageState] = useState({\r\n limit: pageVars.limit,\r\n offset: pageVars.offset,\r\n });\r\n const { offset, limit } = pageState;\r\n\r\n const calcOffset = (limit: number, page: number) => limit * page;\r\n const calcPage = (offset: number, limit: number) =>\r\n Math.ceil(offset / limit) || 0;\r\n const calcPageCount = (totalCount: number, limit: number) =>\r\n Math.ceil(totalCount / limit) || 0;\r\n\r\n const setLimit = (newLimit: number) => {\r\n const newPage = calcPage(offset, newLimit);\r\n const newOffset = calcOffset(newLimit, newPage);\r\n setPageState({\r\n ...pageState,\r\n limit: newLimit,\r\n offset: newOffset,\r\n });\r\n };\r\n\r\n // page numbering starts at 0\r\n const setCurrentPage = (newPage: number) => {\r\n let newOffset = calcOffset(newPage, limit);\r\n setPageState((pageState) => ({\r\n ...pageState,\r\n offset: newOffset,\r\n }));\r\n };\r\n\r\n // there are no safety guards here for invalid inputs\r\n function calculatePagination(count: number, totalCount: number) {\r\n const currentPage = calcPage(offset, limit);\r\n const pageCount = calcPageCount(totalCount, limit);\r\n\r\n const rangeOnPage: string =\r\n count === 0\r\n ? \"0\"\r\n : count > 1\r\n ? `${offset + 1}-${offset + count}`\r\n : `${offset + 1}`;\r\n const pageProgress: string = `${rangeOnPage} of ${totalCount}`;\r\n\r\n return { currentPage, pageCount, rangeOnPage, pageProgress };\r\n }\r\n\r\n return {\r\n limit,\r\n setLimit,\r\n offset,\r\n setCurrentPage,\r\n calculatePagination,\r\n };\r\n}\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"@saasquatch/universal-hooks\";\r\nimport debounce from \"debounce\";\r\n\r\nfunction valueEquality<T>(left: T, right: T): boolean {\r\n return left === right;\r\n}\r\n\r\n/**\r\n * Provides a debounced value\r\n *\r\n * Forked from React version here: https://github.com/xnimorz/use-debounce\r\n *\r\n * @param value\r\n * @param delay\r\n * @param options\r\n */\r\nexport function useDebounce<T>(\r\n value: T,\r\n delay: number,\r\n options?: {\r\n maxWait?: number;\r\n leading?: boolean;\r\n trailing?: boolean;\r\n equalityFn?: (left: T, right: T) => boolean;\r\n }\r\n) {\r\n const eq = (options && options.equalityFn) || valueEquality;\r\n\r\n const [state, dispatch] = useState(value);\r\n const debounced = useDebouncedCallback(\r\n useCallback((value: T) => dispatch(value), []),\r\n delay,\r\n options\r\n );\r\n const previousValue = useRef(value);\r\n\r\n useEffect(() => {\r\n // We need to use this condition otherwise we will run debounce timer for the first render (including maxWait option)\r\n if (!eq(previousValue.current, value)) {\r\n debounced.callback(value);\r\n previousValue.current = value;\r\n }\r\n }, [value, debounced, eq]);\r\n\r\n return [\r\n state,\r\n {\r\n cancel: debounced.cancel,\r\n flush: debounced.flush,\r\n },\r\n ] as const;\r\n}\r\n\r\nexport interface CallOptions {\r\n leading?: boolean;\r\n trailing?: boolean;\r\n}\r\n\r\nexport interface ControlFunctions {\r\n cancel: () => void;\r\n flush: () => void;\r\n}\r\n\r\n/**\r\n * Subsequent calls to the debounced function `debounced.callback` return the result of the last func invocation.\r\n * Note, that if there are no previous invocations it's mean you will get undefined. You should check it in your code properly.\r\n */\r\nexport interface DebouncedState<T extends (...args: any[]) => ReturnType<T>>\r\n extends ControlFunctions {\r\n callback: (...args: Parameters<T>) => ReturnType<T>;\r\n}\r\n\r\n/**\r\n * Creates a debounced function that delays invoking `func` until after `wait`\r\n * milliseconds have elapsed since the last time the debounced function was\r\n * invoked, or until the next browser frame is drawn. The debounced function\r\n * comes with a `cancel` method to cancel delayed `func` invocations and a\r\n * `flush` method to immediately invoke them. Provide `options` to indicate\r\n * whether `func` should be invoked on the leading and/or trailing edge of the\r\n * `wait` timeout. The `func` is invoked with the last arguments provided to the\r\n * debounced function. Subsequent calls to the debounced function return the\r\n * result of the last `func` invocation.\r\n\r\n *\r\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\r\n * for details over the differences between `debounce` and `throttle`.\r\n *\r\n * @category Function\r\n * @param {Function} func The function to debounce.\r\n * @param {number} [wait=0]\r\n * The number of milliseconds to delay\r\n * @param {Object} [options={}] The options object.\r\n * @param {boolean} [options.leading=false]\r\n * Specify invoking on the leading edge of the timeout.\r\n * @returns {Function} Returns the new debounced function.\r\n * @example\r\n */\r\nexport function useDebouncedCallback<\r\n T extends (...args: any[]) => ReturnType<T>\r\n>(\r\n func: T,\r\n wait: number = 0,\r\n options: CallOptions = { leading: false }\r\n): DebouncedState<T> {\r\n const callback = useMemo(() => debounce(func, wait, options.leading), [\r\n func,\r\n wait,\r\n options.leading,\r\n ]);\r\n\r\n const { flush, clear } = callback;\r\n\r\n return {\r\n flush,\r\n cancel: clear,\r\n callback,\r\n };\r\n}\r\n","import { gql } from \"graphql-request\";\r\nimport {\r\n useEngagementMedium,\r\n useProgramId,\r\n useUserIdentity,\r\n} from \"../environment\";\r\nimport { useMutation } from \"./graphql/useMutation\";\r\n\r\nconst FIRE_EVENT = gql`\r\n mutation ($eventMeta: UserAnalyticsEvent!) {\r\n createUserAnalyticsEvent(eventMeta: $eventMeta)\r\n }\r\n`;\r\n\r\nexport function useShareEvent() {\r\n const engagementMedium = useEngagementMedium();\r\n const userIdentity = useUserIdentity();\r\n const program = useProgramId();\r\n const [dispatch] = useMutation(FIRE_EVENT);\r\n\r\n if (!userIdentity) {\r\n // Not logged in. No-op callback for tracking sharing.\r\n return () => {};\r\n }\r\n\r\n return (shareMedium: string) => {\r\n const variables = {\r\n eventMeta: {\r\n id: userIdentity.id,\r\n accountId: userIdentity.accountId,\r\n programId: program,\r\n type: \"USER_REFERRAL_PROGRAM_ENGAGEMENT_EVENT\",\r\n meta: {\r\n engagementMedium: engagementMedium,\r\n shareMedium,\r\n },\r\n },\r\n };\r\n dispatch(variables);\r\n };\r\n}\r\n","import { useEffect, useReducer } from \"@saasquatch/universal-hooks\";\r\nimport { gql } from \"graphql-request\";\r\nimport debugFn from \"debug\";\r\nimport jsonpointer from \"jsonpointer\";\r\nimport { useMutation } from \"./graphql/useMutation\";\r\nimport { useLazyQuery } from \"./graphql/useLazyQuery\";\r\nimport { useDeepMemo } from \"./useDeepMemo\";\r\nexport const debug = debugFn(\"sq:useForm\");\r\n\r\nconst GET_FORM = gql`\r\n query ($key: String!) {\r\n form(key: $key) {\r\n schema\r\n initialData {\r\n initialData\r\n isEnabled\r\n isEnabledErrorMessage\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst SUBMIT_FORM = gql`\r\n mutation ($formSubmissionInput: FormSubmissionInput!) {\r\n submitForm(formSubmissionInput: $formSubmissionInput) {\r\n success\r\n results {\r\n ... on FormHandlerSubmissionResult {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n result\r\n }\r\n ... on FormHandlerError {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n errorType\r\n error\r\n errorCode\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst VALIDATE_FORM = gql`\r\n query ($formValidationInput: FormValidationInput!) {\r\n validateForm(formValidationInput: $formValidationInput) {\r\n valid\r\n results {\r\n ... on FormHandlerValidationResult {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n result\r\n }\r\n ... on FormHandlerError {\r\n formHandler {\r\n name\r\n endpointUrl\r\n integration {\r\n name\r\n }\r\n }\r\n errorType\r\n error\r\n errorCode\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\ntype UseFormProps = {\r\n formKey: string;\r\n formRef: HTMLFormElement;\r\n /** Flag to submit the form automatically once validated */\r\n autoSubmit?: boolean;\r\n setInitialData?: (htmlForm?: HTMLFormElement, initialData?: unknown) => void;\r\n};\r\n\r\ntype FormState = {\r\n validating: boolean;\r\n valid: boolean;\r\n enabled: boolean;\r\n disabledMessage: string;\r\n error: string;\r\n formData: object;\r\n validationData: any;\r\n submitData: any;\r\n};\r\n\r\nexport function useForm(props: UseFormProps) {\r\n const { formKey, formRef, autoSubmit = false } = props;\r\n\r\n const [getForm, { data, loading: loadingForm }] = useLazyQuery(GET_FORM);\r\n const [submit, submitData] = useMutation(SUBMIT_FORM);\r\n const [validate, validationData] = useLazyQuery(VALIDATE_FORM);\r\n\r\n const initialState = {\r\n enabled: false,\r\n validating: false,\r\n valid: true,\r\n validationMessage: \"\",\r\n error: \"\",\r\n disabledMessage: \"\",\r\n formData: {},\r\n validationData,\r\n submitData,\r\n };\r\n\r\n const [formState, setFormState] = useReducer<FormState, Partial<FormState>>(\r\n (state, next) => ({\r\n ...state,\r\n ...next,\r\n }),\r\n initialState\r\n );\r\n\r\n const { enabled, disabledMessage, validating, valid, error, formData } =\r\n formState;\r\n\r\n useDeepMemo(() => {\r\n debug(\"submitData useEffect\", submitData);\r\n setFormState({ submitData });\r\n }, [submitData]);\r\n\r\n useDeepMemo(() => {\r\n debug(\"validationData useEffect\", validationData);\r\n setFormState({ validationData });\r\n }, [validationData]);\r\n\r\n // load initial data into form\r\n useEffect(() => {\r\n async function setInitialData(htmlForm, initialData) {\r\n const inputs = htmlForm.elements;\r\n\r\n const formContent = new FormData(htmlForm);\r\n\r\n debug({ htmlForm, formContent });\r\n formContent?.forEach((value, key) => {\r\n debug({ value, key, inputs });\r\n const input = inputs.namedItem(key) as HTMLInputElement;\r\n\r\n try {\r\n if (input.type == \"checkbox\") {\r\n input.checked = jsonpointer.get(initialData, key);\r\n } else {\r\n input.value = jsonpointer.get(initialData, key) || \"\";\r\n }\r\n } catch (error) {\r\n debug(\"no initialData found for key\", key);\r\n }\r\n });\r\n }\r\n function initialize() {\r\n setFormState({\r\n enabled: data?.form.initialData?.isEnabled,\r\n disabledMessage: data?.form?.initialData?.isEnabledErrorMessage,\r\n });\r\n const htmlForm = formRef;\r\n\r\n if (!htmlForm) return;\r\n\r\n const initialData = data?.form?.initialData?.initialData;\r\n\r\n props.setInitialData !== undefined\r\n ? props.setInitialData(htmlForm, initialData)\r\n : setInitialData(htmlForm, initialData);\r\n }\r\n if (!loadingForm && data) initialize();\r\n }, [loadingForm]);\r\n\r\n // submit if form data is valid\r\n useEffect(() => {\r\n if (!!formState.validationData) {\r\n setFormState({\r\n validating: false,\r\n valid: formState.validationData?.data?.validateForm?.valid || false,\r\n });\r\n\r\n if (autoSubmit && formState.validationData?.data?.validateForm?.valid) {\r\n submit({\r\n formSubmissionInput: { key: formKey, formData },\r\n });\r\n }\r\n }\r\n }, [formState.validationData?.data?.validateForm?.valid]);\r\n\r\n /**\r\n * Schema, network, and integration errors after submission to GraphQL\r\n */\r\n function getSubmissionErrors(): Array<SubmissionError> {\r\n if (!formState.submitData) return [];\r\n\r\n const submissionResults = formState.submitData.data?.submitForm.results;\r\n\r\n return (\r\n submissionResults?.map((error) => {\r\n // salesforce errors\r\n const messages = error.result?.results\r\n ?.flatMap((res) => !res.success && res.message)\r\n .filter((message) => message);\r\n\r\n // fatal errors\r\n const errors = error.result?.results\r\n ?.flatMap(\r\n (res) =>\r\n !res.success && {\r\n error: res.error,\r\n errorType: res.errorType,\r\n errorCode: res.errorCode,\r\n }\r\n )\r\n .filter(({ error }) => error);\r\n\r\n return {\r\n integration: error.formHandler?.integration?.name,\r\n formHandler: error.formHandler?.name,\r\n messages,\r\n errors,\r\n };\r\n }) || []\r\n );\r\n }\r\n\r\n /**\r\n * Schema validation based on return data from validateForm results\r\n */\r\n function getValidationErrors(): ValidationErrors {\r\n const validationErrors =\r\n validationData?.data?.validateForm?.results[0]?.result?.errors;\r\n\r\n /**\r\n * Provide a JSON path and receive any errors at that path\r\n */\r\n function getErrorAtPath(path: string) {\r\n return validationErrors?.filter((result) => {\r\n const instanceLocation = result.instanceLocation.substring(1);\r\n return instanceLocation === path;\r\n });\r\n }\r\n\r\n /**\r\n * Provide a JSON path and receive any errors at that path,\r\n * and any errors for nested paths\r\n */\r\n function getSubErrorsAtPath(path: string) {\r\n return validationErrors?.filter((result: ValidationError) => {\r\n const instanceLocation = result.instanceLocation.substring(1);\r\n return instanceLocation.startsWith(`${path}`);\r\n });\r\n }\r\n\r\n return {\r\n getErrorAtPath,\r\n getSubErrorsAtPath,\r\n hasSubErrors: (path) => getSubErrorsAtPath(path)?.length > 0,\r\n };\r\n }\r\n\r\n async function validateForm(formData) {\r\n await validate({\r\n formValidationInput: {\r\n key: formKey,\r\n formData,\r\n },\r\n });\r\n }\r\n\r\n async function submitForm(formData) {\r\n await submit({\r\n formSubmissionInput: {\r\n key: formKey,\r\n formData,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Submit function for regular <form> submissions\r\n */\r\n async function handleSubmit(e: any) {\r\n e.preventDefault();\r\n\r\n setFormState({ validating: true });\r\n const form = e.target;\r\n debug(\"submit form\", form);\r\n const data = new FormData(form);\r\n\r\n let formData = {};\r\n\r\n //@ts-ignore\r\n for (var pair of data.entries()) {\r\n jsonpointer.set(formData, pair[0], pair[1]);\r\n }\r\n\r\n setFormState({ formData });\r\n\r\n await validateForm(formData);\r\n }\r\n\r\n return {\r\n states: {\r\n enabled,\r\n disabledMessage,\r\n loadingForm,\r\n validating,\r\n valid,\r\n error,\r\n validationData: formState.validationData,\r\n submitData: formState.submitData,\r\n },\r\n data: {\r\n formKey,\r\n schema: data?.form?.schema,\r\n },\r\n callbacks: {\r\n /** Retrieve schema and initial data if provided from backend */\r\n getForm,\r\n /** Validate and submit <form> element data */\r\n handleSubmit,\r\n /** Validates form data and submits form if autoSubmit flag is true */\r\n validateForm,\r\n /** Submits form data */\r\n submitForm,\r\n /** Set form state for custom validation errors and multi-page forms */\r\n setFormState,\r\n getValidationErrors,\r\n getSubmissionErrors,\r\n },\r\n };\r\n}\r\n\r\ninterface ValidationErrors {\r\n getErrorAtPath(path: string): ValidationError[];\r\n getSubErrorsAtPath(path: string): ValidationError[];\r\n // TODO: implement ajv-i18n for translatable errors\r\n // getHumanizedErrorAtPath(path: string): string;\r\n hasSubErrors(path: string): boolean;\r\n}\r\n\r\ntype ValidationError = {\r\n error: string;\r\n keywordLocation: string;\r\n instanceLocation: string;\r\n};\r\n\r\ntype SubmissionError = {\r\n formHandler: string;\r\n integration: string;\r\n messages: string[];\r\n};\r\n\r\nexport type UseFormViewProps = ReturnType<typeof useForm>;\r\n","import { useDomContext } from \"@saasquatch/dom-context-hooks\";\r\nimport { ContextProvider } from \"dom-context\";\r\nimport { gql } from \"graphql-request\";\r\nimport { useQuery, useUserIdentity } from \"..\";\r\nimport { useHost } from \"../hooks/useHost\";\r\nimport { WidgetIdent } from \"./environment\";\r\n\r\nconst CONTEXT_NAME = \"sq:locale\";\r\n\r\ndeclare global {\r\n interface Window {\r\n widgetIdent: WidgetIdent;\r\n squatchLocale: ContextProvider<string>;\r\n }\r\n}\r\n\r\nconst GET_LOCALE = gql`\r\n query {\r\n viewer {\r\n ... on User {\r\n locale\r\n }\r\n }\r\n }\r\n`;\r\n\r\nfunction _lazilyStartGlobally() {\r\n const globalProvider = window.squatchLocale;\r\n const user = useUserIdentity();\r\n\r\n const { data } = useQuery(GET_LOCALE, {}, !user);\r\n const locale = data?.viewer?.locale;\r\n\r\n if (!globalProvider) {\r\n // Lazily creates a global provider\r\n window.squatchLocale = new ContextProvider<string>({\r\n element: document.documentElement,\r\n initialState: locale || window.widgetIdent?.locale || undefined,\r\n contextName: CONTEXT_NAME,\r\n }).start();\r\n } else if (locale !== globalProvider.context) {\r\n console.log(\"setting locale\", locale);\r\n globalProvider.context = locale;\r\n }\r\n}\r\n\r\nexport function useLocale(): string | undefined {\r\n _lazilyStartGlobally();\r\n const host = useHost();\r\n return useDomContext<string>(host, CONTEXT_NAME);\r\n}\r\n","/**\r\n * Environment provided by components hosted in a web component (`sqh-widget`)\r\n */\r\n\r\n declare global {\r\n interface Window {\r\n SquatchPortal?: PortalEnv;\r\n }\r\n}\r\n\r\n/**\r\n * Portal env doesn't include User Id\r\n */\r\nexport type PortalEnv = Pick<\r\n WidgetIdent,\r\n \"tenantAlias\" | \"appDomain\" | \"programId\"\r\n>;\r\n\r\n/**\r\n * Program ID context helpers\r\n */\r\nexport { useProgramId, setProgramId } from \"./ProgramContext\";\r\n\r\n/**\r\n * Locale context helpers\r\n */\r\nexport { useLocale } from \"./LocaleContext\";\r\n\r\n/**\r\n * Provided by the SaaSquatch GraphQL backend when a widget is rendered.\r\n *\r\n * Source: https://github.com/saasquatch/saasquatch/blob/805e51284f818f8656b6458bcee6181f378819d3/packages/saasquatch-core/app/saasquatch/controllers/api/widget/WidgetApi.java\r\n *\r\n */\r\nexport interface WidgetIdent {\r\n tenantAlias: string;\r\n appDomain: string;\r\n token: string;\r\n userId: string;\r\n accountId: string;\r\n locale?: string;\r\n engagementMedium?: \"POPUP\" | \"EMBED\";\r\n programId?: string;\r\n env?: string;\r\n}\r\n\r\n/**\r\n * An interface for interacting with the SaaSquatch Admin Portal.\r\n *\r\n * Used for rendering widgets in a preview/demo mode.\r\n */\r\nexport interface SquatchAdmin {\r\n /**\r\n * Provides a way of providing user feedback when a widget is rendered in the SaaSquatch admin portal\r\n *\r\n * @param text\r\n */\r\n showMessage(text: string): void;\r\n}\r\n\r\n/**\r\n * Type for the Javascript environment added by https://github.com/saasquatch/squatch-android\r\n *\r\n * Should exist as `window.SquatchAndroid`\r\n */\r\nexport interface SquatchAndroid {\r\n /**\r\n *\r\n * @param shareLink\r\n * @param messageLink fallback URL to redirect to if the app is not installed\r\n */\r\n shareOnFacebook(shareLink: string, messageLink: string): void;\r\n\r\n /**\r\n * Shows a native Android toast\r\n *\r\n * @param text\r\n */\r\n showToast(text: string): void;\r\n}\r\n\r\n/**\r\n * An interface provided by Squatch.js V2 for widgets.\r\n *\r\n * See: https://github.com/saasquatch/squatch-js/blob/8f2b218c9d55567e0cc12d27d635a5fb545e6842/src/widgets/Widget.ts#L47\r\n *\r\n */\r\nexport interface SquatchJS2 {\r\n /**\r\n * Opens the current popup widget (if loaded as a popup)\r\n */\r\n open?: () => void;\r\n\r\n /**\r\n * Closes the current popup widget (if loaded as a popup)\r\n */\r\n close?: () => void;\r\n\r\n /**\r\n * DEPRECATED used to update user details from inside the widget.\r\n *\r\n * Should no longer be used. Replace with natively using the GraphQL API and re-rendering locally. Will be removed in a future version of Squatch.js\r\n *\r\n * @deprecated\r\n */\r\n reload(\r\n userDetails: { email: string; firstName: string; lastName: string },\r\n jwt: string\r\n ): void;\r\n}\r\n\r\nexport type Environment = EnvironmentSDK[\"type\"];\r\n\r\nexport type EnvironmentSDK =\r\n | {\r\n type: \"SquatchJS2\";\r\n api: SquatchJS2;\r\n widgetIdent: WidgetIdent;\r\n }\r\n | {\r\n type: \"SquatchAndroid\";\r\n android: SquatchAndroid;\r\n widgetIdent: WidgetIdent;\r\n }\r\n | {\r\n type: \"SquatchPortal\";\r\n env: PortalEnv;\r\n }\r\n | {\r\n type: \"SquatchAdmin\";\r\n adminSDK: SquatchAdmin;\r\n }\r\n | {\r\n type: \"None\";\r\n };\r\n\r\n/**\r\n * Get the type of environment that this widget is being rendered in\r\n *\r\n * Should never return null.\r\n */\r\nexport function getEnvironment(): Environment {\r\n return getEnvironmentSDK().type;\r\n}\r\n\r\n/**\r\n * Get the SDK for interacting with the host environment\r\n */\r\nexport function getEnvironmentSDK(): EnvironmentSDK {\r\n //@ts-ignore\r\n if (window[\"SquatchAndroid\"]) {\r\n return {\r\n type: \"SquatchAndroid\",\r\n //@ts-ignore\r\n android: window[\"SquatchAndroid\"] as SquatchAndroid,\r\n //@ts-ignore\r\n widgetIdent: window[\"widgetIdent\"],\r\n };\r\n }\r\n\r\n //@ts-ignore\r\n if (window[\"SquatchPortal\"]) {\r\n return {\r\n type: \"SquatchPortal\",\r\n //@ts-ignore\r\n env: window[\"SquatchPortal\"],\r\n };\r\n }\r\n\r\n //@ts-ignore\r\n if (window[\"SquatchAdmin\"]) {\r\n return {\r\n type: \"SquatchAdmin\",\r\n //@ts-ignore\r\n adminSDK: window[\"SquatchAdmin\"] as SquatchAdmin,\r\n };\r\n }\r\n\r\n // Vanilla components mutates `widgetIdent` for portal, causing boilerplate to render as SquatchJS2\r\n if (window[\"widgetIdent\"] && window[\"widgetIdent\"]?.env !== \"demo\") {\r\n return {\r\n type: \"SquatchJS2\",\r\n //@ts-ignore\r\n api: window.frameElement?.[\"squatchJsApi\"],\r\n //@ts-ignore\r\n widgetIdent: window[\"widgetIdent\"],\r\n };\r\n }\r\n\r\n return {\r\n type: \"None\",\r\n };\r\n}\r\n\r\nexport function isDemo() {\r\n const sdk = getEnvironmentSDK();\r\n return sdk.type === \"None\" || sdk.type === \"SquatchAdmin\";\r\n}\r\n\r\n// Fake tenant alias in\r\nconst FAKE_TENANT = \"demo\";\r\n\r\nexport function useTenantAlias(): string {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchAndroid\":\r\n case \"SquatchJS2\":\r\n return sdk.widgetIdent.tenantAlias;\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n return FAKE_TENANT;\r\n case \"SquatchPortal\":\r\n return sdk.env.tenantAlias;\r\n }\r\n}\r\n\r\nconst DEFAULT_DOMAIN = \"https://app.referralsaasquatch.com\";\r\nexport function useAppDomain(): string {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchAndroid\":\r\n case \"SquatchJS2\":\r\n return sdk.widgetIdent.appDomain;\r\n case \"SquatchPortal\":\r\n return sdk.env?.appDomain || DEFAULT_DOMAIN;\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n return DEFAULT_DOMAIN;\r\n }\r\n}\r\n\r\nexport type UserId = {\r\n id: string;\r\n accountId: string;\r\n};\r\n\r\ntype EngagementMedium = \"EMBED\" | \"POPUP\";\r\nconst DEFAULT_MEDIUM = \"EMBED\";\r\n\r\nexport function useEngagementMedium(): EngagementMedium {\r\n const sdk = getEnvironmentSDK();\r\n switch (sdk.type) {\r\n case \"SquatchJS2\":\r\n return sdk.widgetIdent.engagementMedium || DEFAULT_MEDIUM;\r\n case \"SquatchAndroid\":\r\n case \"SquatchPortal\":\r\n case \"SquatchAdmin\":\r\n case \"None\":\r\n return DEFAULT_MEDIUM;\r\n }\r\n}","import { useQuery } from \"../graphql/useQuery\";\r\nimport { usePagination } from \"./usePagination\";\r\n\r\nexport type Envelope<T = unknown> = {\r\n data: T[];\r\n totalCount?: number;\r\n};\r\n\r\nexport type PageVars = {\r\n offset: number;\r\n limit: number;\r\n};\r\n\r\n/**\r\n * dataPath MUST use the question mark operator when accessing fields.\r\n * If it doesn't then it will violate a Rule of Hooks\r\n */\r\nexport function usePaginatedQuery<\r\n TData,\r\n TVars extends { [key: string]: any } = {}\r\n>(\r\n query: any,\r\n dataPath: (data: any) => Envelope<TData>,\r\n pageVars: PageVars,\r\n extraVars: TVars = {} as TVars,\r\n skip: boolean = false,\r\n) {\r\n const {\r\n limit,\r\n offset,\r\n setLimit,\r\n setCurrentPage,\r\n calculatePagination,\r\n } = usePagination(pageVars);\r\n\r\n const variables = { limit, offset, ...extraVars };\r\n\r\n const { loading, errors, data, refetch } = useQuery(query, variables, skip);\r\n\r\n // this value needs to be accessed using the ? operator\r\n // react throws a hook error otherwise\r\n const envelope = dataPath(data);\r\n\r\n const { currentPage, pageCount, pageProgress } = calculatePagination(\r\n envelope?.data?.length || 0,\r\n envelope?.totalCount || 0\r\n );\r\n\r\n return {\r\n envelope,\r\n states: {\r\n errors,\r\n loading,\r\n limit,\r\n currentPage,\r\n pageCount,\r\n pageProgress,\r\n },\r\n callbacks: {\r\n refetch,\r\n setLimit,\r\n setCurrentPage,\r\n },\r\n };\r\n}\r\n"],"names":["ref","current","undefined","useHost","Error","_lazilyStartGlobally","window","squatchProgramId","ContextProvider","element","document","documentElement","initialState","widgetIdent","programId","contextName","start","useProgramId","host","useDomContext","__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","docCache","Map","fragmentSourceMap","printFragmentWarnings","experimentalFragmentVariables","normalize","string","replace","trim","parseDocument","source","ast","seenKeys","definitions","cacheKey","has","parsed","parse","kind","set","doc","workSet","Set","forEach","node","loc","keys","key","value","add","startToken","endToken","stripLoc","fragmentDefinition","fragmentName","name","sourceKey","body","substring","end","sourceKeySet","get","console","warn","push","gql","literals","args","_i","result","arg","gql_1","extras","resetCaches","clear","disableFragmentWarnings","enableExperimentalFragmentVariables","disableExperimentalFragmentVariables","m","h","d","val","options","type","str","String","match","exec","parseFloat","toLowerCase","isFinite","long","ms","msAbs","Math","abs","plural","fmtLong","round","fmtShort","JSON","stringify","isPlural","exports","useColors","namespace","module","humanize","diff","c","color","splice","index","lastC","namespaces","storage","setItem","removeItem","error","r","getItem","process","env","DEBUG","__nwjs","navigator","userAgent","style","WebkitAppearance","firebug","exception","table","parseInt","RegExp","$1","localStorage","localstorage","warned","debug","log","createDebug","prevTime","enableOverride","enabled","self","curr","Number","Date","prev","coerce","unshift","format","formatter","formatters","formatArgs","selectColor","extend","destroy","defineProperty","enumerable","configurable","v","init","delimiter","newDebug","toNamespace","regexp","toString","default","stack","message","disable","names","map","skips","join","enable","save","split","len","substr","test","require$$0","hash","charCodeAt","colors","load","j","debugFn","squatchUserIdentity","_getInitialValue","userIdentityFromJwt","jwt","userId","accountId","decoded","decode","exp","sub","isDecodedWidgetAPIJWT","matches","atob","user","id","isDecodedSquatchJWT","now","e","sdk","getEnvironmentSDK","token","searchParams","URLSearchParams","location","search","stored","potentialUserIdent","identity","setUserIdentity","globalProvider","equal","context","useToken","useUserIdentity","_useUserIdentity2","validIdentity","BatchedGraphQLClient","url","opts","_this","Subject","unmergable","subject","pipe","bufferTime","subscribe","queryAddedEvents","mergeQueryAddedEvents","mergedQuery","mergedVariables","mergedQueryAddedEvents","unmergedQueryAddedEvents","next","superRequest","mergedQueryResult","resolveMergedQueryResult","ClientError","response","data","errors","rejectAllQueryAddedEventsWithError","aliases","eventsToResolve","erroredEvent","path","find","includes","erroredId","getIdFromAliasedField","indexOfErroredEvent","findIndex","event","eventSpecificData","removeAliasesFromDataResult","removeAliasFromField","query","variables","errorResponse","newError","print","rejectQueryAddedEventWithError","resolveSingleQueryResult","request","Promise","resolve","reject","queryAddedEvent","generateQueryAddedEventId","_this2","GraphQLClient","nanoid","field","fieldArray","events","reduce","acc","parsedQuery","queryStr","containsDirective","renameFn","aliasFieldOrVariableFn","addN","combineQuery","queryResult","endsWith","err","memoizedGraphQLClient","memoize","appDomain","tenantAlias","headers","Authorization","reducer","state","action","loading","payload","useBaseQuery","localClient","clientFromContext","client","useAppDomain","useTenantAlias","attempts","useReducer","dispatch","useCallback","skipLoading","res","initialMutationState","useMutation","AuthenticateWithEmailAndPasswordMutation","RegisterWithEmailAndPasswordMutation","ChangePasswordMutation","ResetPasswordMutation","VerifyPasswordResetCodeMutation","useRefreshListener","skip","update","useEffect","listener","addEventListener","removeEventListener","useRef","signalRef","deepEqual","useMemo","useDeepCompareMemoize","initialLazyQueryState","NOTLOADED","Symbol","useLazyQuery","variablesRef","refetch","ManagedIdentityQuery","useManagedIdentityQuery","userIdentity","managedIdentity","VerifyEmailMutation","RequestPasswordResetEmailMutation","RequestVerificationEmailMutation","useDeepMemo","memoFn","useTick","x","deepFreeze","object","getOwnPropertyNames","freeze","initialQueryState","useQuery","forceUpdate","lazyHistory","squatchHistory","createBrowserHistory","createMemoryHistory","makeHistory","navigation","createHref","go","back","forward","usePagination","pageVars","useState","limit","offset","pageState","setPageState","calcOffset","page","calcPage","ceil","setLimit","newLimit","newPage","newOffset","setCurrentPage","calculatePagination","count","totalCount","currentPage","pageCount","calcPageCount","rangeOnPage","pageProgress","valueEquality","left","right","useDebouncedCallback","func","wait","leading","callback","debounce","flush","cancel","FIRE_EVENT","GET_FORM","SUBMIT_FORM","VALIDATE_FORM","GET_LOCALE","android","adminSDK","api","frameElement","_window$frameElement","useEngagementMedium","engagementMedium","implementation","authenticateManagedIdentityWithEmailAndPassword","email","emailVerified","sessionData","tick","listen","delay","eq","equalityFn","debounced","previousValue","props","validateForm","formData","validate","formValidationInput","formKey","formRef","autoSubmit","getForm","loadingForm","submit","submitData","validationData","validating","valid","validationMessage","disabledMessage","formState","setFormState","form","initialData","_data$form$initialDat","isEnabled","_data$form","_data$form$initialDat2","isEnabledErrorMessage","htmlForm","_data$form2","_data$form2$initialDa","setInitialData","inputs","elements","formContent","FormData","input","namedItem","checked","jsonpointer","initialize","_formState$validation4","_formState$validation5","_formState$validation6","formSubmissionInput","_formState$validation7","_formState$validation8","_formState$validation9","states","schema","_data$form3","callbacks","handleSubmit","preventDefault","target","entries","pair","submitForm","getValidationErrors","validationErrors","_validationData$data","_validationData$data$","results","_validationData$data$2","_validationData$data$3","getSubErrorsAtPath","filter","instanceLocation","startsWith","getErrorAtPath","hasSubErrors","getSubmissionErrors","submissionResults","_formState$submitData","messages","_error$result","_error$result$results","flatMap","success","_error$result2","_error$result2$result","errorType","errorCode","integration","formHandler","_error$formHandler","_error$formHandler$in","_error$formHandler2","locale","squatchLocale","viewer","_data$viewer","_window$widgetIdent","dataPath","extraVars","envelope","refresh","dispatchEvent","CustomEvent","bubbles","composed","cancelable","detail","registerManagedIdentityWithEmailAndPassword","resetManagedIdentityPassword","program","shareMedium","eventMeta","meta","refreshManagedIdentity","verifyManagedIdentityEmail","_data$verifyManagedId","_data$verifyManagedId2"],"mappings":"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"}
|