{"version":3,"file":"js/710-7589f5b639ecc55fd6e7.js","mappings":"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","sources":["webpack://lc3/./app/javascript/components/bookmarks/BookmarkButton.jsx","webpack://lc3/./app/javascript/components/shared/AIToolsPopover.jsx","webpack://lc3/./app/javascript/components/shared/AskAIPopover.jsx","webpack://lc3/./app/javascript/components/shared/BeforeYouBeginModal.jsx","webpack://lc3/./app/javascript/components/shared/BookmarksFeaturePopover.jsx","webpack://lc3/./app/javascript/components/shared/GoogleOneTap.jsx","webpack://lc3/./app/javascript/components/shared/HighlightsAndNotesPopover.jsx","webpack://lc3/./app/javascript/components/shared/Icon.jsx","webpack://lc3/./app/javascript/components/shared/LitCard.jsx","webpack://lc3/./app/javascript/components/shared/Popover.jsx","webpack://lc3/./app/javascript/components/shared/RecentlyAddedGuides.jsx","webpack://lc3/./app/javascript/components/shared/SessionTimeoutModal.jsx","webpack://lc3/./app/javascript/components/shared/SignUpModal.jsx","webpack://lc3/./app/javascript/helpers/toastNotify.jsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { defaultToastConfig, toastNotify } from \"../../helpers/toastNotify\";\nimport IconButton from \"../shared/IconButton\";\nimport { publish, subscribe, unsubscribe } from \"../../helpers/pubsub\";\n\nconst toasterDelay = 800;\n// Popover should appear *after* toaster disappears.\nconst popoverDelay =\n  toasterDelay + defaultToastConfig.toastTimeout + defaultToastConfig.autoClose;\n\nexport default function BookmarkButton({\n  bookmarkableType,\n  bookmarkableId,\n  buttonClass,\n  amplitudeContext,\n  hideSuccessCta = false,\n  initialBookmarkId,\n  onRemoval = null,\n  userSignedIn,\n}) {\n  const [isBookmarked, setIsBookmarked] = useState(!!initialBookmarkId);\n  const [bookmarkId, setBookmarkId] = useState(initialBookmarkId);\n  const bookmarkIcon = isBookmarked ? \"bookmark-filled\" : \"bookmark\";\n  const amplitudeEvent = isBookmarked\n    ? `removeGuideOn${amplitudeContext}`\n    : `saveGuideOn${amplitudeContext}`;\n  const [isLoading, setIsLoading] = useState(false);\n\n  // BEGIN USER NOT SIGNED IN\n  // (paul) We need a way to both trigger the bootstrap modal and set some session variables to\n  // save the bookmarkable after the user has been created / signed in. Like the event handling below,\n  // this is kind of a hacky solution. Can't figure out a better way with how the app currently\n  // works, so we'll add some data attributes on the button and fire off a post request to save the session\n  // via an onClick handler.\n\n  if (!userSignedIn) {\n    const dataAttrs = {\n      \"data-toggle\": \"modal\",\n      \"data-target\": \"#bookmark-registration-modal .modal\",\n      \"data-amplitude\": amplitudeEvent,\n    };\n\n    const onClick = () => {\n      $.ajax({\n        data: {\n          bookmark_session: {\n            bookmarkable_id: bookmarkableId,\n            bookmarkable_type: bookmarkableType,\n          },\n        },\n        dataType: \"json\",\n        method: \"POST\",\n        url: \"/bookmark_sessions\",\n      });\n    };\n\n    return (\n      <IconButton\n        btnClass={`btn-icon btn-lg bookmark-btn ${buttonClass}`}\n        {...dataAttrs}\n        iconClass={`lc-icon lc-icon-${bookmarkIcon} lc-icon-sm`}\n        onClick={onClick}\n      />\n    );\n  }\n\n  // BEGIN EVENT HANDLING //\n\n  // (alan) This was meant to maintain bookmark state across LitCards that can show up twice\n  // on a single page (ex. /lit and /poetry pages where the LitCard for a guide\n  // can be visible twice on the page). Because the Lit Cards on these pages don't share\n  // the same tree of React Components, we can't share state between them.\n  // While this is definitely hacky, there are no other alternatives without a rewrite\n  // of the entire view to be fully React OR introducing some other means of sharing state between\n  // isolated components under the current paradigm.\n\n  const eventKey = `${bookmarkableType}-${bookmarkableId}-event`;\n\n  const handleBookmarkEvent = (event) => {\n    setIsBookmarked(event.detail.isBookmarked);\n    setBookmarkId(event.detail.id);\n  };\n\n  useEffect(() => {\n    subscribe(eventKey, handleBookmarkEvent);\n\n    return () => {\n      unsubscribe(eventKey, handleBookmarkEvent);\n    };\n  }, []);\n\n  // END EVENT HANDLING //\n\n  const handleOnCreateBookmark = (event) => {\n    if (isLoading) return;\n    setIsLoading(true);\n    event.stopPropagation();\n\n    const loadingTimeout = setTimeout(\n      () => toastNotify(\"Saving...\"),\n      toasterDelay\n    );\n    $.ajax({\n      data: {\n        bookmarkable_id: bookmarkableId,\n        bookmarkable_type: bookmarkableType,\n      },\n      dataType: \"json\",\n      method: \"POST\",\n      url: \"/bookmarks\",\n      success: (data) => {\n        clearTimeout(loadingTimeout);\n        toastNotify(\"Guide saved\", !hideSuccessCta && <ViewAllCta />);\n        publish(eventKey, { isBookmarked: true, id: data.id });\n\n        if (data.showPopover) {\n          setTimeout(\n            () => publish(\"displayBookmarksFeaturePopover\", {}),\n            popoverDelay\n          );\n        }\n      },\n      error: () => {\n        clearTimeout(loadingTimeout);\n        toastNotify(\"Guide failed to save. Please try again.\");\n      },\n      complete: () => {\n        setIsLoading(false);\n      },\n    });\n  };\n\n  const handleOnRemoveBookmark = (event) => {\n    if (isLoading) return;\n    setIsLoading(true);\n    event.stopPropagation();\n\n    const loadingTimeout = setTimeout(\n      () => toastNotify(\"Removing...\"),\n      toasterDelay\n    );\n    $.ajax({\n      dataType: \"json\",\n      method: \"DELETE\",\n      url: `/bookmarks/${bookmarkId}`,\n      success: () => {\n        clearTimeout(loadingTimeout);\n        toastNotify(\"Guide removed\", !hideSuccessCta && <ViewAllCta />);\n        if (onRemoval) onRemoval(bookmarkId);\n        publish(eventKey, { isBookmarked: false, id: null });\n      },\n      error: () => {\n        clearTimeout(loadingTimeout);\n        toastNotify(\"Guide failed to remove. Please try again.\");\n      },\n      complete: () => {\n        setIsLoading(false);\n      },\n    });\n  };\n\n  return (\n    <IconButton\n      data-amplitude={amplitudeEvent}\n      btnClass={`btn-icon btn-lg bookmark-btn ${buttonClass}`}\n      iconClass={`lc-icon lc-icon-${bookmarkIcon} lc-icon-sm`}\n      onClick={isBookmarked ? handleOnRemoveBookmark : handleOnCreateBookmark}\n    />\n  );\n}\n\nBookmarkButton.propTypes = {\n  bookmarkableType: PropTypes.string.isRequired,\n  bookmarkableId: PropTypes.number.isRequired,\n  buttonClass: PropTypes.string.isRequired,\n  hideSuccessCta: PropTypes.bool,\n  initialBookmarkId: PropTypes.string,\n  onRemoval: PropTypes.func,\n  userSignedIn: PropTypes.bool.isRequired,\n};\n\nfunction ViewAllCta() {\n  return (\n    <a data-amplitude=\"toasterViewAll\" href=\"/account/saved-guides\">\n      View all\n    </a>\n  );\n}\n","import React, { createRef, useCallback, useState } from \"react\";\nimport Popover from \"./Popover\";\n\nexport default function AIToolsPopover({ arrowX = \"left\", hover = false }) {\n  const [isVisible, setIsVisible] = useState(true);\n  const popoverRef = createRef();\n\n  const dismiss = useCallback(() => {\n    setIsVisible(false);\n  }, [setIsVisible]);\n\n  return (\n    <Popover\n      ref={popoverRef}\n      arrowX={arrowX}\n      containerClass=\"container dynamic\"\n      isVisible={isVisible}\n      hover={hover}\n      popoverClassName=\"ai-tools-popover\"\n    >\n      <div className=\"content\">\n        <div className=\"image\" />\n        <div className=\"text\">\n          <div>\n            <strong className=\"title\">AI Tools</strong>\n            <span className=\"subcopy\">New</span>\n          </div>\n          <div className=\"body-2\">\n            Tools to make learning and teaching easier\n          </div>\n        </div>\n      </div>\n      <button\n        className=\"btn btn-default btn-block btn-lg\"\n        onClick={dismiss}\n        type=\"button\"\n      >\n        Got It\n      </button>\n    </Popover>\n  );\n}\n","import React, { createRef, useCallback, useState } from \"react\";\nimport Popover from \"./Popover\";\n\nexport default function AskAIPopover({ arrowX = \"right\" }) {\n  const [isVisible, setIsVisible] = useState(true);\n  const popoverRef = createRef();\n\n  const dismiss = useCallback(() => {\n    setIsVisible(false);\n  }, [setIsVisible]);\n\n  return (\n    <Popover\n      ref={popoverRef}\n      arrowX={arrowX}\n      containerClass=\"container dynamic\"\n      isVisible={isVisible}\n    >\n      <div className=\"content\">\n        <div className=\"text\">\n          <div>\n            <strong>Ask LitCharts AI</strong>\n            <span className=\"subcopy\">New</span>\n          </div>\n          <div>\n            Get instant answers from the only tool that combines LitCharts\n            literary analysis with the power of AI.\n          </div>\n        </div>\n      </div>\n      <button\n        className=\"btn btn-default btn-block btn-lg\"\n        onClick={dismiss}\n        type=\"button\"\n      >\n        Got It\n      </button>\n    </Popover>\n  );\n}\n","import React from \"react\";\nimport Modal from \"components/shared/Modal\";\nimport Input from \"components/shared/Input\";\nimport Select from \"components/shared/Select\";\n\nclass BeforeYouBeginModal extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      username: null,\n      iAmA: null,\n      errorMessages: props.errorMessages,\n    };\n    this.setUsername = this.setUsername.bind(this);\n    this.setIAmA = this.setIAmA.bind(this);\n    this.submit = this.submit.bind(this);\n  }\n\n  submit(e) {\n    e.preventDefault();\n    $.ajax({\n      data: {\n        user: {\n          i_am_a: this.state.iAmA,\n          ...(this.props.shouldShowUsernameInput && {\n            username: this.state.username,\n          }),\n        },\n      },\n      dataType: \"json\",\n      method: \"PUT\",\n      url: this.props.beforeYouBeginUpdateUrl,\n      success: (_) => {\n        $(\"#before-you-begin-modal\").modal(\"hide\");\n      },\n      error: (error) => {\n        this.setState({ errorMessages: error.responseJSON.errors });\n      },\n    });\n  }\n\n  setUsername(e) {\n    this.setState({\n      username: e.target.value,\n    });\n  }\n\n  setIAmA(option) {\n    this.setState({\n      iAmA: option.value,\n    });\n  }\n\n  render() {\n    const { errorMessages } = this.state;\n    const { contactUrl, iAmAOptions } = this.props;\n    return (\n      <Modal\n        id=\"before-you-begin-modal\"\n        title=\"Complete your profile\"\n        showOnMount\n        backdropStatic\n        footer={false}\n      >\n        <div className=\"text-center\">\n          <div className=\"title-4\">Welcome!</div>\n          <div dangerouslySetInnerHTML={{ __html: this.props.bannerMessage }} />\n        </div>\n\n        <form>\n          {this.props.shouldShowUsernameInput ? (\n            <Input\n              name=\"user[username]\"\n              handleChange={this.setUsername}\n              inputId=\"user_username\"\n              inputClass=\"input-lg\"\n              errorMessage={errorMessages.username}\n              labelText=\"Username\"\n            />\n          ) : null}\n          <Select\n            id=\"user_i_am_a\"\n            name=\"user[i_am_a]\"\n            onChange={this.setIAmA}\n            baseClassName=\"lc-select-container\"\n            errorMessage={errorMessages.i_am_a}\n            placeholder=\"Select one\"\n            options={iAmAOptions}\n            labelText=\"I am a:\"\n          />\n          <button\n            type=\"submit\"\n            onClick={this.submit}\n            className=\"btn btn-primary btn-block\"\n          >\n            Get Started\n          </button>\n\n          <div className=\"body-2 text-center\">\n            Need help?&nbsp;\n            <a href={contactUrl}>Contact us</a>.\n          </div>\n        </form>\n      </Modal>\n    );\n  }\n}\n\nexport default BeforeYouBeginModal;\n","import React, { createRef, useCallback, useEffect, useState } from \"react\";\nimport { subscribe, unsubscribe } from \"../../helpers/pubsub\";\nimport Popover from \"./Popover\";\n\nexport default function BookmarksFeaturePopover({\n  forceVisibility = false,\n  hover = false,\n}) {\n  const [isVisible, setIsVisible] = useState(forceVisibility);\n  const popoverRef = createRef();\n\n  const dismiss = useCallback(() => {\n    setIsVisible(false);\n  }, [setIsVisible]);\n\n  useEffect(() => {\n    subscribe(\"displayBookmarksFeaturePopover\", () => {\n      setIsVisible(true);\n    });\n\n    return () => {\n      unsubscribe(\"displayBookmarksFeaturePopover\", () => {\n        setIsVisible(true);\n      });\n    };\n  }, []);\n\n  return (\n    <Popover\n      ref={popoverRef}\n      arrowX=\"right\"\n      containerClass=\"container dynamic\"\n      hover={hover}\n      isVisible={isVisible}\n      popoverClassName=\"bookmarks-feature-popover\"\n    >\n      <div className=\"content\">\n        <div className=\"image\" />\n        <div className=\"text\">\n          <div>\n            <strong>Your Saved Guides</strong>\n            <span className=\"subcopy\">New</span>\n          </div>\n          <div>\n            Easily access all the guides you’ve saved in your account menu.\n          </div>\n        </div>\n      </div>\n      <button\n        className=\"btn btn-default btn-block btn-lg\"\n        onClick={dismiss}\n        type=\"button\"\n      >\n        Got It\n      </button>\n    </Popover>\n  );\n}\n","import React, { useEffect, useState } from \"react\";\nimport SignUpModal from \"components/shared/SignUpModal\";\nimport LcOAuth2 from \"lib/shared/oauth2\";\n\nconst GoogleOneTap = ({ countryOptions, countryCode, gdpr = false }) => {\n  const [showModal, setShowModal] = useState(false);\n\n  const skipFormAndCreateAccount = () => {\n    $.ajax({\n      data: {\n        signup_origin: \"google_one_tap\",\n        user: { simplified_signup: true, email_marketing_optin: true },\n      },\n      dataType: \"json\",\n      method: \"POST\",\n      url: \"/\",\n      success: (_data, _textStatus, jqXHR) => {\n        window.location.href = jqXHR.getResponseHeader(\"Location\");\n      },\n    });\n  };\n\n  useEffect(() => {\n    const handleCredentialResponse = (event) => {\n      const { response } = event;\n      window.LitCharts.modal.mutex.lock(); // Reserve slot ASAP for modal that will open on success.\n      $.ajax({\n        method: \"POST\",\n        // TODO: Use more general strategy name than google_one_tap *but* still record if user signed up with one-tap or otherwise\n        url: \"/auth/google_one_tap/callback\",\n        data: response,\n        success: (data, _textStatus, jqXHR) => {\n          switch (data.state) {\n            case \"skip_form_and_create_account\":\n              skipFormAndCreateAccount();\n              break;\n            case \"registration_in_progress\":\n              // Hide any existing modals in case they were opened while we waited for Google's response.\n              window.LitCharts.modal.hideAll();\n              // Show the sign up form modal so user can complete registration.\n              setShowModal(true);\n              break;\n            case \"signed_in\": // A previously registered user has signed in.\n            case \"sign_in_elsewhere\": // User needs to sign in on another page\n              window.location.href = jqXHR.getResponseHeader(\"Location\");\n              break;\n            default:\n              console.log(\n                \"There was an error with Google One Tap, unrecognized state.\"\n              );\n          }\n        },\n        error: (jqXHR, _textStatus, _errorThrown) => {\n          // Happens if Users::OmniauthCallbacksController#failure responds.\n          window.LitCharts.modal.mutex.unlock();\n          $(\"body\").prepend(\n            `<div class=\"lc-banner lc-banner-warning\">${jqXHR.responseJSON.error}</div>`\n          );\n        },\n      });\n    };\n    $(document).on(\n      \"googleIdOneTap:credentialResponse\",\n      handleCredentialResponse\n    );\n\n    const openPrompt = () => {\n      // Docs: https://developers.google.com/identity/gsi/web/guides/use-one-tap-js-api\n      // NOTE: We may need to revisit the commented out code, but isDisplayed() is not available\n      // when Google migrates to FedCM.\n      google.accounts.id.prompt((_notification) => {\n        //if (notification.isDisplayed()) {\n        $(\"html\").addClass(\"google-one-tap-is-displayed\");\n        //} else {\n        // $(\"html\").removeClass(\"google-one-tap-is-displayed\");\n        //}\n      });\n    };\n    LcOAuth2.initGoogle().then(openPrompt);\n\n    // Returning useEffect cleanup function to remove any event listeners.\n    return () => {\n      $(document).off(\n        \"googleIdOneTap:credentialResponse\",\n        handleCredentialResponse\n      );\n    };\n  }, []); // Empty dependencies array so this runs only once when component mounts.\n  return (\n    !!showModal && (\n      <SignUpModal\n        countryOptions={countryOptions}\n        countryCode={countryCode}\n        gdpr={gdpr}\n        signupOrigin=\"google_one_tap\"\n      />\n    )\n  );\n};\n\nexport default GoogleOneTap;\n","import React, { createRef, useCallback, useEffect, useState } from \"react\";\nimport classnames from \"classnames\";\nimport Popover from \"./Popover\";\n\nconst sessionStorageKey = \"highlightsAndNotesPopoverViewed\";\n\nexport default function HighlightsAndNotesPopover({\n  delayInSeconds = 1,\n  arrowX,\n  arrowY,\n  forceVisibility = false,\n}) {\n  const hasViewedPopover = !!sessionStorage.getItem(sessionStorageKey);\n  const [isVisible, setIsVisible] = useState(forceVisibility);\n  const popoverRef = createRef();\n\n  const dismiss = useCallback(() => {\n    setIsVisible(false);\n  }, [setIsVisible]);\n\n  const searchBtn = document.querySelector(\n    \".header-controls__toggleable-search-control\"\n  );\n  const containerClasses = classnames(\"container\", {\n    extended: !searchBtn && popoverRef,\n  });\n\n  useEffect(() => {\n    setTimeout(() => {\n      if (!hasViewedPopover) {\n        setIsVisible(true);\n        sessionStorage.setItem(sessionStorageKey, \"true\");\n      }\n    }, delayInSeconds * 1000);\n  }, []);\n\n  return (\n    <Popover\n      ref={popoverRef}\n      arrowX={arrowX}\n      arrowY={arrowY}\n      containerClass={containerClasses}\n      isVisible={isVisible}\n      popoverClassName=\"highlights-and-notes-popover\"\n    >\n      <div className=\"content\">\n        <div className=\"image\" />\n        <div className=\"text\">\n          <div>\n            <strong>Highlights &amp; Notes</strong>\n          </div>\n          <div>\n            Once you&apos;ve saved your first highlight or note, you can access\n            it through your account menu.\n          </div>\n        </div>\n      </div>\n      <button\n        className=\"btn btn-default btn-block btn-lg\"\n        onClick={dismiss}\n        type=\"button\"\n      >\n        Got It\n      </button>\n    </Popover>\n  );\n}\n","import React from \"react\";\n\nconst Icon = ({ className, name, size }) => (\n  <i className={`lc-icon lc-icon-${size} lc-icon-${name} ${className}`} />\n);\n\nexport default Icon;\n","import React, { useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport classnames from \"classnames\";\nimport BookmarkButton from \"../bookmarks/BookmarkButton\";\nimport litCards from \"../../views/shared/litCards\";\n\nconst propTypes = {\n  authorName: PropTypes.string,\n  bookmarkId: PropTypes.string,\n  bookmarkableType: PropTypes.string,\n  hideSuccessCta: PropTypes.bool,\n  id: PropTypes.number,\n  index: PropTypes.number,\n  includeTags: PropTypes.bool,\n  onRemoval: PropTypes.func,\n  randomizeBackgrounds: PropTypes.bool,\n  summary: PropTypes.string,\n  tags: PropTypes.arrayOf(PropTypes.string),\n  title: PropTypes.string,\n  url: PropTypes.string.isRequired,\n  userSignedIn: PropTypes.bool.isRequired,\n};\n\nconst defaultProps = {\n  authorName: null,\n  bookmarkId: null,\n  hideSuccessCta: false,\n  includeTags: false,\n  index: 0,\n  onRemoval: null,\n  randomizeBackgrounds: true,\n  summary: \"\",\n  tags: [],\n};\n\nexport default function LitCard({\n  authorName,\n  bookmarkableType,\n  bookmarkId,\n  hideSuccessCta,\n  id,\n  includeTags,\n  index,\n  onRemoval,\n  randomizeBackgrounds,\n  summary = \"\",\n  tags,\n  title,\n  url,\n  userSignedIn,\n}) {\n  useEffect(() => {\n    if (randomizeBackgrounds) {\n      litCards.randomizeBackgrounds(\".lit-card\", true);\n    }\n  }, []);\n\n  const sanitizedSummary = (summary || \"\").replace(/<\\/?[^>]+(>|$)/g, \"\");\n  const truncatedSummary = sanitizedSummary.substring(0, 200);\n\n  const tagColor = (tag) => {\n    switch (tag) {\n      case \"Shakescleare\":\n        return \"purple-tint-25\";\n      case \"Lit Term\":\n        return \"green-tint-25\";\n      default:\n        return \"blue-tint-35\";\n    }\n  };\n\n  const handleCardClick = (event) => {\n    // (alan) Predicate is to ensure that we're not clicking\n    // on the bookmark button within the div--handles\n    // both mouse click and keypress events. stopPropagation()\n    // in BookmarkButton only worked for mouse click but not keypress\n    if (event.currentTarget === event.target) {\n      window.location.href = url;\n    }\n  };\n\n  return (\n    <div\n      className={classnames(\"lit-card\", { \"lit-card--no-tags\": !tags.length })}\n      data-index={index}\n      onClick={handleCardClick}\n      onKeyPress={handleCardClick}\n      role=\"link\"\n      tabIndex={0}\n    >\n      <div className=\"lit-card__indentation\" />\n      <div className=\"lit-card__content-wrapper\">\n        <div className=\"lit-card__content\">\n          {!!tags.length && includeTags && (\n            <div className=\"lit-card__tags\">\n              {tags.map((tag) => (\n                <span\n                  className={`lit-card__tag subtitle-2 ${tagColor(tag)}`}\n                  key={`${index}-${tag}`}\n                >\n                  {tag}\n                </span>\n              ))}\n            </div>\n          )}\n          <div className=\"title-6\">{title}</div>\n          {!!authorName && <div className=\"body-2\">{`by ${authorName}`}</div>}\n          <div className=\"body-3\">{truncatedSummary}</div>\n        </div>\n        <div className=\"lit-card__fader\" />\n      </div>\n      <div className=\"lit-card__bookmark\">\n        <BookmarkButton\n          amplitudeContext=\"CardComponent\"\n          buttonClass=\"btn-borderless-alt\"\n          bookmarkableId={id}\n          bookmarkableType={bookmarkableType}\n          hideSuccessCta={hideSuccessCta}\n          initialBookmarkId={bookmarkId}\n          onRemoval={onRemoval}\n          userSignedIn={userSignedIn}\n        />\n      </div>\n    </div>\n  );\n}\n\nLitCard.propTypes = propTypes;\nLitCard.defaultProps = defaultProps;\n","import React, { useEffect, useState } from \"react\";\nimport classnames from \"classnames\";\n\n// *params list\n// arrowX?:           Specifies to align the popover arrow on (left | center | right) [default: left]\n// arrowY?:           specifies to align the popover arrow on top or bottom of the popover (Default: top)\n// children:          content to render inside the popover\n// containerClass?:   optional className to add to the container div\n// contentClass?:     optional className to add to the inner content div\n// hover?:            adds hover behaviors\n// popoverClassName:  wrapper class for the entire popover\n\nexport default React.forwardRef((props, ref) => {\n  const {\n    arrowClass,\n    arrowX = \"left\",\n    arrowY = \"top\",\n    children,\n    containerClass,\n    contentClass,\n    hover = false,\n    isVisible: isVisibleFromProps,\n    popoverClassName,\n  } = props;\n  const [isVisible, setIsVisible] = useState(false);\n  const arrowClasses = classnames(\n    \"arrow\",\n    { [arrowClass]: arrowClass },\n    { top: arrowY === \"top\" },\n    { bottom: arrowY === \"bottom\" },\n    { left: arrowX === \"left\" },\n    { right: arrowX === \"right\" },\n    { center: arrowX === \"center\" }\n  );\n  const containerClasses = classnames(\n    \"popover-container\",\n    { [containerClass]: containerClass },\n    { left: arrowX === \"left\" },\n    { right: arrowX === \"right\" },\n    { center: arrowX === \"center\" },\n    { hidden: !isVisible }\n  );\n  const contentClasses = classnames(\"popover-content\", {\n    [contentClass]: contentClass,\n  });\n  const isBtn = (e) => {\n    return e.type === \"button\" || e.parentElement.type === \"button\";\n  };\n\n  useEffect(() => {\n    const popoverDiv = ref.current;\n    const popoverContainer = popoverDiv?.parentElement;\n\n    const encapsulatingDiv = popoverContainer?.parentElement;\n    const parentElement = encapsulatingDiv.hasAttribute(\"data-react-class\")\n      ? encapsulatingDiv.parentElement\n      : encapsulatingDiv;\n\n    const handleClickParent = (event) => {\n      if (ref.current.contains(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n\n      if (\n        parentElement?.contains(event.target) &&\n        !ref.current.contains(event.target)\n      ) {\n        // Parent (usually what the popover is pointing to) is clicked, dismiss the popover\n        setIsVisible(false);\n      } else if (ref.current.contains(event.target) && isBtn(event.target)) {\n        // Popover CTA is clicked, dismiss the popover\n        setIsVisible(false);\n      }\n    };\n    parentElement?.addEventListener(\"click\", handleClickParent, true);\n    return () => {\n      parentElement?.removeEventListener(\"click\", handleClickParent, true);\n    };\n  }, [ref]);\n\n  useEffect(() => {\n    if (!hover) {\n      return;\n    }\n\n    const popoverDiv = ref.current;\n    const popoverContainer = popoverDiv?.parentElement;\n\n    const encapsulatingDiv = popoverContainer?.parentElement;\n    const parentElement = encapsulatingDiv.hasAttribute(\"data-react-class\")\n      ? encapsulatingDiv.parentElement\n      : encapsulatingDiv;\n\n    const handlePopoverParentHover = (event) => {\n      // Close popover when the parent element is hovered on\n      if (!popoverDiv.contains(event.target)) {\n        setIsVisible(false);\n        parentElement.removeEventListener(\n          \"mouseover\",\n          handlePopoverParentHover\n        );\n      }\n    };\n\n    parentElement.addEventListener(\"mouseover\", handlePopoverParentHover);\n    return () => {\n      parentElement.removeEventListener(\"mouseover\", handlePopoverParentHover);\n    };\n  }, [hover, ref]);\n\n  useEffect(() => {\n    setIsVisible(isVisibleFromProps);\n  }, [isVisibleFromProps]);\n\n  return (\n    <div className={popoverClassName}>\n      <div\n        ref={ref}\n        className={containerClasses}\n        data-test=\"popover\"\n        role=\"tooltip\"\n      >\n        <div className={arrowClasses} />\n        <div className={contentClasses}>{children}</div>\n      </div>\n    </div>\n  );\n});\n","import React, { useLayoutEffect, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport helpers from \"helpers/base\";\nimport { useMediaQuery } from \"react-responsive\";\nimport { SM_PIXEL_MAX, XXS_PIXEL_MAX } from \"constants/breakpoints\";\nimport LitCard from \"./LitCard\";\n\nconst propTypes = {\n  initialDisplayAmount: PropTypes.number,\n  guides: PropTypes.array,\n  useSignedIn: PropTypes.bool,\n};\n\nconst recentlyAddedSelector = \".recently-added\";\n\nexport default function BookmarkList({\n  initialDisplayAmount = 3,\n  includeTags = false,\n  guides,\n  userSignedIn,\n}) {\n  const [displayAmount, setDisplayAmount] = useState(0);\n\n  //* Handling Screen Sizes / Layouts Programmatically *//\n  const handleDesktopLayoutChange = (matches) => {\n    if (matches) {\n      setDisplayAmount(initialDisplayAmount);\n    }\n  };\n\n  const handleMediumLayoutChange = (matches) => {\n    if (matches) {\n      setDisplayAmount(4);\n    }\n  };\n\n  const handleMobileLayoutChange = (matches) => {\n    if (matches) {\n      setDisplayAmount(3);\n    }\n  };\n\n  const isDesktopLayout = useMediaQuery(\n    { minWidth: SM_PIXEL_MAX },\n    undefined,\n    handleDesktopLayoutChange\n  );\n  useMediaQuery(\n    { minWidth: XXS_PIXEL_MAX, maxWidth: SM_PIXEL_MAX },\n    undefined,\n    handleMediumLayoutChange\n  );\n  const isMobileLayout = useMediaQuery(\n    { maxWidth: XXS_PIXEL_MAX },\n    undefined,\n    handleMobileLayoutChange\n  );\n\n  // Prior to painting the DOM, we want to set the display amount based\n  // on screen size\n  useLayoutEffect(() => {\n    if (isDesktopLayout) {\n      setDisplayAmount(initialDisplayAmount);\n    } else if (isMobileLayout) {\n      setDisplayAmount(3);\n    } else {\n      setDisplayAmount(4);\n    }\n  }, []);\n\n  //* ============== *//\n\n  const [canShowMore, setCanShowMore] = useState(guides.length > displayAmount);\n  const showMoreAmount = guides.length - displayAmount;\n  const showMoreText = canShowMore\n    ? `Browse ${showMoreAmount} more`\n    : \"View less\";\n  const visibleGuides = canShowMore ? guides.slice(0, displayAmount) : guides;\n\n  const toggleShowMore = () => {\n    if (!canShowMore) {\n      const container = document.querySelector(recentlyAddedSelector);\n      helpers.dom.scrollTo(container);\n    }\n\n    setCanShowMore(!canShowMore);\n  };\n\n  return (\n    <div className=\"recently-added__original\">\n      <div className=\"guide-list\">\n        <div className=\"guide-list__groups-wrapper\">\n          <ul className=\"guide-list__groups guide-list__groups--grid\">\n            <li className=\"guide-list__group\">\n              <ul className=\"guide-list__guides\">\n                <div className=\"row\">\n                  {visibleGuides.map((guide, index) => (\n                    <div\n                      className=\"col-xxs-12 col-xs-6 col-sm-6 col-md-4 col-lg-4\"\n                      key={guide.slug}\n                    >\n                      <li className=\"guide-list__guide\">\n                        <LitCard\n                          {...guide}\n                          includeTags={includeTags}\n                          index={index}\n                          userSignedIn={userSignedIn}\n                        />\n                      </li>\n                    </div>\n                  ))}\n                </div>\n              </ul>\n            </li>\n          </ul>\n        </div>\n      </div>\n      {guides.length > 3 && (\n        <button\n          className=\"btn btn-md btn-default recently-added__more-btn\"\n          onClick={toggleShowMore}\n          type=\"button\"\n        >\n          {showMoreText}\n        </button>\n      )}\n    </div>\n  );\n}\n\nBookmarkList.propTypes = propTypes;\n","import React, { useEffect, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport Modal from \"components/shared/Modal\";\n\n// SessionTimeoutModal\n\n// The Devise :timeoutable module will silently timeout users for inactivity\n// We show this modal to the user before that happens to give them the opportunity\n// to stay signed in or sign out\n// Session timeout is configured using the CustomTimeout concern.\n\n// In practice, this means that on page load, this modal is hidden and sets a timer\n// for 3 minutes before the session duration is up. After that, this modal will begin polling sessions#check_timeout\n// every 10 seconds to find out how much time remains until session timeout\n// Upon reaching 110 seconds or less, this modal will reveal itself and begin a 90 second timer:\n//   => If the user clicks away from the modal or clicks the \"Keep me logged in\" button\n//   their session timeout will be reset and they will stay logged in\n//   => If the user does not perform any activity by the end of the timer, we send a redirect to\n//   sessions#timeout which logs the user out and redirects them to the sign_in page with a flash message\n\nconst propTypes = {\n  checkSessionTimeoutEvery: PropTypes.number,\n  checkSessionTimeoutUrl: PropTypes.string.isRequired,\n  keepAliveUrl: PropTypes.string.isRequired,\n  signOutUrl: PropTypes.string.isRequired,\n  sessionTimeoutUrl: PropTypes.string.isRequired,\n  startPollingIn: PropTypes.number,\n};\n\nconst selectors = {\n  MAIN: \"#session-timeout-modal\",\n};\n\nconst _debug = true;\nconst modalDuration = 90;\n\nfunction SessionTimeoutModal(props) {\n  const [remainingDuration, setRemainingDuration] = useState(modalDuration);\n  const [isRevealed, setIsRevealed] = useState(false);\n  const [tickInterval, setTickInterval] = useState();\n  const [pollInterval, setPollInterval] = useState();\n  const [sessionTimeoutTimer, setSessionTimeoutTimer] = useState();\n\n  // on component mount, set timeout to start polling later\n  useEffect(() => {\n    pollCheckSessionTimeoutLater();\n    window.addEventListener(\"lc3_session_timeout_modal_reveal\", reveal);\n    window.addEventListener(\n      \"lc3_session_timeout_modal_force_timeout\",\n      sessionTimeout\n    );\n  }, []);\n\n  useEffect(() => {\n    if (isRevealed === true) {\n      clearPollInterval();\n    } else {\n      clearSessionTimeoutTimer();\n      clearTickInterval();\n    }\n  }, [isRevealed]);\n\n  const hide = () => {\n    setIsRevealed(false);\n    $(selectors.MAIN).modal(\"hide\");\n  };\n\n  const reveal = () => {\n    setIsRevealed(true);\n    setTickInterval(setInterval(tick, 1000));\n    debugLog(\n      \"Creating timer to session timeout in \",\n      modalDuration,\n      \" seconds\"\n    );\n    setSessionTimeoutTimer(setTimeout(sessionTimeout, modalDuration * 1000));\n    $(selectors.MAIN).modal(\"show\");\n  };\n\n  const clearTickInterval = () => {\n    clearInterval(tickInterval);\n    setTickInterval(null);\n  };\n\n  const tick = () => {\n    setRemainingDuration((duration) => Math.max(duration - 1, 0));\n  };\n\n  const clearPollInterval = () => {\n    clearInterval(pollInterval);\n    setPollInterval(null);\n  };\n\n  // set timeout to start polling later\n  const pollCheckSessionTimeoutLater = () => {\n    debugLog(\n      \"Creating timer to start polling in \",\n      props.startPollingIn,\n      \" seconds\"\n    );\n\n    // setTimeout will execute immediately if the delay value exceeds the maximum.\n    // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value\n    const maxDelay = 2147483647;\n    const delay = props.startPollingIn * 1000;\n    setTimeout(pollCheckSessionTimeout, Math.min(delay, maxDelay));\n  };\n\n  // poll to check remaining time since last server side activity\n  const pollCheckSessionTimeout = () => {\n    debugLog(\n      \"Creating interval to poll every \",\n      props.checkSessionTimeoutEvery,\n      \" seconds\"\n    );\n    const interval = setInterval(\n      checkSessionTimeout,\n      props.checkSessionTimeoutEvery * 1000\n    );\n    setPollInterval(interval);\n  };\n\n  // if remaining time until timeout is less than 110 seconds, reveal this modal\n  const checkSessionTimeout = () => {\n    debugLog(\"Polling checkSessionTimeout...\");\n    $.ajax({\n      method: \"get\",\n      url: props.checkSessionTimeoutUrl,\n      success(data, _textStatus, _jqXHR) {\n        debugLog(\"check_timeout response:\", data);\n        if (\n          data > 0 &&\n          data < modalDuration + props.checkSessionTimeoutEvery * 2\n        ) {\n          reveal();\n        }\n      },\n    });\n  };\n\n  const clearSessionTimeoutTimer = () => {\n    clearTimeout(sessionTimeoutTimer);\n    setSessionTimeoutTimer(null);\n  };\n\n  const sessionTimeout = () => {\n    debugLog(\"Requesting session timeout...\");\n    window.location.href = props.sessionTimeoutUrl;\n  };\n\n  const keepAlive = () => {\n    $(\"html\").attr(\"data-session-keep-alive\", \"pending\");\n    $.ajax({\n      method: \"post\",\n      url: props.keepAliveUrl,\n      success(_data, _textStatus, _jqXHR) {\n        hide();\n        setRemainingDuration(modalDuration);\n        pollCheckSessionTimeoutLater();\n        $(\"html\").attr(\"data-session-keep-alive\", \"success\");\n      },\n      error() {\n        $(\"html\").attr(\"data-session-keep-alive\", \"error\");\n        $(\"body\").prepend(\n          '<div class=\"lc-banner lc-banner-warning\">There was an error keeping you signed in.</div>'\n        );\n      },\n    });\n  };\n\n  const debugLog = (...message) => {\n    /* eslint-disable no-console */\n    if (_debug) {\n      console.log(\"[SessionTimeoutModal]\", ...message);\n    }\n    /* eslint-enable no-console */\n  };\n\n  return (\n    <Modal\n      id={selectors.MAIN.slice(1)}\n      showOnMount={false}\n      onHidden={keepAlive}\n      footer={false}\n    >\n      <div className=\"title-4\">Still there?</div>\n      <div className=\"body-2\">\n        You&apos;ve been inactive for a while and will be signed out in{\" \"}\n        <b data-remaining-duration>\n          {remainingDuration} {remainingDuration === 1 ? \"second\" : \"seconds\"}\n        </b>{\" \"}\n        to keep your account secure.\n      </div>\n      <button\n        type=\"button\"\n        className=\"btn btn-block btn-lg btn-primary\"\n        onClick={hide}\n      >\n        Keep me signed in\n      </button>\n      <a\n        className=\"btn btn-block btn-lg btn-default\"\n        data-method=\"delete\"\n        rel=\"nofollow\"\n        href={props.signOutUrl}\n      >\n        Sign out\n      </a>\n    </Modal>\n  );\n}\n\nSessionTimeoutModal.propTypes = propTypes;\n\nexport default SessionTimeoutModal;\n","import React, { useRef, useState } from \"react\";\nimport Checkbox from \"components/shared/Checkbox\";\nimport Modal from \"components/shared/Modal\";\nimport BirthdayInput from \"components/shared/BirthdayInput\";\nimport Select from \"./Select\";\nimport VariantCountrySelect from \"../sell/VariantCountrySelect\";\n\n// TODO: Replace hardcoded paths with routes-generated values.\nconst SignUpModal = (props) => {\n  const [fullErrorMessages, _setFullErrorMessages] = useState(null);\n  const [submitInProgress, setSubmitInProgress] = useState(false);\n  const modal = useRef(null);\n  const form = useRef(null);\n  const { signupOrigin } = props;\n\n  // TODO: DRY up with User::I_AM_A constant.\n  const iAmAOptions = [\n    { value: \"student\", label: \"Student\" },\n    { value: \"teacher_educator\", label: \"Teacher / Educator\" },\n    { value: \"parent\", label: \"Parent of Student\" },\n    { value: \"librarian\", label: \"Librarian\" },\n    { value: \"general_interest_reader\", label: \"General-interest Reader\" },\n  ];\n\n  // TODO: Avoid useRef/useState dance throughout this.\n  // when using state in functional components, only the initial state will be\n  // available at the time event listeners are created, so we create refs and\n  // functions that update them (perhaps messier than just using a react class component)\n  const fullErrorMessagesRef = useRef(fullErrorMessages);\n  const setFullErrorMessages = (data) => {\n    const messages = Object.values(data).flat();\n    fullErrorMessagesRef.current = messages;\n    _setFullErrorMessages(messages);\n  };\n\n  const onSubmit = (event) => {\n    event.preventDefault();\n\n    if (submitInProgress) {\n      return;\n    }\n    setSubmitInProgress(true);\n    $.ajax({\n      data: $(form.current).serialize(),\n      dataType: \"json\",\n      method: \"POST\",\n      url: \"/\",\n      success: (_data, _textStatus, jqXHR) => {\n        window.location.href = jqXHR.getResponseHeader(\"Location\");\n      },\n      error: (jqXHR, _textStatus, _errorThrown) => {\n        setSubmitInProgress(false);\n        setFullErrorMessages(jqXHR.responseJSON.errors);\n      },\n    });\n  };\n\n  return (\n    <Modal\n      ref={modal}\n      id=\"sign-up-modal\"\n      title=\"Sign up for a free&nbsp;account\"\n      showOnMount\n      footer={false}\n      onHidden={window.LitCharts.modal.mutex.unlock}\n      backdropStatic // Prevents clicks on backdrop from closing modal.\n      closeIcon\n    >\n      <div>\n        <form noValidate ref={form} onSubmit={onSubmit} className=\"modal__form\">\n          {fullErrorMessages && (\n            <ul className=\"error-list\">\n              {fullErrorMessages.map((message) => (\n                <li>{message}</li>\n              ))}\n            </ul>\n          )}\n\n          {props.countryCode ? (\n            <input\n              type=\"hidden\"\n              name=\"user[country_code]\"\n              id=\"user_country_code\"\n              value={props.countryCode}\n            />\n          ) : (\n            <div className=\"modal__form-group\">\n              <VariantCountrySelect\n                baseClassName=\"lc-select-container--md\"\n                name=\"user[country_code]\"\n                id=\"user_country_code\"\n                placeholder=\"Select one\"\n                labelText=\"Country\"\n                options={props.countryOptions}\n              />\n            </div>\n          )}\n\n          {props.gdpr || !props.countryCode ? (\n            <div className=\"modal__form-group\">\n              <BirthdayInput\n                inputId=\"user_birthday\"\n                name=\"user[birthday]\"\n                labelText=\"Birthday\"\n                inputClass=\"input-md\"\n                tokenize\n                infoMessage=\"Please enter as MM/DD/YYYY\"\n              />\n            </div>\n          ) : null}\n\n          <div className=\"modal__form-group\">\n            <Select\n              id=\"user_i_am_a\"\n              name=\"user[i_am_a]\"\n              baseClassName=\"lc-select-container--md\"\n              placeholder=\"Select one\"\n              options={iAmAOptions}\n              labelText=\"I am a&hellip;\"\n            />\n          </div>\n\n          <div\n            className={`marketing-optin-checkbox ${props.gdpr ? \"\" : \"hidden\"}`}\n          >\n            <Checkbox\n              label=\"Get email updates when we add new guides and features. Unsubscribe at any time.\" // eslint-disable-line max-len\n              name=\"user[email_marketing_optin]\"\n              checked={false}\n            />\n          </div>\n\n          <input name=\"signup_origin\" value={signupOrigin} type=\"hidden\" />\n          <button\n            className=\"btn btn-primary btn-lg\"\n            type=\"submit\"\n            disabled={submitInProgress}\n          >\n            Create Account\n          </button>\n        </form>\n        <div className=\"text-center\">\n          Already have an account? <a href=\"/sign-in\">Sign in</a>\n        </div>\n      </div>\n    </Modal>\n  );\n};\n\nexport default SignUpModal;\n","import React from \"react\";\n\nimport { toast } from \"react-toastify\";\n\nexport const defaultToastConfig = {\n  position: toast.POSITION.BOTTOM_CENTER,\n  theme: \"dark\",\n  icon: false,\n  autoClose: 4000, // ms\n  closeOnClick: false,\n  draggable: false,\n  toastTimeout: 300, // ms\n};\n\nexport const toastNotify = (message, extraContent = false) => {\n  toast.dismiss();\n  setTimeout(\n    () =>\n      toast(\n        <div className=\"Toastify__toast-contents\">\n          <span className=\"Toastify__message-content\">{message}</span>\n          {!!extraContent && (\n            <span className=\"Toastify__extra-content\">{extraContent}</span>\n          )}\n        </div>,\n        defaultToastConfig\n      ),\n    defaultToastConfig.toastTimeout\n  );\n};\n"],"names":["toasterDelay","popoverDelay","defaultToastConfig","toastTimeout","autoClose","BookmarkButton","_ref","bookmarkableType","bookmarkableId","buttonClass","amplitudeContext","_ref$hideSuccessCta","hideSuccessCta","initialBookmarkId","_ref$onRemoval","onRemoval","userSignedIn","_useState2","_slicedToArray","useState","isBookmarked","setIsBookmarked","_useState4","bookmarkId","setBookmarkId","bookmarkIcon","amplitudeEvent","concat","_useState6","isLoading","setIsLoading","dataAttrs","React","IconButton","_extends","btnClass","iconClass","onClick","$","ajax","data","bookmark_session","bookmarkable_id","bookmarkable_type","dataType","method","url","eventKey","handleBookmarkEvent","event","detail","id","useEffect","subscribe","unsubscribe","stopPropagation","loadingTimeout","setTimeout","toastNotify","success","clearTimeout","ViewAllCta","publish","error","complete","showPopover","href","propTypes","PropTypes","isRequired","AIToolsPopover","_ref$arrowX","arrowX","_ref$hover","hover","isVisible","setIsVisible","popoverRef","createRef","dismiss","useCallback","Popover","ref","containerClass","popoverClassName","className","type","AskAIPopover","_React$Component","BeforeYouBeginModal","props","_this","_classCallCheck","_callSuper","state","username","iAmA","errorMessages","setUsername","bind","setIAmA","submit","_inherits","key","value","e","_this2","preventDefault","user","_objectSpread","i_am_a","this","shouldShowUsernameInput","beforeYouBeginUpdateUrl","_","modal","setState","responseJSON","errors","target","option","_this$props","contactUrl","iAmAOptions","Modal","title","showOnMount","backdropStatic","footer","dangerouslySetInnerHTML","__html","bannerMessage","Input","name","handleChange","inputId","inputClass","errorMessage","labelText","Select","onChange","baseClassName","placeholder","options","BookmarksFeaturePopover","_ref$forceVisibility","forceVisibility","countryOptions","countryCode","_ref$gdpr","gdpr","showModal","setShowModal","handleCredentialResponse","response","window","LitCharts","mutex","lock","_textStatus","jqXHR","signup_origin","simplified_signup","email_marketing_optin","_data","location","getResponseHeader","hideAll","console","log","_errorThrown","unlock","prepend","document","on","LcOAuth2","initGoogle","then","google","accounts","prompt","_notification","addClass","off","SignUpModal","signupOrigin","sessionStorageKey","HighlightsAndNotesPopover","_ref$delayInSeconds","delayInSeconds","arrowY","hasViewedPopover","sessionStorage","getItem","searchBtn","querySelector","containerClasses","classnames","extended","setItem","size","authorName","index","includeTags","randomizeBackgrounds","summary","tags","LitCard","_ref$summary","litCards","truncatedSummary","replace","substring","tagColor","tag","handleCardClick","currentTarget","length","onKeyPress","role","tabIndex","map","defaultProps","arrowClass","_props$arrowX","_props$arrowY","children","contentClass","_props$hover","isVisibleFromProps","arrowClasses","_defineProperty","top","bottom","left","right","center","hidden","contentClasses","popoverDiv","current","popoverContainer","parentElement","encapsulatingDiv","hasAttribute","handleClickParent","contains","addEventListener","removeEventListener","handlePopoverParentHover","initialDisplayAmount","guides","useSignedIn","recentlyAddedSelector","BookmarkList","_ref$initialDisplayAm","_ref$includeTags","displayAmount","setDisplayAmount","isDesktopLayout","useMediaQuery","minWidth","SM_PIXEL_MAX","undefined","matches","XXS_PIXEL_MAX","maxWidth","isMobileLayout","useLayoutEffect","canShowMore","setCanShowMore","showMoreAmount","showMoreText","visibleGuides","slice","guide","slug","container","helpers","scrollTo","checkSessionTimeoutEvery","checkSessionTimeoutUrl","keepAliveUrl","signOutUrl","sessionTimeoutUrl","startPollingIn","selectors","MAIN","SessionTimeoutModal","remainingDuration","setRemainingDuration","isRevealed","setIsRevealed","tickInterval","setTickInterval","_useState8","pollInterval","setPollInterval","_useState10","sessionTimeoutTimer","setSessionTimeoutTimer","pollCheckSessionTimeoutLater","reveal","sessionTimeout","clearPollInterval","clearSessionTimeoutTimer","clearTickInterval","hide","setInterval","tick","debugLog","modalDuration","clearInterval","duration","Math","max","delay","pollCheckSessionTimeout","min","interval","checkSessionTimeout","_jqXHR","_console","_len","arguments","message","Array","_key","apply","onHidden","attr","rel","fullErrorMessages","_setFullErrorMessages","submitInProgress","setSubmitInProgress","useRef","form","fullErrorMessagesRef","closeIcon","noValidate","onSubmit","serialize","messages","Object","values","flat","VariantCountrySelect","BirthdayInput","tokenize","infoMessage","label","Checkbox","checked","disabled","position","toast","POSITION","BOTTOM_CENTER","theme","icon","closeOnClick","draggable","extraContent"],"sourceRoot":""}