{"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? \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 & Notes</strong>\n </div>\n <div>\n Once you'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'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 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…\"\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":""}