{
  "version": 3,
  "sources": ["../../src/modules/advertising/utm/hooks/useCaptureUtmLocation.ts", "../../src/modules/advertising/utm/lib/UtmStorageArchivist.ts", "../../src/modules/advertising/utm/hooks/useDefaultPageState.ts", "../../src/modules/advertising/utm/hooks/useDefaultUtmPageState.ts"],
  "sourcesContent": ["import { usePromise } from '@ariestools/sdk-react/promise'\nimport { type Utm, UtmSchema } from '@xyo-network/payload-plugins/advertising'\nimport { asSchema, type Payload } from '@xyo-network/sdk'\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router'\n\nimport { UtmStorageArchivist } from '../lib/index.ts'\nimport { useDefaultUtmPageState, UtmQueryParamStrings } from './useDefaultUtmPageState.ts'\n\n/** Captures UTM query params into session storage and optionally clears them from the URL. */\nexport const useCaptureUtmLocation = (removeAfterCapture = true) => {\n  const [{\n    utm_campaign, utm_content, utm_medium, utm_source, utm_term,\n  }] = useDefaultUtmPageState()\n  const [,setSearchParams] = useSearchParams()\n\n  const [sessionStorageArchivist, error] = usePromise(async () => {\n    return await UtmStorageArchivist()\n  }, [])\n\n  const utmPayload = useMemo(() => {\n    // Construct the base UTM payload\n    const utm: Payload<Utm> = { schema: asSchema(UtmSchema, true) }\n\n    // determine if there's a utm field that still has a value\n    // if there is none, it means that either the page loaded\n    // with none or they've already been captured\n    const utmParams = {\n      utm_campaign, utm_content, utm_medium, utm_source, utm_term,\n    }\n    const foundUpdatedUtmParams = Object.entries(utmParams).some(([key, value]) => {\n      return key.includes('utm_') && value\n    })\n\n    if (foundUpdatedUtmParams) {\n      // Conditionally add all the UTM parameters present\n      if (utm_campaign) utm.utm_campaign = utm_campaign\n      if (utm_content) utm.utm_content = utm_content\n      if (utm_medium) utm.utm_medium = utm_medium\n      if (utm_source) utm.utm_source = utm_source\n      if (utm_term) utm.utm_term = utm_term\n\n      return utm\n    } else {\n      return null\n    }\n  }, [utm_campaign, utm_content, utm_medium, utm_source, utm_term])\n\n  const [,insertError] = usePromise(async () => {\n    if (utmPayload && sessionStorageArchivist) {\n      // clear all previous utm payloads\n      await sessionStorageArchivist.clear()\n      // insert params into session storage\n      await sessionStorageArchivist.insert([utmPayload])\n\n      if (removeAfterCapture) {\n        // remove the utm params from the URL\n        setSearchParams(() => {\n          const newParams = new URLSearchParams()\n          for (const value of Object.values(UtmQueryParamStrings)) {\n            newParams.delete(value)\n          }\n          return newParams\n        })\n      }\n    }\n  }, [sessionStorageArchivist, utmPayload, removeAfterCapture])\n\n  return { utmPayload, error: error ?? insertError }\n}\n", "import { StorageArchivist, StorageArchivistConfigSchema } from '@xyo-network/archivist-storage'\nimport type { Utm, UtmSchema } from '@xyo-network/payload-plugins/advertising'\nimport { isUtm } from '@xyo-network/payload-plugins/advertising'\nimport type { Payload, Schema } from '@xyo-network/sdk'\n\nconst STORAGE_NAME_SPACE = 'utm' as const\n\nlet archivist: StorageArchivist | undefined\n\n/**\n * Find or create a single instance of the UtmStorageArchivist\n * @returns Archivist instance\n */\nexport const UtmStorageArchivist = async (): Promise<StorageArchivist> => {\n  if (archivist) {\n    return archivist\n  } else {\n    archivist = await StorageArchivist.create({\n      account: 'random',\n      config: {\n        schema: StorageArchivistConfigSchema, namespace: STORAGE_NAME_SPACE, type: 'session',\n      },\n    })\n    return archivist\n  }\n}\n\n/** Returns the most recent UTM payload from session storage, if any. */\nexport const LatestUtmPayload = async (): Promise<Payload<Utm, Schema<UtmSchema>> | undefined> => {\n  const archivist = await UtmStorageArchivist()\n  return (await archivist.next()).find(isUtm)\n}\n", "import { useMemo } from 'react'\nimport { useSearchParams } from 'react-router'\n\nimport type { PageStateKeys } from '../lib/index.ts'\n\n/** Parameters describing sources of default page state values. */\nexport interface DefaultPageStateParams<TQueryParams extends PageStateKeys = PageStateKeys> {\n  queryParams: TQueryParams\n}\n\n/** Return tuple of page state values and a patcher from {@link useDefaultPageState}. */\nexport type DefaultPageStateReturn<TPageStateKeys extends PageStateKeys = PageStateKeys> = [\n  Record<TPageStateKeys[number], string>,\n  (source: keyof DefaultPageStateParams, key: TPageStateKeys[number], value: string) => void,\n]\n\n/**\n * Hook to get default page state as key value pairs from various sources.  It provides a convenient abstraction over free form\n * page state like query params by narrowing the used params and centralizing their logic.\n *\n * Future work could include adding support for localStorage, sessionStorage, and precedence of sources.\n * @param defaultPageStateParams various sources of default page state (i.e. queryParams, localStorage, etc.)\n * @returns\n */\nexport const useDefaultPageState = <TQueryParams extends PageStateKeys = PageStateKeys>(\n  { queryParams }: DefaultPageStateParams<TQueryParams>,\n): DefaultPageStateReturn<TQueryParams> => {\n  const [searchParams, setSearchParams] = useSearchParams()\n\n  const patchDefaultPageState = (source: keyof DefaultPageStateParams, key: TQueryParams[number], value: string) => {\n    switch (source) {\n      case 'queryParams': {\n        setSearchParams((prevSearchParams) => {\n          const newSearchParams = new URLSearchParams(prevSearchParams)\n          newSearchParams.set(key, value)\n          return newSearchParams\n        })\n        break\n      }\n      default: {\n        throw new Error(`Invalid source for default page state: ${source}`)\n      }\n    }\n  }\n\n  const queryParamsState = useMemo(() => {\n    if (!queryParams) return {} as Record<TQueryParams[number], string>\n    const defaultState = {} as Record<TQueryParams[number], string>\n    for (const [key, value] of searchParams.entries()) {\n      if (queryParams.includes(key)) {\n        defaultState[key as TQueryParams[number]] = value\n      }\n    }\n    return defaultState\n  }, [searchParams, queryParams])\n\n  return [queryParamsState, patchDefaultPageState]\n}\n", "import { useDefaultPageState } from './useDefaultPageState.ts'\n\n/** Standard UTM query parameter name constants. */\nexport const UtmQueryParamStrings = {\n  utmCampaign: 'utm_campaign',\n  utmContent: 'utm_content',\n  utmMedium: 'utm_medium',\n  utmSource: 'utm_source',\n  utmTerm: 'utm_term',\n} as const\n\n/** Union of standard UTM query parameter name strings. */\nexport type UtmQueryParams = typeof UtmQueryParamStrings[keyof typeof UtmQueryParamStrings]\n\n/** Get the default page state for utm values from specific query params */\nexport const useDefaultUtmPageState = () => useDefaultPageState<UtmQueryParams[]>({ queryParams: Object.values(UtmQueryParamStrings) })\n"],
  "mappings": "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",
  "names": ["useMemo", "useSearchParams", "archivist", "useSearchParams", "useMemo"]
}
