{"version":3,"sources":["../../../../src/lib/api-keys/api-keys-state.ts"],"sourcesContent":["import * as React from \"react\";\nimport { canUseDOM } from \"../utils.js\";\nimport {\n  CreateOrganizationApiKeyResponse,\n  ListMetadata,\n} from \"../../api/endpoint.js\";\n\nexport function useApiKeysState(initialState: ApiKeysState) {\n  const [[state, effects], dispatch] = React.useReducer(reducer, [\n    initialState,\n    [],\n  ]);\n\n  React.useEffect(() => {\n    if (window !== window.top) {\n      // do not use query params if widget is rendered in an iframe\n      return;\n    }\n    const params = new URLSearchParams(window.location.search);\n    dispatch({ type: \"INIT\", params });\n  }, []);\n\n  React.useEffect(() => {\n    for (const effect of effects) {\n      effect();\n    }\n  }, [effects]);\n\n  return [state, dispatch] as const;\n}\n\nfunction reducer(\n  current: StateWithEffects<ApiKeysState>,\n  action: ApiKeysAction,\n): StateWithEffects<ApiKeysState> {\n  const effects: EffectFn[] = [];\n  const exec = (fn: () => void) => {\n    const effect = () => {\n      if (!effect.disposed) {\n        effect.disposed = true;\n        fn();\n      }\n    };\n    effect.disposed = false;\n    effects.push(effect);\n  };\n\n  const [currentState] = current;\n  switch (action.type) {\n    case \"INIT\": {\n      const { params } = action;\n      let searchQuery;\n      if ((searchQuery = params.get(\"ak_q\"))) {\n        return [{ ...currentState, searchQuery }, effects];\n      }\n      return current;\n    }\n    case \"SET_PAGINATION\": {\n      const { pagination } = action;\n      if (\n        (pagination.after &&\n          pagination.after === currentState.pagination?.after) ||\n        (pagination.before &&\n          pagination.before === currentState.pagination?.before)\n      ) {\n        return current;\n      }\n\n      return [{ ...currentState, pagination }, effects];\n    }\n    case \"FILTER_BY_SEARCH\": {\n      if (action.searchQuery === currentState.searchQuery) {\n        return current;\n      }\n      const { searchQuery } = action;\n      exec(() =>\n        updateQueryParams({ ak_q: searchQuery }, { replaceState: true }),\n      );\n      return [{ ...currentState, pagination: null, searchQuery }, effects];\n    }\n    case \"OPEN_CREATE_DIALOG\": {\n      return [\n        {\n          ...currentState,\n          createDialogOpen: true,\n          createdApiKey: null,\n        },\n        effects,\n      ];\n    }\n    case \"CLOSE_CREATE_DIALOG\": {\n      return [\n        {\n          ...currentState,\n          createDialogOpen: false,\n          createdApiKey: null,\n        },\n        effects,\n      ];\n    }\n    case \"SET_CREATED_API_KEY\": {\n      return [\n        {\n          ...currentState,\n          createdApiKey: action.apiKey,\n        },\n        effects,\n      ];\n    }\n    default:\n      return current;\n  }\n}\n\nexport interface ApiKeysState {\n  searchQuery: string | null;\n  pagination: ListMetadata | null;\n  createDialogOpen: boolean;\n  createdApiKey: CreateOrganizationApiKeyResponse | null;\n}\n\nexport type ApiKeysAction =\n  | { type: \"INIT\"; params: URLSearchParams }\n  | { type: \"FILTER_BY_SEARCH\"; searchQuery: string | null }\n  | { type: \"SET_PAGINATION\"; pagination: ListMetadata }\n  | { type: \"OPEN_CREATE_DIALOG\" }\n  | { type: \"CLOSE_CREATE_DIALOG\" }\n  | { type: \"SET_CREATED_API_KEY\"; apiKey: CreateOrganizationApiKeyResponse };\n\ntype EffectFn = {\n  (): void;\n  disposed: boolean;\n};\n\ntype StateWithEffects<State> = [State, EffectFn[]];\n\nfunction updateQueryParams(\n  newParams: { [key: string]: { toString(): string } | null },\n  args: { replaceState?: boolean } = {},\n) {\n  if (!canUseDOM) {\n    throw new Error(\"Cannot update query params on the server\");\n  }\n\n  if (window !== window.top) {\n    // do not update query params if widget is rendered in an iframe\n    return;\n  }\n\n  const initialSearch = window.location.search;\n  const params = new URLSearchParams(initialSearch);\n  Object.entries(newParams).forEach(([key, value]) => {\n    if (value != null && value !== \"\") {\n      params.set(key, String(value));\n    } else {\n      params.delete(key);\n    }\n  });\n\n  if (initialSearch === `?${params.toString()}`) {\n    return;\n  }\n\n  const newUrl = params.toString()\n    ? `${window.location.pathname}?${params}`\n    : window.location.pathname;\n\n  if (args.replaceState) {\n    window.history.replaceState({}, \"\", newUrl);\n  } else {\n    window.history.pushState({}, \"\", newUrl);\n  }\n}\n"],"mappings":"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","names":[]}