96327-1b2dc8f6d4db5d81.js.map 132 KB

1
  1. {"version":3,"file":"static/chunks/96327-1b2dc8f6d4db5d81.js","mappings":"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","sources":["webpack://_N_E/./public/icons/chat.svg","webpack://_N_E/./public/icons/menu_more_horiz.svg","webpack://_N_E/./src/components/QuranReader/QuranReflectButton.tsx","webpack://_N_E/./types/QuranReflect/Tab.ts","webpack://_N_E/./src/hooks/useGlobalIntersectionObserverWithDelay.ts","webpack://_N_E/./src/utils/quranReflect/apiPaths.ts","webpack://_N_E/./src/components/QuranReader/ReflectionView/ReflectionBodyContainer/index.tsx","webpack://_N_E/./public/icons/book-open.svg","webpack://_N_E/./src/components/QuranReader/TafsirButton.tsx","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationText/FootnoteText.tsx","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationText/index.tsx","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationViewCellSkeleton.tsx","webpack://_N_E/./src/components/QuranReader/observer.ts","webpack://_N_E/./src/components/Verse/OverflowVerseActionsMenu.tsx","webpack://_N_E/./public/icons/play-outline.svg","webpack://_N_E/./src/components/Verse/PlayVerseAudioButton.tsx","webpack://_N_E/./src/components/dls/ContentModal/ContentModal.tsx","webpack://_N_E/./src/components/dls/Popover/HoverablePopover/index.tsx","webpack://_N_E/./src/components/dls/Popover/index.tsx","webpack://_N_E/./public/icons/translation.svg","webpack://_N_E/./src/components/dls/QuranWord/getToolTipText.tsx","webpack://_N_E/./src/utils/audio.ts","webpack://_N_E/./src/components/dls/QuranWord/playWordAudio.ts","webpack://_N_E/./src/components/QuranReader/ReadingView/TranslationsView/index.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/TranslationsButton/index.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/WordActionsMenu/index.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/WordPopover/index.tsx","webpack://_N_E/./src/components/dls/QuranWord/QuranWord.tsx","webpack://_N_E/./src/hooks/useGetQueryParamOrReduxValue.ts","webpack://_N_E/./src/hooks/useGetQueryParamOrXstateValue.ts","webpack://_N_E/./src/utils/auth/qf/api.ts","webpack://_N_E/./src/utils/auth/qf/apiPaths.ts","webpack://_N_E/./src/utils/query-params.ts","webpack://_N_E/./src/utils/queryParamValidator.ts","webpack://_N_E/./src/xstate/actors/audioPlayer/selectors.ts","webpack://_N_E/./src/components/QuranReader/ReadingView/TranslationsButton/TranslationsButton.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/TranslationsView/TranslationsView.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/WordActionsMenu/WordActionsMenu.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/WordPopover/WordPopover.module.scss","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationText/FootnoteText.module.scss","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationText/TranslationText.module.scss","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationViewCell.module.scss","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationViewSkeleton.module.scss","webpack://_N_E/./src/components/Verse/OverflowVerseActionsMenuBody.module.scss","webpack://_N_E/./src/components/dls/ContentModal/ContentModal.module.scss","webpack://_N_E/./src/components/dls/Popover/Popover.module.scss","webpack://_N_E/./src/components/dls/QuranWord/QuranWord.module.scss"],"sourcesContent":["var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgChat = function SvgChat(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.379 8.379 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })));\n};\nexport default SvgChat;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgMenuMoreHoriz = function SvgMenuMoreHoriz(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2ZM19 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2ZM5 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })));\n};\nexport default SvgMenuMoreHoriz;","import { useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport { useRouter } from 'next/router';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport ContentModal from '@/components/dls/ContentModal/ContentModal';\nimport ReflectionBodyContainer from '@/components/QuranReader/ReflectionView/ReflectionBodyContainer';\nimport styles from '@/components/QuranReader/TranslationView/TranslationViewCell.module.scss';\nimport Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport ChatIcon from '@/icons/chat.svg';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { fakeNavigate, getVerseReflectionNavigationUrl } from '@/utils/navigation';\nimport { getVerseAndChapterNumbersFromKey } from '@/utils/verse';\n\ntype QuranReflectButtonProps = {\n verseKey: string;\n isTranslationView?: boolean;\n onActionTriggered?: () => void;\n};\n\nconst QuranReflectButton = ({\n verseKey,\n isTranslationView = true,\n onActionTriggered,\n}: QuranReflectButtonProps) => {\n const { t, lang } = useTranslation('common');\n const router = useRouter();\n const [isContentModalOpen, setIsContentModalOpen] = useState(false);\n\n const onButtonClicked = () => {\n // eslint-disable-next-line i18next/no-literal-string\n logButtonClick(`${isTranslationView ? 'translation_view' : 'reading_view'}_reflect`);\n setIsContentModalOpen(true);\n fakeNavigate(getVerseReflectionNavigationUrl(verseKey), lang);\n };\n\n const contentModalRef = useRef(null);\n\n const onModalClose = () => {\n setIsContentModalOpen(false);\n fakeNavigate(router.asPath, lang);\n if (onActionTriggered) {\n onActionTriggered();\n }\n };\n\n const [initialChapterId, verseNumber] = getVerseAndChapterNumbersFromKey(verseKey);\n\n return (\n <>\n <Button\n variant={ButtonVariant.Ghost}\n onClick={onButtonClicked}\n size={ButtonSize.Small}\n tooltip={t('reflections')}\n shouldFlipOnRTL={false}\n shape={ButtonShape.Circle}\n className={classNames(\n styles.iconContainer,\n styles.verseAction,\n {\n [styles.fadedVerseAction]: isTranslationView,\n },\n 'reflection-verse-button', // for onboarding\n )}\n ariaLabel={t('quran-reader:aria.read-ayah-refls')}\n >\n <span className={styles.icon}>\n <ChatIcon />\n </span>\n </Button>\n <ReflectionBodyContainer\n initialChapterId={initialChapterId}\n initialVerseNumber={verseNumber}\n scrollToTop={() => {\n contentModalRef.current.scrollToTop();\n }}\n render={({ surahAndAyahSelection, body }) => (\n <ContentModal\n innerRef={contentModalRef}\n isOpen={isContentModalOpen}\n hasCloseButton\n onClose={onModalClose}\n onEscapeKeyDown={onModalClose}\n header={surahAndAyahSelection}\n >\n {body}\n </ContentModal>\n )}\n />\n </>\n );\n};\n\nexport default QuranReflectButton;\n","enum Tab {\n MostPopular = 'most_popular',\n Newest = 'newest',\n Feed = 'feed',\n Public = 'public',\n}\n\nexport default Tab;\n","/* eslint-disable react-func/max-lines-per-function */\nimport { useCallback, useRef } from 'react';\n\nimport useBrowserLayoutEffect from '@/hooks/useBrowserLayoutEffect';\n\nconst isDev = process.env.NEXT_PUBLIC_VERCEL_ENV === 'development';\n\n/**\n * Sets a debugging text to element debugger node if we are in a dev environment\n * and the element debugger paragraph node exists.\n *\n * @param {string} text\n * @param {HTMLElement} intersectionDebuggerNode\n *\n */\nconst setIntersectionDebuggerNodeText = (text: string, intersectionDebuggerNode: HTMLElement) => {\n if (!isDev || !intersectionDebuggerNode) {\n return;\n }\n // eslint-disable-next-line no-param-reassign\n intersectionDebuggerNode.textContent = `OBSERVER DEBUGGER: ${text}`;\n};\n\n/**\n * A hook that will create a global observer and inject it into window so that it's\n * globally available. Once it's created, it can be used by any element that would like\n * to be observed using that observer using {@see useObserverElement} hook. This hook\n * is meant to be used for delayed element visibility callback.\n *\n * @param {IntersectionObserverInit} options\n * @param {(element:Element)=>void} onElementVisible\n * @param {string} observerId the name of the observer\n * @param {string} elementIdKey the key of the unique identifier of each element.\n * @param {string} delayForMSKey the key holding the number of milliseconds after which the observer should trigger the callback\n */\nconst useGlobalIntersectionObserverWithDelay = (\n { threshold = 1, root = null, rootMargin = '0%' }: IntersectionObserverInit,\n onElementVisible: (element: Element) => void,\n observerId: string,\n elementIdKey: string,\n delayForMSKey: string,\n) => {\n /**\n * An object that will hold a reference of each unique identifier and\n * the ID of the timeout function that will trigger when the element\n * is visible for delayForMS number of seconds.\n */\n const timeouts = useRef<Map<any, number>>(new Map());\n const updateEntry = useCallback(\n (entries: IntersectionObserverEntry[]): void => {\n entries.forEach((visibleEntry) => {\n let elementIntersectionDebuggerNode: HTMLElement;\n if (isDev) {\n const nodes = visibleEntry.target.getElementsByClassName('debugger');\n // if at least one debugger node was found (should always be there but just to be extra sure)\n if (nodes.length) {\n elementIntersectionDebuggerNode = nodes[0] as HTMLElement;\n }\n }\n const targetNode = visibleEntry.target as HTMLElement;\n const elementId = targetNode.dataset[elementIdKey];\n const delayForMS = Number(targetNode.dataset[delayForMSKey]);\n // if the element content container is interacting\n if (visibleEntry.isIntersecting) {\n setIntersectionDebuggerNodeText(\n `Element is fully visible, triggering callback in ${delayForMS / 1000} seconds...`,\n elementIntersectionDebuggerNode,\n );\n // Call the API after delayForMS\n timeouts.current.set(\n elementId,\n window.setTimeout(() => {\n onElementVisible(visibleEntry.target);\n setIntersectionDebuggerNodeText(\n `Element callback triggered`,\n elementIntersectionDebuggerNode,\n );\n }, delayForMS),\n );\n } else {\n // if it's no longer intersecting, clear the timeout\n clearTimeout(timeouts.current.get(elementId));\n /**\n * Delete the timeout function's ID from the global array since it's no longer\n * needed and next time if the same element intersects, a new ID will be generated\n * for that element.\n */\n timeouts.current.delete(elementId);\n setIntersectionDebuggerNodeText(\n `Element is not fully visible, won't trigger callback`,\n elementIntersectionDebuggerNode,\n );\n }\n });\n },\n [delayForMSKey, elementIdKey, onElementVisible],\n );\n\n /**\n * We need to assign to window before render is done since we want to the observer to be available by the time rendering is done so that the elements to be observed can use it.\n * {@see https://kentcdodds.com/blog/useeffect-vs-uselayouteffect}\n */\n useBrowserLayoutEffect(() => {\n const hasIOSupport = !!window.IntersectionObserver;\n if (!hasIOSupport) return undefined;\n\n // no need to create a new observer if it already exists.\n if (!window[observerId]) {\n window[observerId] = new IntersectionObserver(updateEntry, {\n threshold,\n root,\n rootMargin,\n });\n }\n return () => {\n // manually clear all the timeouts (if any are still around)\n timeouts.current.forEach((value) => {\n clearTimeout(value);\n });\n if (window[observerId]) {\n window[observerId].disconnect();\n window[observerId] = undefined;\n }\n };\n }, [root, rootMargin, threshold, updateEntry, observerId]);\n};\n\nexport default useGlobalIntersectionObserverWithDelay;\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { fetcher } from '@/api';\nimport stringify from '@/utils/qs-stringify';\nimport AyahReflectionsRequestParams from 'types/QuranReflect/AyahReflectionsRequestParams';\nimport AyahReflectionsResponse from 'types/QuranReflect/AyahReflectionsResponse';\nimport Tab from 'types/QuranReflect/Tab';\n\nconst STAGING_API_HOST = 'https://quranreflect.org';\nconst PRODUCTION_API_HOST = 'https://quranreflect.com';\nconst isProd = process.env.NEXT_PUBLIC_VERCEL_ENV === 'production';\n\n// env variables in Vercel can't be dynamic, we have to hardcode the urls here. https://stackoverflow.com/questions/44342226/next-js-error-only-absolute-urls-are-supported\nexport const API_HOST = isProd ? PRODUCTION_API_HOST : STAGING_API_HOST;\n\nexport const makeQuranReflectApiUrl = (path: string, parameters = {}): string => {\n const params = {\n client_auth_token: process.env.NEXT_PUBLIC_QURAN_REFLECT_TOKEN,\n ...parameters,\n };\n return `${API_HOST}/${path}?${stringify(params)}`;\n};\n\n/* eslint-disable import/prefer-default-export */\nexport const makeAyahReflectionsUrl = ({\n surahId,\n ayahNumber,\n locale,\n page = 1,\n tab = Tab.MostPopular,\n}: AyahReflectionsRequestParams) => {\n const surahNumber = Number(surahId) + 1;\n return makeQuranReflectApiUrl('posts.json', {\n 'q[filters_attributes][0][chapter_id]': surahNumber,\n 'q[filters_attributes][0][from]': ayahNumber,\n 'q[filters_attributes][0][to]': ayahNumber,\n 'q[filters_operation]': 'OR',\n page,\n tab,\n lang: locale,\n feed: true,\n });\n};\n\nconst makeReflectionViewsUrl = (postId: string) => {\n return makeQuranReflectApiUrl(`v1/posts/${postId}/views`);\n};\n\nexport const postReflectionViews = async (postId: string): Promise<AyahReflectionsResponse> =>\n fetcher(makeReflectionViewsUrl(postId), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\nexport const getAyahReflections = async (\n ayahReflectionsUrl: string,\n): Promise<AyahReflectionsResponse> => fetcher(ayahReflectionsUrl);\n","import { useCallback, useState } from 'react';\n\nimport dynamic from 'next/dynamic';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport DataFetcher from '@/components/DataFetcher';\nimport { REFLECTIONS_OBSERVER_ID } from '@/components/QuranReader/observer';\nimport TafsirSkeleton from '@/components/QuranReader/TafsirView/TafsirSkeleton';\nimport useGlobalIntersectionObserverWithDelay from '@/hooks/useGlobalIntersectionObserverWithDelay';\nimport { isLoggedIn } from '@/utils/auth/login';\nimport { postReflectionViews } from '@/utils/auth/qf/api';\nimport {\n makeAyahReflectionsUrl,\n postReflectionViews as postReflectionViewsToQuranReflect,\n} from '@/utils/quranReflect/apiPaths';\nimport AyahReflectionsResponse from 'types/QuranReflect/AyahReflectionsResponse';\n\nconst ReflectionSurahAndAyahSelection = dynamic(() => import('./ReflectionSurahAndAyahSelection'), {\n ssr: false,\n});\nconst ReflectionBody = dynamic(() => import('./ReflectionBody'), {\n ssr: false,\n loading: TafsirSkeleton,\n});\n\ntype ReflectionBodyProps = {\n initialChapterId: string;\n initialVerseNumber: string;\n scrollToTop: () => void;\n render: (renderProps: { surahAndAyahSelection: JSX.Element; body: JSX.Element }) => JSX.Element;\n};\n\nconst ReflectionBodyContainer = ({\n render,\n initialChapterId,\n initialVerseNumber,\n scrollToTop,\n}: ReflectionBodyProps) => {\n const [selectedChapterId, setSelectedChapterId] = useState(initialChapterId);\n const [selectedVerseNumber, setSelectedVerseNumber] = useState(initialVerseNumber);\n const { lang } = useTranslation();\n\n /**\n * Handle when the reflection is viewed:\n *\n * 1. If the user is logged in, we will call QDC's backend API.\n * 2. Otherwise, we will call QR's API directly.\n */\n const onReflectionViewed = useCallback((reflectionContainer: Element) => {\n const postId = reflectionContainer.getAttribute('data-post-id');\n if (isLoggedIn()) {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n postReflectionViews(postId).catch(() => {});\n } else {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n postReflectionViewsToQuranReflect(postId).catch(() => {});\n }\n }, []);\n useGlobalIntersectionObserverWithDelay(\n { threshold: 1 },\n onReflectionViewed,\n REFLECTIONS_OBSERVER_ID,\n 'postId',\n 'countAsViewedAfter',\n );\n\n const renderBody = useCallback(\n (data: AyahReflectionsResponse) => (\n <ReflectionBody\n data={data}\n selectedChapterId={selectedChapterId}\n selectedVerseNumber={selectedVerseNumber}\n setSelectedVerseNumber={setSelectedVerseNumber}\n scrollToTop={scrollToTop}\n />\n ),\n [scrollToTop, selectedChapterId, selectedVerseNumber],\n );\n\n const body = (\n <DataFetcher\n loading={TafsirSkeleton}\n queryKey={makeAyahReflectionsUrl({\n surahId: selectedChapterId,\n ayahNumber: selectedVerseNumber,\n locale: lang,\n })}\n render={renderBody}\n />\n );\n\n return render({\n surahAndAyahSelection: (\n <ReflectionSurahAndAyahSelection\n selectedChapterId={selectedChapterId}\n selectedVerseNumber={selectedVerseNumber}\n setSelectedChapterId={setSelectedChapterId}\n setSelectedVerseNumber={setSelectedVerseNumber}\n />\n ),\n body,\n });\n};\n\nexport default ReflectionBodyContainer;\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgBookOpen = function SvgBookOpen(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n className: \"feather feather-book-open\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2zM22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"\n })));\n};\nexport default SvgBookOpen;","import { useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport { useRouter } from 'next/router';\nimport useTranslation from 'next-translate/useTranslation';\nimport { useSelector } from 'react-redux';\n\nimport ContentModal from '@/components/dls/ContentModal/ContentModal';\nimport TafsirBody from '@/components/QuranReader/TafsirView/TafsirBody';\nimport styles from '@/components/QuranReader/TranslationView/TranslationViewCell.module.scss';\nimport Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport TafsirIcon from '@/icons/book-open.svg';\nimport { selectSelectedTafsirs } from '@/redux/slices/QuranReader/tafsirs';\nimport { logButtonClick, logEvent } from '@/utils/eventLogger';\nimport { fakeNavigate, getVerseSelectedTafsirNavigationUrl } from '@/utils/navigation';\nimport { getVerseAndChapterNumbersFromKey } from '@/utils/verse';\n\ntype Props = {\n verseKey: string;\n isTranslationView?: boolean;\n onActionTriggered?: () => void;\n};\n\nconst TafsirButton: React.FC<Props> = ({\n verseKey,\n isTranslationView = true,\n onActionTriggered,\n}) => {\n const { t, lang } = useTranslation('common');\n const router = useRouter();\n const tafsirs = useSelector(selectSelectedTafsirs);\n const [isContentModalOpen, setIsContentModalOpen] = useState(false);\n const [chapterId, verseNumber] = getVerseAndChapterNumbersFromKey(verseKey);\n\n const onButtonClicked = () => {\n logButtonClick(\n `${isTranslationView ? 'translation_view' : 'reading_view'}_verse_actions_menu_tafsir`,\n );\n setIsContentModalOpen(true);\n fakeNavigate(\n getVerseSelectedTafsirNavigationUrl(chapterId, Number(verseNumber), tafsirs[0]),\n lang,\n );\n };\n\n const contentModalRef = useRef(null);\n\n const onModalClose = () => {\n if (isTranslationView) {\n logEvent('translation_view_tafsir_modal_close');\n } else {\n logEvent('reading_view_tafsir_modal_close');\n }\n setIsContentModalOpen(false);\n fakeNavigate(router.asPath, router.locale);\n if (onActionTriggered) {\n onActionTriggered();\n }\n };\n\n return (\n <>\n <Button\n variant={ButtonVariant.Ghost}\n onClick={onButtonClicked}\n size={ButtonSize.Small}\n tooltip={t('quran-reader:tafsirs')}\n shouldFlipOnRTL={false}\n shape={ButtonShape.Circle}\n className={classNames(\n styles.iconContainer,\n styles.verseAction,\n {\n [styles.fadedVerseAction]: isTranslationView,\n },\n 'tafsir-verse-button', // for onboarding\n )}\n ariaLabel={t('quran-reader:aria.read-tafsirs')}\n >\n <span className={styles.icon}>\n <TafsirIcon />\n </span>\n </Button>\n <TafsirBody\n shouldRender={isContentModalOpen}\n initialChapterId={chapterId.toString()}\n initialVerseNumber={verseNumber.toString()}\n scrollToTop={() => {\n contentModalRef.current.scrollToTop();\n }}\n render={({ body, languageAndTafsirSelection, surahAndAyahSelection }) => {\n return (\n <ContentModal\n innerRef={contentModalRef}\n isOpen={isContentModalOpen}\n hasCloseButton\n onClose={onModalClose}\n onEscapeKeyDown={onModalClose}\n header={surahAndAyahSelection}\n >\n {languageAndTafsirSelection}\n {body}\n </ContentModal>\n );\n }}\n />\n </>\n );\n};\n\nexport default TafsirButton;\n","/* eslint-disable react/no-danger */\n\nimport React, { MouseEvent } from 'react';\n\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from './FootnoteText.module.scss';\nimport transStyles from './TranslationText.module.scss';\n\nimport Button, { ButtonSize, ButtonShape, ButtonVariant } from '@/dls/Button/Button';\nimport Spinner from '@/dls/Spinner/Spinner';\nimport CloseIcon from '@/icons/close.svg';\nimport { getLanguageDataById, findLanguageIdByLocale } from '@/utils/locale';\nimport Footnote from 'types/Footnote';\n\ninterface FootnoteTextProps {\n footnoteName?: string; // can be a number or a string (e.g. \"sg\" or \"pl\")\n footnote: Footnote;\n onCloseClicked: () => void;\n onTextClicked?: (event: MouseEvent, isSubFootnote?: boolean) => void;\n isLoading?: boolean;\n}\n\nconst FootnoteText: React.FC<FootnoteTextProps> = ({\n footnoteName,\n footnote,\n onCloseClicked,\n onTextClicked,\n isLoading,\n}) => {\n const { t, lang } = useTranslation('quran-reader');\n\n const languageId = footnote?.languageId || findLanguageIdByLocale(lang);\n const landData = getLanguageDataById(languageId);\n\n return (\n <div className={styles.footnoteContainer}>\n <div className={styles.header}>\n <p>\n {t('footnote')} {footnoteName ? `- ${footnoteName}` : null}\n </p>\n <Button\n size={ButtonSize.Small}\n variant={ButtonVariant.Ghost}\n shape={ButtonShape.Circle}\n onClick={onCloseClicked}\n >\n <CloseIcon />\n </Button>\n </div>\n {isLoading ? (\n <Spinner />\n ) : (\n <div\n className={classNames(\n styles.text,\n transStyles[landData.direction],\n transStyles[landData.font],\n )}\n dangerouslySetInnerHTML={{ __html: footnote.text }}\n {...(onTextClicked && { onClick: onTextClicked })}\n />\n )}\n </div>\n );\n};\n\nexport default FootnoteText;\n","/* eslint-disable react-func/max-lines-per-function */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable react/no-danger */\n\nimport React, { MouseEvent, useState } from 'react';\n\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport FootnoteText from './FootnoteText';\nimport styles from './TranslationText.module.scss';\n\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { getLanguageDataById } from '@/utils/locale';\nimport { getFootnote } from 'src/api';\nimport Footnote from 'types/Footnote';\n\ninterface Props {\n translationFontScale: number;\n text: string;\n resourceName?: string;\n languageId: number;\n}\n\nconst TranslationText: React.FC<Props> = ({\n translationFontScale,\n text,\n languageId,\n resourceName,\n}) => {\n const { t } = useTranslation('quran-reader');\n const [isLoading, setIsLoading] = useState(false);\n const [showFootnote, setShowFootnote] = useState(true);\n const [footnote, setFootnote] = useState<Footnote>(null);\n const [activeFootnoteName, setActiveFootnoteName] = useState<string | null>(null);\n const [activeSubFootnoteName, setActiveSubFootnoteName] = useState<string | null>(null);\n const [subFootnote, setSubFootnote] = useState<Footnote>(null);\n\n const PRE_DEFINED_FOOTNOTES = {\n sg: t('footnote-sg'),\n pl: t('footnote-pl'),\n dl: t('footnote-dl'),\n };\n\n const resetFootnote = () => {\n setFootnote(null);\n setSubFootnote(null);\n setIsLoading(false);\n setActiveFootnoteName(null);\n setActiveSubFootnoteName(null);\n };\n\n const resetSubFootnote = () => {\n setSubFootnote(null);\n setActiveSubFootnoteName(null);\n };\n\n /**\n * Handle when the translation text is clicked. This is needed to handle when a footnote\n * is clicked since we receive the translation text as HTML from BE. Any footnote will\n * be inside an <sup>...</sup> element. so when the translation container is clicked\n * we check whether the clicked element is of tag name SUP and if so, we handle showing the\n * footnote as following:\n *\n * 1. If it's not a sub-footnote (a footnote inside a footnote) which is all translations\n * except Bridge's Foundation translation:\n * 1. check if the sup element has foot_note attribute (the ID) and if it has:\n * 1. Check if we already have a footnote in the local state with the same ID:\n * 1. if yes, it means this is the second time the user clicks on the\n * footnote so we should close the footnote.\n * 2. if no, it means we need to call BE to fetch the footnote text by its ID.\n * 2. if not, it means it's a pre-defined footnote and in this case, we access the text\n * inside the element and check if it's in the list of pre-defined footnotes and if it\n * is, we get the value from the pre-defined footnotes and assign it as the footnote\n * text without having to call BE (only happens with Bridge's Foundation translation)\n * 2. If it's a sub-footnote it will only have pre-defined footnotes so we handle it the same\n * way as above (only happens with Bridge's Foundation translation, ex: Surah 30, Verse 11).\n *\n * @param {MouseEvent} event\n * @param {boolean} isSubFootnote whether we are handling a footnote or a sub-footnote (only happens\n * with Bridge's Foundation translation).\n */\n const onTextClicked = (event: MouseEvent, isSubFootnote = false) => {\n const target = event.target as HTMLElement;\n\n // if we just clicked on anything other than a footnote element, return early.\n if (target.tagName !== 'SUP') {\n return;\n }\n // we get the text inside the sup element and trim the extra spaces.\n const footnoteText = target.innerText.trim();\n\n // if it's the main footnote and not the sub footnote.\n if (!isSubFootnote) {\n const footNoteId = target.getAttribute('foot_note');\n\n // Set the activeFootnoteNumber to the current number of the footnote from the <sup> innerHTML\n setActiveFootnoteName(footnoteText);\n\n // if it's the normal case that needs us to call BE and not a fixed footnote like the ones found for Bridge's translation.\n if (footNoteId) {\n // if this is the second time to click the footnote, close it\n if (showFootnote && footnote && footnote.id === Number(footNoteId)) {\n logButtonClick('translation_footnote_double_click_to_close');\n resetFootnote();\n } else {\n logButtonClick('translation_show_footnote');\n resetSubFootnote();\n setShowFootnote(true);\n setIsLoading(true);\n getFootnote(footNoteId)\n .then((res) => {\n if (res.status !== 500) {\n setFootnote(res.footNote);\n }\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n } else if (footnote && footnote.id === footnoteText) {\n // if this is the second time we are clicking on the footnote, we close it.\n logButtonClick('translation_pre_defined_footnote_double_click_to_close');\n resetFootnote();\n } else if (PRE_DEFINED_FOOTNOTES[footnoteText]) {\n logButtonClick('translation_pre_defined_footnote');\n resetSubFootnote();\n setFootnote({\n id: footnoteText,\n text: PRE_DEFINED_FOOTNOTES[footnoteText],\n });\n }\n } else {\n // Set the activeSubFootnoteNumber to the current number of the footnote from the <sup> innerHTML\n setActiveSubFootnoteName(footnoteText);\n\n const subFootnoteId = `${footnote.id} - ${footnoteText}`;\n // if this is the second time we are clicking on the sub footnote, we close it.\n if (subFootnote && subFootnote.id === subFootnoteId) {\n logButtonClick('translation_sub_footnote_double_click_to_close');\n resetSubFootnote();\n } else if (PRE_DEFINED_FOOTNOTES[footnoteText]) {\n logButtonClick('translation_show_sub_footnote');\n setSubFootnote({\n id: subFootnoteId,\n text: PRE_DEFINED_FOOTNOTES[footnoteText],\n });\n }\n }\n };\n const hideFootnote = () => setShowFootnote(false);\n const langData = getLanguageDataById(languageId);\n\n const shouldShowFootnote = showFootnote && (footnote || isLoading);\n return (\n <div className={styles[`translation-font-size-${translationFontScale}`]}>\n <div\n onClick={(event) => onTextClicked(event)}\n className={classNames(styles.text, styles[langData.direction], styles[langData.font])}\n dangerouslySetInnerHTML={{ __html: text }}\n />\n {shouldShowFootnote && (\n <FootnoteText\n footnoteName={activeFootnoteName || undefined}\n footnote={footnote}\n isLoading={isLoading}\n onCloseClicked={() => {\n logButtonClick('translation_footnote_close');\n if (isLoading) {\n hideFootnote();\n } else {\n resetFootnote();\n }\n }}\n onTextClicked={(event) => onTextClicked(event, true)}\n />\n )}\n {subFootnote && (\n <FootnoteText\n footnoteName={activeSubFootnoteName || undefined}\n footnote={subFootnote}\n onCloseClicked={resetSubFootnote}\n />\n )}\n {resourceName && (\n <p\n className={classNames(\n styles.translationName,\n styles[langData.direction],\n styles[langData.font],\n )}\n // eslint-disable-next-line i18next/no-literal-string\n >\n — {resourceName}\n </p>\n )}\n </div>\n );\n};\n\nexport default TranslationText;\n","import classNames from 'classnames';\nimport range from 'lodash/range';\nimport { useSelector, shallowEqual } from 'react-redux';\n\nimport cellStyles from './TranslationViewCell.module.scss';\nimport skeletonStyles from './TranslationViewSkeleton.module.scss';\n\nimport verseTextStyles from '@/components/Verse/VerseText.module.scss';\nimport Button, { ButtonSize } from '@/dls/Button/Button';\nimport Skeleton from '@/dls/Skeleton/Skeleton';\nimport useGetQueryParamOrReduxValue from '@/hooks/useGetQueryParamOrReduxValue';\nimport { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles';\nimport { getFontClassName } from '@/utils/fontFaceHelper';\nimport QueryParam from 'types/QueryParam';\nimport { QuranFont } from 'types/QuranReader';\n\nconst TRANSLATION_TEXT_SAMPLE =\n 'He has revealed to you ˹O Prophet˺ the Book in truth, confirming what came before it, as He revealed the Torah and the Gospel';\nconst TRANSLATION_AUTHOR_SAMPLE = '— Dr. Mustafa Khattab, the Clear Quran';\n\ninterface Props {\n hasActionMenuItems?: boolean;\n}\n\nconst TranslationViewCellSkeleton: React.FC<Props> = ({ hasActionMenuItems = true }) => {\n const { value: selectedTranslations }: { value: number[] } = useGetQueryParamOrReduxValue(\n QueryParam.Translations,\n );\n const { quranFont, quranTextFontScale, translationFontScale, mushafLines } = useSelector(\n selectQuranReaderStyles,\n shallowEqual,\n );\n\n const isTajweedFont = quranFont === QuranFont.Tajweed;\n\n return (\n <div className={classNames(cellStyles.cellContainer, skeletonStyles.cellContainer)}>\n <div className={cellStyles.actionContainer}>\n <div className={cellStyles.actionContainerLeft}>\n {range(0, 4).map((index) => (\n <Skeleton key={index} className={skeletonStyles.actionItem}>\n <Button size={ButtonSize.Small} />\n </Skeleton>\n ))}\n </div>\n {hasActionMenuItems && (\n <div className={cellStyles.actionContainerRight}>\n <Skeleton className={cellStyles.actionItem}>\n <Button size={ButtonSize.Small} />\n </Skeleton>\n </div>\n )}\n </div>\n\n {/* We're not using VersePreview as Skeleton's children here \n because it has layout shift problem when loading the font. Which is not ideal for skeleton */}\n <div className={cellStyles.contentContainer}>\n <Skeleton\n className={classNames(skeletonStyles.verseContainer, cellStyles.arabicVerseContainer, {\n [verseTextStyles[getFontClassName(quranFont, quranTextFontScale, mushafLines)]]:\n !isTajweedFont,\n })}\n />\n <div\n className={classNames(\n cellStyles.verseTranslationsContainer,\n skeletonStyles[`translation-font-size-${translationFontScale}`],\n )}\n >\n {selectedTranslations.map((translation) => (\n <span key={translation}>\n <div>\n <Skeleton className={classNames(skeletonStyles.translationText)}>\n {TRANSLATION_TEXT_SAMPLE}\n </Skeleton>\n </div>\n <div>\n <Skeleton className={classNames(skeletonStyles.translationAuthor)}>\n {TRANSLATION_AUTHOR_SAMPLE}\n </Skeleton>\n </div>\n </span>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default TranslationViewCellSkeleton;\n","/**\n * The top -131.6px was calculated based on:\n *\n * 1. the height of emptySpacePlaceholder of navbar (3.6rem).\n * 2. the top padding of the QuranReader container (2rem).\n * 3. the top and bottom margin of the ReadingPreferenceSwitcher container (1.625rem).\n * 4. the top margin of the TranslationView container (1rem).\n *\n * and the total is 8.225rem around 131.6 pixels.\n */\nconst DEFAULT_ROOT_MARGIN = '-131.6px 0px -68% 0px';\nconst OBSERVER_THRESHOLD = 0.1;\nexport const QURAN_READER_OBSERVER_ID = 'quranReaderObserver';\nexport const REFLECTIONS_OBSERVER_ID = 'reflectionsObserver';\n/**\n * the top -115.6px was calculated based on:\n *\n * 1. the height of emptySpacePlaceholder of navbar (3.6rem).\n * 2. the top padding of the QuranReader container (2rem).\n * 3. the top and bottom margin of the ReadingPreferenceSwitcher container (1.625rem).\n *\n * and the total is 7.225rem around 115.6 pixels.\n */\nconst READING_MODE_ROOT_MARGIN = '-115.6px 0px -70% 0px';\n\n/**\n * Get the observer options based on the reading preference.\n *\n * @param {boolean} isReadingPreference\n * @returns {{rootMargin: string, threshold: number | number[]}}\n */\nexport const getOptions = (\n isReadingPreference: boolean,\n): { rootMargin: string; threshold: number | number[] } => ({\n rootMargin: isReadingPreference ? READING_MODE_ROOT_MARGIN : DEFAULT_ROOT_MARGIN,\n threshold: OBSERVER_THRESHOLD,\n});\n\n/**\n * Get the payload that will be dispatched to Redux to set the last read verse.\n *\n * @param {Element} element\n * @returns {{verseKey: string,chapterId: string,page: string,hizb: string}}\n */\nexport const getObservedVersePayload = (\n element: Element,\n): { verseKey: string; chapterId: string; page: string; hizb: string } => ({\n verseKey: element.getAttribute('data-verse-key'),\n chapterId: element.getAttribute('data-chapter-id'),\n page: element.getAttribute('data-page'),\n hizb: element.getAttribute('data-hizb'),\n});\n","/* eslint-disable react/no-multi-comp */\nimport React from 'react';\n\nimport classNames from 'classnames';\nimport dynamic from 'next/dynamic';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport cellStyles from '../QuranReader/TranslationView/TranslationViewCell.module.scss';\n\nimport styles from './OverflowVerseActionsMenuBody.module.scss';\n\nimport Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport PopoverMenu from '@/dls/PopoverMenu/PopoverMenu';\nimport Spinner from '@/dls/Spinner/Spinner';\nimport OverflowMenuIcon from '@/icons/menu_more_horiz.svg';\nimport { logEvent } from '@/utils/eventLogger';\nimport Verse from 'types/Verse';\n\nconst OverflowVerseActionsMenuBody = dynamic(() => import('./OverflowVerseActionsMenuBody'), {\n ssr: false,\n loading: () => <Spinner />,\n});\n\ninterface Props {\n verse: Verse;\n isTranslationView?: boolean;\n onActionTriggered?: () => void;\n bookmarksRangeUrl?: string;\n}\n\nconst OverflowVerseActionsMenu: React.FC<Props> = ({\n verse,\n isTranslationView = true,\n onActionTriggered,\n bookmarksRangeUrl,\n}) => {\n const { t } = useTranslation('common');\n return (\n <div className={styles.container}>\n <PopoverMenu\n trigger={\n <Button\n size={ButtonSize.Small}\n tooltip={t('more')}\n variant={ButtonVariant.Ghost}\n shape={ButtonShape.Circle}\n className={classNames(\n cellStyles.iconContainer,\n cellStyles.verseAction,\n {\n [cellStyles.fadedVerseAction]: isTranslationView,\n },\n 'overflow-verse-actions-menu-trigger', // for onboarding\n )}\n ariaLabel={t('more')}\n >\n <span className={cellStyles.icon}>\n <OverflowMenuIcon />\n </span>\n </Button>\n }\n isModal\n isPortalled\n onOpenChange={(open: boolean) => {\n logEvent(\n `${isTranslationView ? 'translation_view' : 'reading_view'}_verse_actions_menu_${\n open ? 'open' : 'close'\n }`,\n );\n }}\n >\n <OverflowVerseActionsMenuBody\n verse={verse}\n isTranslationView={isTranslationView}\n onActionTriggered={onActionTriggered}\n bookmarksRangeUrl={bookmarksRangeUrl}\n />\n </PopoverMenu>\n </div>\n );\n};\n\nexport default OverflowVerseActionsMenu;\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgPlayOutline = function SvgPlayOutline(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m5 3 14 9-14 9V3Z\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })));\n};\nexport default SvgPlayOutline;","import React, { useCallback, useContext, useEffect } from 'react';\n\nimport { useSelector, useSelector as useXstateSelector } from '@xstate/react';\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from '../QuranReader/TranslationView/TranslationViewCell.module.scss';\n\nimport Spinner from '@/components/dls/Spinner/Spinner';\nimport OnboardingEvent from '@/components/Onboarding/OnboardingChecklist/hooks/OnboardingEvent';\nimport { useOnboarding } from '@/components/Onboarding/OnboardingProvider';\nimport Button, { ButtonShape, ButtonSize, ButtonType, ButtonVariant } from '@/dls/Button/Button';\nimport useGetQueryParamOrXstateValue from '@/hooks/useGetQueryParamOrXstateValue';\nimport PlayIcon from '@/icons/play-outline.svg';\nimport OnboardingGroup from '@/types/OnboardingGroup';\nimport QueryParam from '@/types/QueryParam';\nimport { getChapterData } from '@/utils/chapter';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { getChapterNumberFromKey, getVerseNumberFromKey } from '@/utils/verse';\nimport DataContext from 'src/contexts/DataContext';\nimport { selectIsVerseLoading } from 'src/xstate/actors/audioPlayer/selectors';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\n\ninterface PlayVerseAudioProps {\n verseKey: string;\n isTranslationView?: boolean;\n onActionTriggered?: () => void;\n}\nconst PlayVerseAudioButton: React.FC<PlayVerseAudioProps> = ({\n verseKey,\n isTranslationView = true,\n onActionTriggered,\n}) => {\n const audioService = useContext(AudioPlayerMachineContext);\n const { t } = useTranslation('common');\n const {\n value: reciterId,\n isQueryParamDifferent: reciterQueryParamDifferent,\n }: { value: number; isQueryParamDifferent: boolean } = useGetQueryParamOrXstateValue(\n QueryParam.Reciter,\n );\n const isVisible = useSelector(audioService, (state) => state.matches('VISIBLE'));\n const { isActive, activeStepGroup, nextStep } = useOnboarding();\n\n const isVerseLoading = useXstateSelector(audioService, (state) =>\n selectIsVerseLoading(state, verseKey),\n );\n const chapterId = getChapterNumberFromKey(verseKey);\n const verseNumber = getVerseNumberFromKey(verseKey);\n const chaptersData = useContext(DataContext);\n const chapterData = getChapterData(chaptersData, chapterId.toString());\n\n const onPlayClicked = useCallback(() => {\n // eslint-disable-next-line i18next/no-literal-string\n logButtonClick(`${isTranslationView ? 'translation_view' : 'reading_view'}_play_verse`);\n\n audioService.send({\n type: 'PLAY_AYAH',\n surah: chapterId,\n ayahNumber: verseNumber,\n reciterId: reciterQueryParamDifferent ? reciterId : undefined,\n });\n\n if (onActionTriggered) {\n onActionTriggered();\n }\n\n // if the user clicks on the play button while the onboarding is active, we should automatically go to the next step\n if (isActive && activeStepGroup === OnboardingGroup.READING_EXPERIENCE && isVisible) {\n // audio player menu item step\n nextStep();\n }\n }, [\n activeStepGroup,\n audioService,\n chapterId,\n isActive,\n isTranslationView,\n isVisible,\n nextStep,\n onActionTriggered,\n reciterId,\n reciterQueryParamDifferent,\n verseNumber,\n ]);\n\n useEffect(() => {\n const handlePlayAudioStep = () => {\n onPlayClicked();\n };\n\n window.addEventListener(OnboardingEvent.STEP_AFTER_PLAY_AUDIO_CLICK, handlePlayAudioStep);\n\n return () => {\n window.removeEventListener(OnboardingEvent.STEP_AFTER_PLAY_AUDIO_CLICK, handlePlayAudioStep);\n };\n }, [nextStep, onPlayClicked]);\n\n if (isVerseLoading) {\n return (\n <Button\n size={ButtonSize.Small}\n tooltip={t('loading')}\n type={ButtonType.Success}\n shape={ButtonShape.Circle}\n variant={ButtonVariant.Ghost}\n className=\"play-audio-button\" // this class is for onboarding\n >\n <Spinner />\n </Button>\n );\n }\n\n return (\n <Button\n size={ButtonSize.Small}\n tooltip={t('audio.player.play')}\n variant={ButtonVariant.Ghost}\n onClick={onPlayClicked}\n shouldFlipOnRTL={false}\n shape={ButtonShape.Circle}\n id=\"play-verse-button\" // this ID is for onboarding\n className={classNames(styles.iconContainer, styles.verseAction, {\n [styles.fadedVerseAction]: isTranslationView,\n })}\n ariaLabel={t('aria.play-surah', { surahName: chapterData.transliteratedName })}\n >\n <span className={classNames(styles.icon, styles.playIcon)}>\n <PlayIcon />\n </span>\n </Button>\n );\n};\nexport default PlayVerseAudioButton;\n","import { useRef, useImperativeHandle, ForwardedRef } from 'react';\n\nimport * as Dialog from '@radix-ui/react-dialog';\nimport classNames from 'classnames';\nimport { useRouter } from 'next/router';\n\nimport Button, { ButtonShape, ButtonVariant } from '../Button/Button';\n\nimport styles from './ContentModal.module.scss';\n\nimport ContentModalHandles from '@/dls/ContentModal/types/ContentModalHandles';\nimport CloseIcon from '@/icons/close.svg';\nimport { isRTLLocale } from '@/utils/locale';\n\nexport enum ContentModalSize {\n SMALL = 'small',\n MEDIUM = 'medium',\n}\n\ntype ContentModalProps = {\n isOpen?: boolean;\n onClose?: () => void;\n onEscapeKeyDown?: () => void;\n children: React.ReactNode;\n hasCloseButton?: boolean;\n hasHeader?: boolean;\n header?: React.ReactNode;\n innerRef?: ForwardedRef<ContentModalHandles>;\n // using innerRef instead of using function forwardRef so we can dynamically load this component https://github.com/vercel/next.js/issues/4957#issuecomment-413841689\n contentClassName?: string;\n size?: ContentModalSize;\n isFixedHeight?: boolean;\n};\n\nconst SCROLLBAR_WIDTH = 15;\n\nconst ContentModal = ({\n isOpen,\n onClose,\n onEscapeKeyDown,\n hasCloseButton,\n children,\n header,\n innerRef,\n contentClassName,\n size = ContentModalSize.MEDIUM,\n isFixedHeight,\n hasHeader = true,\n}: ContentModalProps) => {\n const overlayRef = useRef<HTMLDivElement>();\n const { locale } = useRouter();\n\n useImperativeHandle(innerRef, () => ({\n scrollToTop: () => {\n if (overlayRef.current) overlayRef.current.scrollTop = 0;\n },\n }));\n\n /**\n * We need to manually check what the user is targeting. If it lies at the\n * area where the scroll bar is (assuming the scrollbar width is equivalent\n * to SCROLLBAR_WIDTH), then we don't close the Modal, otherwise we do.\n * We also need to check if the current locale is RTL or LTR because the side\n * where the scrollbar is will be different and therefor the value of\n * {e.detail.originalEvent.offsetX} will be different.\n *\n * inspired by {@see https://github.com/radix-ui/primitives/issues/1280#issuecomment-1198248523}\n *\n * @param {any} e\n */\n const onPointerDownOutside = (e: any) => {\n const currentTarget = e.currentTarget as HTMLElement;\n\n const shouldPreventOnClose = isRTLLocale(locale)\n ? e.detail.originalEvent.offsetX < SCROLLBAR_WIDTH // left side of the screen clicked\n : e.detail.originalEvent.offsetX > currentTarget.clientWidth - SCROLLBAR_WIDTH; // right side of the screen clicked\n\n if (shouldPreventOnClose) {\n e.preventDefault();\n return;\n }\n if (onClose) {\n onClose();\n }\n };\n\n return (\n <Dialog.Root open={isOpen}>\n <Dialog.Portal>\n <Dialog.Overlay className={styles.overlay} ref={overlayRef}>\n <Dialog.Content\n className={classNames(styles.contentWrapper, {\n [contentClassName]: contentClassName,\n [styles.small]: size === ContentModalSize.SMALL,\n [styles.medium]: size === ContentModalSize.MEDIUM,\n [styles.autoHeight]: !isFixedHeight,\n })}\n onEscapeKeyDown={onEscapeKeyDown}\n onPointerDownOutside={onPointerDownOutside}\n >\n {hasHeader && (\n <div className={styles.header}>\n {hasCloseButton && (\n <Dialog.Close className={styles.closeIcon}>\n <Button\n variant={ButtonVariant.Ghost}\n shape={ButtonShape.Circle}\n onClick={onClose}\n >\n <CloseIcon />\n </Button>\n </Dialog.Close>\n )}\n {header}\n </div>\n )}\n\n <div className={styles.content}>{children}</div>\n </Dialog.Content>\n </Dialog.Overlay>\n </Dialog.Portal>\n </Dialog.Root>\n );\n};\nexport default ContentModal;\n","import React, { ReactNode } from 'react';\n\nimport Popover, { ContentSide } from '@/dls/Popover';\nimport Tooltip from '@/dls/Tooltip';\n\ninterface Props {\n content: ReactNode;\n children: ReactNode | ReactNode[];\n contentSide?: ContentSide;\n tip?: boolean;\n tooltipDelay?: number;\n onOpenChange?: (open: boolean) => void;\n defaultStyling?: boolean;\n isOpen?: boolean;\n triggerStyles?: string;\n isContainerSpan?: boolean;\n}\n\n/**\n * A component that combines the functionality of a Popover and a Tooltip together.\n * This is needed to handle the case when we want to show a Tooltip on mobile but\n * since Tooltip is only hoverable and there is no hovering on mobile devices,\n * we provide the same functionality by using a Popover which handles clicking.\n *\n * @param {Props} props\n * @returns {JSX.Element}\n */\nconst HoverablePopover: React.FC<Props> = ({\n content,\n children,\n onOpenChange,\n contentSide = ContentSide.TOP,\n tip = true,\n tooltipDelay = 0,\n defaultStyling = true,\n isOpen,\n triggerStyles,\n isContainerSpan = false,\n}: Props): JSX.Element => (\n <Popover\n open={isOpen}\n triggerStyles={triggerStyles}\n contentSide={contentSide}\n useTooltipStyles\n {...(onOpenChange && { onOpenChange })}\n defaultStyling={defaultStyling}\n isContainerSpan={isContainerSpan}\n trigger={\n <Tooltip\n open={isOpen}\n tip={tip}\n text={content}\n contentSide={contentSide}\n delay={tooltipDelay}\n {...(onOpenChange && { onOpenChange })}\n >\n {children}\n </Tooltip>\n }\n tip={tip}\n >\n {content}\n </Popover>\n);\n\nexport default HoverablePopover;\n","import React, { ReactNode } from 'react';\n\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport classNames from 'classnames';\n\nimport styles from './Popover.module.scss';\n\nexport enum ContentSide {\n TOP = 'top',\n RIGHT = 'right',\n BOTTOM = 'bottom',\n LEFT = 'left',\n}\n\nexport enum ContentAlign {\n START = 'start',\n CENTER = 'center',\n END = 'end',\n}\n\ninterface Props {\n trigger: ReactNode;\n children: ReactNode | ReactNode[];\n onOpenChange?: (open: boolean) => void;\n open?: boolean;\n isModal?: boolean;\n contentSide?: ContentSide;\n contentAlign?: ContentAlign;\n tip?: boolean;\n avoidCollisions?: boolean;\n useTooltipStyles?: boolean;\n defaultStyling?: boolean;\n isPortalled?: boolean;\n triggerStyles?: string;\n contentStyles?: string;\n contentSideOffset?: number;\n isContainerSpan?: boolean;\n}\n\nconst Popover: React.FC<Props> = ({\n children,\n trigger,\n onOpenChange,\n open,\n isModal = false,\n contentSide = ContentSide.BOTTOM,\n contentAlign = ContentAlign.CENTER,\n avoidCollisions = true,\n tip = false,\n useTooltipStyles = false,\n defaultStyling = true,\n isPortalled = true,\n contentSideOffset = 2,\n triggerStyles,\n contentStyles,\n isContainerSpan = false,\n}) => {\n const content = (\n <RadixPopover.Content\n sideOffset={contentSideOffset}\n side={contentSide}\n align={contentAlign}\n avoidCollisions={avoidCollisions}\n className={classNames(styles.content, {\n [styles.tooltipContent]: useTooltipStyles,\n [contentStyles]: contentStyles,\n })}\n >\n {children}\n {tip && <RadixPopover.Arrow />}\n </RadixPopover.Content>\n );\n\n const containerChild = (\n <RadixPopover.Root\n modal={isModal}\n {...(typeof open !== 'undefined' && { open })}\n {...(onOpenChange && { onOpenChange })}\n >\n <RadixPopover.Trigger aria-label=\"Open popover\" asChild>\n <span\n className={classNames(styles.trigger, {\n [triggerStyles]: triggerStyles,\n })}\n >\n {trigger}\n </span>\n </RadixPopover.Trigger>\n {isPortalled ? <RadixPopover.Portal>{content}</RadixPopover.Portal> : content}\n </RadixPopover.Root>\n );\n\n if (isContainerSpan) {\n return (\n <span className={classNames({ [styles.container]: defaultStyling })}>{containerChild}</span>\n );\n }\n\n return <div className={classNames({ [styles.container]: defaultStyling })}>{containerChild}</div>;\n};\n\nexport default Popover;\n","var _path, _path2, _path3, _path4;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgTranslation = function SvgTranslation(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 21,\n height: 21,\n viewBox: \"0 0 21 21\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n clipRule: \"evenodd\",\n d: \"M20 10.499V3.374A2.375 2.375 0 0 0 17.625.999H10.5a2.375 2.375 0 0 0-2.375 2.375v7.125a2.375 2.375 0 0 0 2.375 2.375h7.125A2.375 2.375 0 0 0 20 10.499Z\",\n stroke: \"currentColor\",\n strokeWidth: 1.188,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M6.938 12.878H3.374m2.375-4.75H3.375A2.375 2.375 0 0 0 1 10.503v7.125a2.375 2.375 0 0 0 2.375 2.375h.004l7.125-.012a2.375 2.375 0 0 0 2.371-2.375V15.25L5.75 8.128Z\",\n stroke: \"currentColor\",\n strokeWidth: 1.188,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M8.719 14.655 7.53 15.843c-.396.395-1.384.989-2.968 1.781\",\n stroke: \"currentColor\",\n strokeWidth: 1.188,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M16.438 8.124h-4.75m-7.126 4.754c.397 1.384.99 2.375 1.782 2.967.79.593 1.781 1.185 2.968 1.779l-4.75-4.746Zm9.5-9.504L10.5 10.499l3.563-7.125Zm0 0 3.563 7.125-3.563-7.125Z\",\n stroke: \"currentColor\",\n strokeWidth: 1.188,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })));\n};\nexport default SvgTranslation;","import { ReactNode } from 'react';\n\nimport styles from './QuranWord.module.scss';\n\nimport { WordByWordType } from 'types/QuranReader';\nimport Word from 'types/Word';\n\n/**\n * Generate the Tooltip content based on the settings.\n *\n * @param {WordByWordType[]} showTooltipFor\n * @param {Word} word\n * @returns {ReactNode}\n */\nconst getTooltipText = (showTooltipFor: WordByWordType[], word: Word): ReactNode => (\n <>\n {showTooltipFor.map((tooltipTextType) => (\n <p key={tooltipTextType} className={styles.tooltipText}>\n {word[tooltipTextType].text}\n </p>\n ))}\n </>\n);\n\nexport default getTooltipText;\n","import VerseTiming from 'types/VerseTiming';\n\nexport const getVerseTimingByVerseKey = (verseKey: string, verseTimings: VerseTiming[]) => {\n return verseTimings.find((verseTiming) => verseTiming.verseKey === verseKey);\n};\n\n// format the number to match the the mp3 file name structure\n// e.g formatNumber(3) => '003'\n// formatNumber(10) => '010'\nconst formatNumber = (num: number) => num.toString().padStart(3, '0');\nexport const QURANCDN_AUDIO_BASE_URL = 'https://audio.qurancdn.com/';\n\n/**\n * Given chapter, verse, and wordLocation. Get the mp3 audio url\n * For example\n * getWordByWordAudioUrl(1,2,1) => `'https://audio.qurancdn.com/wbw/001_002_001.mp3';\n *\n * @param {number} chapter the chapterId\n * @param {number} verse the verse number\n * @param {number} wordLocation the location of the word within a verse\n * @returns {string} audio url\n */\nexport const getWordByWordAudioUrl = (chapter: number, verse: number, wordLocation: number) => {\n const formattedChapter = formatNumber(chapter);\n const formattedVerse = formatNumber(verse);\n const formattedWordLocation = formatNumber(wordLocation);\n\n return `${QURANCDN_AUDIO_BASE_URL}wbw/${formattedChapter}_${formattedVerse}_${formattedWordLocation}.mp3`;\n};\n","import { QURANCDN_AUDIO_BASE_URL } from '@/utils/audio';\nimport { logEvent } from '@/utils/eventLogger';\nimport Word from 'types/Word';\n\nconst playWordAudio = (word: Word) => {\n playWordByWordAudio(`${QURANCDN_AUDIO_BASE_URL}${word.audioUrl}`);\n};\n\nexport default playWordAudio;\n\n/**\n * Given an audio url\n * 1) stop the word by word audio player if it's currently playing\n * 2) pause the main audio player if it's currently playing\n * 3) play the word by word audio\n * 4) resume the main audio player it it's previously was playing\n *\n * Terms\n * - main audio player refer to the audio player in the bottom navbar, this audio player plays the entire chapter\n * - word by word audio player refer to the audio player that play the clicked word\n *\n * @param {string} url\n */\nconst playWordByWordAudio = (url: string) => {\n // stop the audio and remove the DOM if it exists\n if (window.wordByWordAudioPlayerEl) {\n window.wordByWordAudioPlayerEl.pause();\n window.wordByWordAudioPlayerEl.remove();\n window.wordByWordAudioPlayerEl = null;\n }\n\n const removeDOM = () => {\n window.wordByWordAudioPlayerEl.removeEventListener('ended', removeDOM);\n window.wordByWordAudioPlayerEl.remove();\n };\n\n window.wordByWordAudioPlayerEl = new Audio(url);\n logEvent('load_audio_file', { audioUrl: url });\n\n window.wordByWordAudioPlayerEl.play();\n window.wordByWordAudioPlayerEl.addEventListener('ended', removeDOM);\n};\n","import React from 'react';\n\nimport styles from './TranslationsView.module.scss';\n\nimport TranslationText from '@/components/QuranReader/TranslationView/TranslationText';\nimport PlainVerseText from '@/components/Verse/PlainVerseText';\nimport Separator from '@/dls/Separator/Separator';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getVerseWords } from '@/utils/verse';\nimport Translation from 'types/Translation';\nimport Verse from 'types/Verse';\n\ntype Props = {\n verse: Verse;\n quranReaderStyles: QuranReaderStyles;\n};\n\nconst TranslationsView: React.FC<Props> = ({ verse, quranReaderStyles }) => {\n return (\n <>\n <div className={styles.arabicVerseContainer}>\n <PlainVerseText words={getVerseWords(verse)} />\n </div>\n <div className={styles.separatorContainer}>\n <Separator />\n </div>\n {verse.translations?.map((translation: Translation) => (\n <div key={translation.id} className={styles.verseTranslationContainer}>\n <TranslationText\n translationFontScale={quranReaderStyles.translationFontScale}\n text={translation.text}\n languageId={translation.languageId}\n resourceName={translation.resourceName}\n />\n </div>\n ))}\n </>\n );\n};\n\nexport default TranslationsView;\n","import { useCallback, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport dynamic from 'next/dynamic';\nimport useTranslation from 'next-translate/useTranslation';\nimport { useSelector } from 'react-redux';\n\nimport styles from './TranslationsButton.module.scss';\n\nimport DataFetcher from '@/components/DataFetcher';\nimport TranslationsView from '@/components/QuranReader/ReadingView/TranslationsView';\nimport TranslationViewCellSkeleton from '@/components/QuranReader/TranslationView/TranslationViewCellSkeleton';\nimport Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport ContentModalHandles from '@/dls/ContentModal/types/ContentModalHandles';\nimport TranslationsIcon from '@/icons/translation.svg';\nimport { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles';\nimport { selectSelectedTranslations } from '@/redux/slices/QuranReader/translations';\nimport { getDefaultWordFields, getMushafId } from '@/utils/api';\nimport { makeByVerseKeyUrl } from '@/utils/apiPaths';\nimport { logButtonClick, logEvent } from '@/utils/eventLogger';\nimport { VerseResponse } from 'types/ApiResponses';\nimport Verse from 'types/Verse';\n\nconst ContentModal = dynamic(() => import('@/dls/ContentModal/ContentModal'), {\n ssr: false,\n});\n\ninterface Props {\n verse: Verse;\n onActionTriggered: () => void;\n}\n\nconst CLOSE_POPOVER_AFTER_MS = 200;\n\nconst TranslationsButton: React.FC<Props> = ({ verse, onActionTriggered }) => {\n const [isContentModalOpen, setIsContentModalOpen] = useState(false);\n const { t } = useTranslation('common');\n const selectedTranslations = useSelector(selectSelectedTranslations);\n const quranReaderStyles = useSelector(selectQuranReaderStyles);\n const contentModalRef = useRef<ContentModalHandles>();\n const translationsQueryKey = makeByVerseKeyUrl(`${verse.chapterId}:${verse.verseNumber}`, {\n words: true,\n translationFields: 'resource_name,language_id',\n translations: selectedTranslations.join(','),\n ...getDefaultWordFields(quranReaderStyles.quranFont),\n ...getMushafId(quranReaderStyles.quranFont, quranReaderStyles.mushafLines),\n });\n\n const renderTranslationsView = useCallback(\n (data: VerseResponse) => {\n if (!data) return <TranslationViewCellSkeleton hasActionMenuItems={false} />;\n const { verse: responseVerse } = data;\n return <TranslationsView verse={responseVerse} quranReaderStyles={quranReaderStyles} />;\n },\n [quranReaderStyles],\n );\n\n const onButtonClicked = () => {\n logButtonClick(\n // eslint-disable-next-line i18next/no-literal-string\n `reading_view_translations_modal_open`,\n );\n setIsContentModalOpen(true);\n };\n\n const onModalClosed = () => {\n // eslint-disable-next-line i18next/no-literal-string\n logEvent(`reading_view_translations_modal_close`);\n setIsContentModalOpen(false);\n setTimeout(() => {\n // we set a really short timeout to close the popover after the modal has been closed to allow enough time for the fadeout css effect to apply.\n onActionTriggered();\n }, CLOSE_POPOVER_AFTER_MS);\n };\n\n const loading = useCallback(() => <TranslationViewCellSkeleton hasActionMenuItems={false} />, []);\n\n return (\n <>\n <Button\n onClick={onButtonClicked}\n variant={ButtonVariant.Ghost}\n size={ButtonSize.Small}\n tooltip={t('translations')}\n shouldFlipOnRTL={false}\n shape={ButtonShape.Circle}\n className={classNames(styles.iconContainer, styles.verseAction)}\n >\n <span className={styles.icon}>\n <TranslationsIcon />\n </span>\n </Button>\n <ContentModal\n innerRef={contentModalRef}\n isOpen={isContentModalOpen}\n header={<p className={styles.header}>{t('translations')}</p>}\n hasCloseButton\n onClose={onModalClosed}\n onEscapeKeyDown={onModalClosed}\n >\n <DataFetcher\n loading={loading}\n queryKey={translationsQueryKey}\n render={renderTranslationsView}\n />\n </ContentModal>\n </>\n );\n};\n\nexport default TranslationsButton;\n","import React from 'react';\n\nimport QuranReflectButton from '../../QuranReflectButton';\n\nimport styles from './WordActionsMenu.module.scss';\n\nimport TranslationsButton from '@/components/QuranReader/ReadingView/TranslationsButton';\nimport TafsirButton from '@/components/QuranReader/TafsirButton';\nimport OverflowVerseActionsMenu from '@/components/Verse/OverflowVerseActionsMenu';\nimport PlayVerseAudioButton from '@/components/Verse/PlayVerseAudioButton';\nimport Word from 'types/Word';\n\ntype Props = {\n word: Word;\n onActionTriggered?: () => void;\n};\n\nconst ReadingViewWordActionsMenu: React.FC<Props> = ({ word, onActionTriggered }) => {\n return (\n <div className={styles.container}>\n <TafsirButton\n verseKey={word.verseKey}\n isTranslationView={false}\n onActionTriggered={onActionTriggered}\n />\n <QuranReflectButton\n verseKey={word.verseKey}\n isTranslationView={false}\n onActionTriggered={onActionTriggered}\n />\n <TranslationsButton verse={word.verse} onActionTriggered={onActionTriggered} />\n {word?.verse?.timestamps && (\n <PlayVerseAudioButton\n verseKey={word.verseKey}\n isTranslationView={false}\n onActionTriggered={onActionTriggered}\n />\n )}\n <div className={styles.readingViewOverflowVerseActionsMenu}>\n <OverflowVerseActionsMenu\n isTranslationView={false}\n verse={word.verse}\n onActionTriggered={onActionTriggered}\n />\n </div>\n </div>\n );\n};\n\nexport default ReadingViewWordActionsMenu;\n","import React, { useState, useCallback } from 'react';\n\nimport { useDispatch } from 'react-redux';\n\nimport ReadingViewWordActionsMenu from '../WordActionsMenu';\n\nimport styles from './WordPopover.module.scss';\n\nimport Popover, { ContentSide } from '@/dls/Popover';\nimport {\n setReadingViewSelectedVerseKey,\n setReadingViewHoveredVerseKey,\n} from '@/redux/slices/QuranReader/readingViewVerse';\nimport { logEvent } from '@/utils/eventLogger';\nimport Word from 'types/Word';\n\ntype Props = {\n word: Word;\n children: React.ReactNode;\n};\n\nconst ReadingViewWordPopover: React.FC<Props> = ({ word, children }) => {\n const [isTooltipOpened, setIsTooltipOpened] = useState(false);\n const dispatch = useDispatch();\n\n const onOpenChange = useCallback(\n (isOpen: boolean) => {\n setIsTooltipOpened(isOpen);\n // eslint-disable-next-line i18next/no-literal-string\n logEvent(`reading_view_overflow_menu_${isOpen ? 'open' : 'close'}`);\n dispatch(setReadingViewSelectedVerseKey(isOpen ? word.verseKey : null));\n },\n [dispatch, word.verseKey],\n );\n\n const onHoverChange = useCallback(\n (isHovering: boolean) => {\n dispatch(setReadingViewHoveredVerseKey(isHovering ? word.verseKey : null));\n },\n [dispatch, word.verseKey],\n );\n const onActionTriggered = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n const onMouseEnter = useCallback(() => {\n onHoverChange(true);\n }, [onHoverChange]);\n\n const onMouseLeave = useCallback(() => {\n onHoverChange(false);\n }, [onHoverChange]);\n\n return (\n <Popover\n contentSide={ContentSide.TOP}\n contentSideOffset={-10}\n trigger={\n <div onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>\n {children}\n </div>\n }\n tip\n isModal\n open={isTooltipOpened}\n onOpenChange={onOpenChange}\n triggerStyles={styles.trigger}\n contentStyles={styles.content}\n defaultStyling={false}\n >\n <ReadingViewWordActionsMenu word={word} onActionTriggered={onActionTriggered} />\n </Popover>\n );\n};\n\nexport default ReadingViewWordPopover;\n","/* eslint-disable max-lines */\nimport React, { useState, useMemo, useCallback, memo, useContext } from 'react';\n\nimport { useSelector as useXstateSelector } from '@xstate/react';\nimport classNames from 'classnames';\nimport { shallowEqual, useSelector } from 'react-redux';\n\nimport InlineWordByWord from '../InlineWordByWord';\n\nimport getTooltipText from './getToolTipText';\nimport GlyphWord from './GlyphWord';\nimport playWordAudio from './playWordAudio';\nimport styles from './QuranWord.module.scss';\nimport TajweedWord from './TajweedWordImage';\nimport TextWord from './TextWord';\n\nimport ReadingViewWordPopover from '@/components/QuranReader/ReadingView/WordPopover';\nimport Wrapper from '@/components/Wrapper/Wrapper';\nimport MobilePopover from '@/dls/Popover/HoverablePopover';\nimport { selectShowTooltipWhenPlayingAudio } from '@/redux/slices/AudioPlayer/state';\nimport {\n selectWordClickFunctionality,\n selectReadingPreference,\n selectTooltipContentType,\n selectInlineDisplayWordByWordPreferences,\n} from '@/redux/slices/QuranReader/readingPreferences';\nimport { areArraysEqual } from '@/utils/array';\nimport { milliSecondsToSeconds } from '@/utils/datetime';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { isQCFFont } from '@/utils/fontFaceHelper';\nimport { getChapterNumberFromKey, makeWordLocation } from '@/utils/verse';\nimport { getWordTimeSegment } from 'src/xstate/actors/audioPlayer/audioPlayerMachineHelper';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\nimport { ReadingPreference, QuranFont, WordClickFunctionality } from 'types/QuranReader';\nimport Word, { CharType } from 'types/Word';\n\nexport const DATA_ATTRIBUTE_WORD_LOCATION = 'data-word-location';\n\nexport type QuranWordProps = {\n word: Word;\n font?: QuranFont;\n isHighlighted?: boolean;\n isWordByWordAllowed?: boolean;\n isAudioHighlightingAllowed?: boolean;\n isFontLoaded?: boolean;\n shouldShowSecondaryHighlight?: boolean;\n};\n\nconst QuranWord = ({\n word,\n font,\n isWordByWordAllowed = true,\n isAudioHighlightingAllowed = true,\n isHighlighted,\n shouldShowSecondaryHighlight = false,\n isFontLoaded = true,\n}: QuranWordProps) => {\n const wordClickFunctionality = useSelector(selectWordClickFunctionality);\n const audioService = useContext(AudioPlayerMachineContext);\n\n const showTooltipWhenPlayingAudio = useSelector(selectShowTooltipWhenPlayingAudio);\n\n const [isTooltipOpened, setIsTooltipOpened] = useState(false);\n const { showWordByWordTranslation, showWordByWordTransliteration } = useSelector(\n selectInlineDisplayWordByWordPreferences,\n shallowEqual,\n );\n const readingPreference = useSelector(selectReadingPreference);\n const showTooltipFor = useSelector(selectTooltipContentType, areArraysEqual);\n\n // creating wordLocation instead of using `word.location` because\n // the value of `word.location` is `1:3:5-7`, but we want `1:3:5`\n const wordLocation = makeWordLocation(word.verseKey, word.position);\n\n // Determine if the audio player is currently playing the word\n const isAudioPlayingWord = useXstateSelector(audioService, (state) => {\n const { surah, ayahNumber, wordLocation: wordPosition } = state.context;\n return `${surah}:${ayahNumber}:${wordPosition}` === wordLocation;\n });\n\n const isWordByWordLayout = showWordByWordTranslation || showWordByWordTransliteration;\n let wordText = null;\n\n if (isQCFFont(font)) {\n wordText = (\n <GlyphWord\n font={font}\n qpcUthmaniHafs={word.qpcUthmaniHafs}\n pageNumber={word.pageNumber}\n textCodeV1={word.codeV1}\n textCodeV2={word.codeV2}\n isFontLoaded={isFontLoaded}\n />\n );\n } else if (font === QuranFont.Tajweed) {\n wordText = <TajweedWord path={word.text} alt={word.textUthmani} />;\n } else if (word.charTypeName !== CharType.Pause) {\n wordText = <TextWord font={font} text={word.text} charType={word.charTypeName} />;\n }\n /*\n Only show the tooltip when the following conditions are met:\n\n 1. When the current character is of type Word.\n 2. When it's allowed to have word by word (won't be allowed for search results as of now).\n 3. When the tooltip settings are set to either translation or transliteration or both.\n */\n const showTooltip =\n word.charTypeName === CharType.Word && isWordByWordAllowed && !!showTooltipFor.length;\n const shouldBeHighLighted =\n isHighlighted || isTooltipOpened || (isAudioHighlightingAllowed && isAudioPlayingWord);\n const translationViewTooltipContent = useMemo(\n () => (isWordByWordAllowed ? getTooltipText(showTooltipFor, word) : null),\n [isWordByWordAllowed, showTooltipFor, word],\n );\n const isRecitationEnabled = wordClickFunctionality === WordClickFunctionality.PlayAudio;\n\n const onClick = useCallback(() => {\n if (isRecitationEnabled) {\n logButtonClick('quran_word_pronounce');\n const currentState = audioService.getSnapshot();\n const isPlaying = currentState.matches('VISIBLE.AUDIO_PLAYER_INITIATED.PLAYING');\n const currentSurah = getChapterNumberFromKey(word.verseKey);\n const isSameSurah = currentState.context.surah === Number(currentSurah);\n const shouldSeekTo = isPlaying && isSameSurah;\n if (shouldSeekTo) {\n const wordSegment = getWordTimeSegment(currentState.context.audioData.verseTimings, word);\n if (!wordSegment) return;\n const [startTime] = wordSegment;\n audioService.send({ type: 'SEEK_TO', timestamp: milliSecondsToSeconds(startTime) });\n } else {\n playWordAudio(word);\n }\n } else {\n logButtonClick('quran_word');\n }\n }, [audioService, isRecitationEnabled, word]);\n\n const shouldHandleWordClicking =\n readingPreference === ReadingPreference.Translation && word.charTypeName !== CharType.End;\n\n return (\n <div\n {...(shouldHandleWordClicking && { onClick, onKeyPress: onClick })}\n role=\"button\"\n tabIndex={0}\n {...{\n [DATA_ATTRIBUTE_WORD_LOCATION]: wordLocation,\n }}\n className={classNames(styles.container, {\n [styles.highlightOnHover]: isRecitationEnabled,\n [styles.highlighted]: shouldBeHighLighted,\n [styles.secondaryHighlight]: shouldShowSecondaryHighlight,\n [styles.wbwContainer]: isWordByWordLayout,\n [styles.additionalWordGap]: readingPreference === ReadingPreference.Translation,\n [styles.tajweedWord]: font === QuranFont.Tajweed,\n })}\n >\n <Wrapper\n shouldWrap={showTooltip}\n wrapper={(children) =>\n readingPreference === ReadingPreference.Translation ? (\n <MobilePopover\n isOpen={isAudioPlayingWord && showTooltipWhenPlayingAudio ? true : undefined}\n defaultStyling={false}\n content={translationViewTooltipContent}\n onOpenChange={setIsTooltipOpened}\n >\n {children}\n </MobilePopover>\n ) : (\n <ReadingViewWordPopover word={word}>{children}</ReadingViewWordPopover>\n )\n }\n >\n {wordText}\n </Wrapper>\n {isWordByWordAllowed && (\n <>\n {showWordByWordTransliteration && <InlineWordByWord text={word.transliteration?.text} />}\n {showWordByWordTranslation && <InlineWordByWord text={word.translation?.text} />}\n </>\n )}\n </div>\n );\n};\n\nexport default memo(QuranWord);\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { useRouter } from 'next/router';\nimport { useSelector, shallowEqual } from 'react-redux';\n\nimport { RootState } from '@/redux/RootState';\nimport { selectWordByWordLocale } from '@/redux/slices/QuranReader/readingPreferences';\nimport { selectSelectedTranslations } from '@/redux/slices/QuranReader/translations';\nimport { areArraysEqual } from '@/utils/array';\nimport {\n equalityCheckerByType,\n getQueryParamValueByType,\n QueryParamValueType,\n} from '@/utils/query-params';\nimport { isValidTranslationsQueryParamValue } from '@/utils/queryParamValidator';\nimport QueryParam from 'types/QueryParam';\n\nconst QUERY_PARAMS_DATA = {\n [QueryParam.Translations]: {\n reduxSelector: selectSelectedTranslations,\n reduxEqualityFunction: areArraysEqual,\n valueType: QueryParamValueType.ArrayOfNumbers,\n validate: (val) => isValidTranslationsQueryParamValue(val),\n },\n [QueryParam.WBW_LOCALE]: {\n reduxSelector: selectWordByWordLocale,\n reduxEqualityFunction: shallowEqual,\n valueType: QueryParamValueType.String,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n validate: (val) => true,\n },\n} as Record<\n QueryParam,\n {\n reduxSelector: (state: RootState) => any;\n valueType: QueryParamValueType;\n reduxEqualityFunction?: (left: any, right: any) => boolean;\n validate: (val: any) => boolean;\n }\n>;\n\n/**\n * A hook that searches the query params of the url for specific values,\n * parses them if found and if not, falls back to the Redux value and detects\n * when there is a mismatch between the query param value and the Redux value.\n *\n * @param {QueryParam} queryParam\n * @returns {{value: any, isQueryParamDifferent: boolean}}\n */\nconst useGetQueryParamOrReduxValue = (\n queryParam: QueryParam,\n): { value: any; isQueryParamDifferent: boolean } => {\n const { query, isReady } = useRouter();\n let useSelectorArguments = [QUERY_PARAMS_DATA[queryParam].reduxSelector];\n if (QUERY_PARAMS_DATA[queryParam].reduxEqualityFunction) {\n useSelectorArguments = [\n QUERY_PARAMS_DATA[queryParam].reduxSelector,\n // @ts-ignore\n QUERY_PARAMS_DATA[queryParam].reduxEqualityFunction,\n ];\n }\n // @ts-ignore\n const selectedValue = useSelector(...useSelectorArguments);\n const valueDetails = {\n value: selectedValue,\n isQueryParamDifferent: false,\n };\n\n // TODO: this bit is identical to the one in useGetQueryParamOrXstateValue.ts, keep it DRY\n // if the param exists in the url\n if (isReady && query[queryParam]) {\n const { validate, valueType } = QUERY_PARAMS_DATA[queryParam];\n\n const paramStringValue = String(query[queryParam]);\n const isValidValue = validate(paramStringValue);\n if (!isValidValue) {\n return { isQueryParamDifferent: false, value: selectedValue };\n }\n\n const parsedQueryParamValue = getQueryParamValueByType(paramStringValue, valueType);\n const checkEquality = equalityCheckerByType[valueType];\n const isQueryParamDifferent = !checkEquality(parsedQueryParamValue, selectedValue);\n\n return {\n value: parsedQueryParamValue,\n isQueryParamDifferent,\n };\n }\n\n return valueDetails;\n};\n\nexport default useGetQueryParamOrReduxValue;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useContext } from 'react';\n\nimport { useSelector as useXstateSelector } from '@xstate/react';\nimport { useRouter } from 'next/router';\n\nimport {\n equalityCheckerByType,\n getQueryParamValueByType,\n QueryParamValueType,\n} from '@/utils/query-params';\nimport { isValidReciterId } from '@/utils/queryParamValidator';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\nimport QueryParam from 'types/QueryParam';\n\nconst QUERY_PARAMS_DATA = {\n [QueryParam.Reciter]: {\n selector: (state: any) => state.context.reciterId,\n valueType: QueryParamValueType.Number,\n validate: isValidReciterId,\n },\n} as Record<\n QueryParam,\n {\n selector: (state) => any;\n valueType: QueryParamValueType;\n validate: (val: any) => boolean;\n }\n>;\n\n/**\n * A hook that searches the query params of the url for specific values,\n * parses them if found and if not, falls back to the Redux value and detects\n * when there is a mismatch between the query param value and the Redux value.\n *\n * @param {QueryParam} queryParam\n * @returns {{value: any, isQueryParamDifferent: boolean}}\n */\nconst useGetQueryParamOrXstateValue = (\n queryParam: QueryParam,\n): { value: any; isQueryParamDifferent: boolean } => {\n const { query, isReady } = useRouter();\n const audioService = useContext(AudioPlayerMachineContext);\n const { selector } = QUERY_PARAMS_DATA[queryParam];\n\n const selectedValue = useXstateSelector(audioService, selector);\n const defaultValueDetails = {\n value: selectedValue,\n isQueryParamDifferent: false,\n };\n\n // if the param exists in the url\n if (isReady && query[queryParam]) {\n const { validate, valueType } = QUERY_PARAMS_DATA[queryParam];\n\n const paramStringValue = String(query[queryParam]);\n const isValidValue = validate(paramStringValue);\n if (!isValidValue) {\n return { isQueryParamDifferent: false, value: selectedValue };\n }\n\n const parsedQueryParamValue = getQueryParamValueByType(paramStringValue, valueType);\n const checkEquality = equalityCheckerByType[valueType];\n const isQueryParamDifferent = !checkEquality(parsedQueryParamValue, selectedValue);\n\n return {\n value: parsedQueryParamValue,\n isQueryParamDifferent,\n };\n }\n return defaultValueDetails;\n};\n\nexport default useGetQueryParamOrXstateValue;\n","import {\n makeFollowUserUrl,\n makeGetUserReflectionsUrl,\n makePostReflectionViewsUrl,\n makeIsUserFollowedUrl,\n makeQuranicCalendarPostOfWeekUrl,\n} from './apiPaths';\n\nimport AyahReflection from '@/types/QuranReflect/AyahReflection';\nimport { postRequest, privateFetcher } from '@/utils/auth/api';\nimport GetAllUserReflectionsQueryParams from '@/utils/auth/types/GetAllUserReflectionsQueryParams';\n\nexport const postReflectionViews = async (postId: string): Promise<{ success: boolean }> =>\n postRequest(makePostReflectionViewsUrl(postId), {});\n\nexport const followUser = async (usernameOrId: string): Promise<{ success: boolean }> =>\n postRequest(makeFollowUserUrl(usernameOrId), {});\n\nexport const isUserFollowed = async (\n usernameOrId: string,\n): Promise<{ success: boolean; followed: boolean }> => {\n return privateFetcher(makeIsUserFollowedUrl(usernameOrId));\n};\n\nexport const getAllUserReflections = async (params: GetAllUserReflectionsQueryParams) => {\n return privateFetcher(makeGetUserReflectionsUrl(params));\n};\n\nexport const getQuranicCalendarPostOfWeek = async (\n weekNumber: number,\n): Promise<{ post: AyahReflection }> => {\n return privateFetcher(makeQuranicCalendarPostOfWeekUrl(weekNumber));\n};\n","import { makeUrl } from '@/utils/auth/apiPaths';\nimport GetAllUserReflectionsQueryParams from '@/utils/auth/types/GetAllUserReflectionsQueryParams';\n\nconst getPrefixedUrl = (url: string) => `qf/${url}`;\n\nexport const makePostReflectionViewsUrl = (postId: string) =>\n makeUrl(getPrefixedUrl(`posts/${postId}/views`));\n\nexport const makeFollowUserUrl = (userNameOrId: string) =>\n makeUrl(getPrefixedUrl(`users/${userNameOrId}/follow`));\n\nexport const makeIsUserFollowedUrl = (userNameOrId: string) =>\n makeUrl(getPrefixedUrl(`users/${userNameOrId}/is-followed`));\n\nexport const makeGetUserReflectionsUrl = (params?: GetAllUserReflectionsQueryParams) =>\n makeUrl(getPrefixedUrl('posts'), params as any);\n\nexport const makeQuranicCalendarPostOfWeekUrl = (weekNumber: number) =>\n makeUrl(getPrefixedUrl(`quranic-calendar/${weekNumber}`));\n","import { areArraysEqual } from './array';\n\nexport enum QueryParamValueType {\n String = 'String',\n Number = 'Number',\n ArrayOfNumbers = 'ArrayOfNumbers',\n ArrayOfStrings = 'ArrayOfStrings',\n}\n\nconst paramValueParser = {\n [QueryParamValueType.ArrayOfNumbers]: (paramStringValue: string) =>\n paramStringValue.split(',').map((stringValue) => Number(stringValue)),\n [QueryParamValueType.ArrayOfStrings]: (paramStringValue: string) =>\n paramStringValue.split(',').map((stringValue) => stringValue),\n [QueryParamValueType.Number]: (paramStringValue: string) => Number(paramStringValue),\n [QueryParamValueType.String]: (paramStringValue: string) => paramStringValue,\n};\n\nexport const equalityCheckerByType = {\n [QueryParamValueType.ArrayOfNumbers]: areArraysEqual,\n [QueryParamValueType.ArrayOfStrings]: areArraysEqual,\n [QueryParamValueType.String]: (a, b) => a === b,\n [QueryParamValueType.Number]: (a, b) => a === b,\n};\n\nexport const getQueryParamValueByType = (\n paramStringValue: string,\n valueType: QueryParamValueType,\n) => {\n const parse = paramValueParser[valueType];\n const parsedValue = parse(paramStringValue);\n return parsedValue;\n};\n","export const isValidTranslationsQueryParamValue = (value: string): boolean => {\n // if it's empty string, we shouldn't consider it as a valid translation\n if (!value) {\n return false;\n }\n const translationIds = value.split(',');\n let isValid = true;\n for (let index = 0; index < translationIds.length; index += 1) {\n // if the value is empty\n if (!translationIds[index]) {\n isValid = false;\n break;\n }\n const translationId = Number(translationIds[index]);\n // if the translation Id is empty or is not a number\n if (!translationId && Number.isNaN(translationId)) {\n isValid = false;\n break;\n }\n }\n return isValid;\n};\n\n/**\n * Check whether the value of the query param is a valid\n * reciter Id.\n *\n * @param {string} value\n * @returns {boolean}\n */\nexport const isValidReciterId = (value: string): boolean => {\n // if it's empty string, we shouldn't consider it as a valid reciter id\n if (!value) {\n return false;\n }\n const reciterId = Number(value);\n if (reciterId === 0 || Number.isNaN(reciterId)) {\n return false;\n }\n return true;\n};\n","/* eslint-disable import/prefer-default-export */\n\nimport { DEFAULT_RECITER } from '@/redux/defaultSettings/defaultSettings';\nimport { makeVerseKey } from '@/utils/verse';\n\nexport const selectIsUsingDefaultReciter = (state) =>\n state.context.reciterId === DEFAULT_RECITER.id;\n\nexport const selectCurrentAudioReciterId = (state) => state.context.audioData?.reciterId;\n\nexport const selectIsLoading = (state) => state.hasTag('loading');\n\nexport const selectIsAudioPlaying = (state) =>\n state.matches('VISIBLE.AUDIO_PLAYER_INITIATED.PLAYING');\n\nexport const selectIsPlayingCurrentChapter = (state, chapterId) => {\n const isAudioPlaying = selectIsAudioPlaying(state);\n const currentSurah = state.context.surah;\n return isAudioPlaying && currentSurah === chapterId;\n};\n\nexport const selectIsLoadingCurrentChapter = (state, chapterId) => {\n const isLoading = selectIsLoading(state);\n const currentSurah = state.context.surah;\n return isLoading && currentSurah === chapterId;\n};\n\nexport const selectIsVerseBeingPlayed = (state, verseKey) => {\n const { surah, ayahNumber } = state.context;\n return (\n state.matches('VISIBLE.AUDIO_PLAYER_INITIATED.PLAYING') &&\n makeVerseKey(surah, ayahNumber) === verseKey\n );\n};\n\nexport const selectIsVerseLoading = (state, verseKey) => {\n const { surah, ayahNumber } = state.context;\n return selectIsLoading(state) && makeVerseKey(surah, ayahNumber) === verseKey;\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"TranslationsButton_header__j_OPB\",\"iconContainer\":\"TranslationsButton_iconContainer__pukLN\",\"verseAction\":\"TranslationsButton_verseAction__JoZly\",\"icon\":\"TranslationsButton_icon__eqexD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"separatorContainer\":\"TranslationsView_separatorContainer__oM4LZ\",\"arabicVerseContainer\":\"TranslationsView_arabicVerseContainer__VriiJ\",\"verseTranslationContainer\":\"TranslationsView_verseTranslationContainer__kDX0e\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"readingViewOverflowVerseActionsMenu\":\"WordActionsMenu_readingViewOverflowVerseActionsMenu__hYXeV\",\"container\":\"WordActionsMenu_container__fBtQg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"content\":\"WordPopover_content__Qf_Ne\",\"trigger\":\"WordPopover_trigger__aNSSt\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"footnoteContainer\":\"FootnoteText_footnoteContainer__2GrJa\",\"text\":\"FootnoteText_text__o_c03\",\"header\":\"FootnoteText_header__M_Q2C\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"text\":\"TranslationText_text__4atf8\",\"translation-font-size-1\":\"TranslationText_translation-font-size-1__TqSPj\",\"translation-font-size-2\":\"TranslationText_translation-font-size-2__AW2i1\",\"translation-font-size-3\":\"TranslationText_translation-font-size-3__ww3t4\",\"translation-font-size-4\":\"TranslationText_translation-font-size-4__TKdKv\",\"translation-font-size-5\":\"TranslationText_translation-font-size-5__5bjGX\",\"translation-font-size-6\":\"TranslationText_translation-font-size-6__6SMJi\",\"translation-font-size-7\":\"TranslationText_translation-font-size-7__03ez5\",\"translation-font-size-8\":\"TranslationText_translation-font-size-8__IA0Tr\",\"translation-font-size-9\":\"TranslationText_translation-font-size-9__tq3IG\",\"translation-font-size-10\":\"TranslationText_translation-font-size-10__A9YEa\",\"ltr\":\"TranslationText_ltr__146rZ\",\"rtl\":\"TranslationText_rtl__ytrpw\",\"urdu\":\"TranslationText_urdu__9N37Y\",\"kurdish\":\"TranslationText_kurdish__je0yf\",\"divehi\":\"TranslationText_divehi__e3rqQ\",\"translationName\":\"TranslationText_translationName__Vm9Sj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cellContainer\":\"TranslationViewCell_cellContainer__rhs1_\",\"highlightedContainer\":\"TranslationViewCell_highlightedContainer__iR1i_\",\"contentContainer\":\"TranslationViewCell_contentContainer__MzrKa\",\"actionContainer\":\"TranslationViewCell_actionContainer__HsBR4\",\"arabicVerseContainer\":\"TranslationViewCell_arabicVerseContainer__1PutS\",\"verseTranslationsContainer\":\"TranslationViewCell_verseTranslationsContainer__TrT0u\",\"verseTranslationContainer\":\"TranslationViewCell_verseTranslationContainer__FzCJX\",\"actionContainerLeft\":\"TranslationViewCell_actionContainerLeft__W_dFh\",\"actionContainerRight\":\"TranslationViewCell_actionContainerRight__PYURw\",\"iconContainer\":\"TranslationViewCell_iconContainer__7hDOA\",\"verseAction\":\"TranslationViewCell_verseAction__oJZAI\",\"fadedVerseAction\":\"TranslationViewCell_fadedVerseAction__5D_Z9\",\"icon\":\"TranslationViewCell_icon__x_dPx\",\"playIcon\":\"TranslationViewCell_playIcon__ON4ZG\",\"priorityAction\":\"TranslationViewCell_priorityAction__YBhF5\",\"actionItem\":\"TranslationViewCell_actionItem__joebg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cellContainer\":\"TranslationViewSkeleton_cellContainer__sBy6V\",\"verseContainer\":\"TranslationViewSkeleton_verseContainer__VxNMX\",\"translationText\":\"TranslationViewSkeleton_translationText__x_kjw\",\"translationAuthor\":\"TranslationViewSkeleton_translationAuthor__xU1HK\",\"actionItem\":\"TranslationViewSkeleton_actionItem__QsY3x\",\"translation-font-size-1\":\"TranslationViewSkeleton_translation-font-size-1__kGXZP\",\"translation-font-size-2\":\"TranslationViewSkeleton_translation-font-size-2__LnbhT\",\"translation-font-size-3\":\"TranslationViewSkeleton_translation-font-size-3__1GsaL\",\"translation-font-size-4\":\"TranslationViewSkeleton_translation-font-size-4__87NbS\",\"translation-font-size-5\":\"TranslationViewSkeleton_translation-font-size-5__eMUdE\",\"translation-font-size-6\":\"TranslationViewSkeleton_translation-font-size-6__lNNK7\",\"translation-font-size-7\":\"TranslationViewSkeleton_translation-font-size-7__It5hp\",\"translation-font-size-8\":\"TranslationViewSkeleton_translation-font-size-8___c0mR\",\"translation-font-size-9\":\"TranslationViewSkeleton_translation-font-size-9__AYCn0\",\"translation-font-size-10\":\"TranslationViewSkeleton_translation-font-size-10__WpttO\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"OverflowVerseActionsMenuBody_container__MmTNa\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modalContainer\":\"ContentModal_modalContainer__i7bo0\",\"contentContainer\":\"ContentModal_contentContainer___ciX5\",\"overlay\":\"ContentModal_overlay__qZfQY\",\"contentWrapper\":\"ContentModal_contentWrapper__VaiRB\",\"autoHeight\":\"ContentModal_autoHeight__A3IW7\",\"medium\":\"ContentModal_medium__EKB5h\",\"small\":\"ContentModal_small__YBKtM\",\"fadeIn\":\"ContentModal_fadeIn__JGh_A\",\"fadeOut\":\"ContentModal_fadeOut__36m_B\",\"contentIn\":\"ContentModal_contentIn__EAwQw\",\"contentOut\":\"ContentModal_contentOut__2x8WN\",\"closeIcon\":\"ContentModal_closeIcon__xppin\",\"header\":\"ContentModal_header__384F2\",\"content\":\"ContentModal_content__9M2Iy\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"Popover_container__GOha0\",\"trigger\":\"Popover_trigger__qKXNN\",\"content\":\"Popover_content__gu5L4\",\"tooltipContent\":\"Popover_tooltipContent__AMPpT\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"QuranWord_container__lmBE_\",\"additionalWordGap\":\"QuranWord_additionalWordGap__wEsc5\",\"tajweedWord\":\"QuranWord_tajweedWord__gTxER\",\"highlighted\":\"QuranWord_highlighted__YfsNt\",\"secondaryHighlight\":\"QuranWord_secondaryHighlight__rOvv4\",\"wbwContainer\":\"QuranWord_wbwContainer__REUuI\",\"highlightOnHover\":\"QuranWord_highlightOnHover__l3KmK\",\"tooltipText\":\"QuranWord_tooltipText___d04R\",\"popoverTrigger\":\"QuranWord_popoverTrigger__fGtvj\"};"],"names":["_path","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","props","width","height","viewBox","fill","xmlns","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","verseKey","isTranslationView","onActionTriggered","useTranslation","lang","router","useRouter","useState","isContentModalOpen","setIsContentModalOpen","contentModalRef","useRef","onModalClose","fakeNavigate","asPath","getVerseAndChapterNumbersFromKey","initialChapterId","verseNumber","Button","variant","ButtonVariant","onClick","logButtonClick","getVerseReflectionNavigationUrl","size","ButtonSize","tooltip","shouldFlipOnRTL","shape","ButtonShape","className","classNames","styles","ariaLabel","span","ChatIcon","ReflectionBodyContainer","initialVerseNumber","scrollToTop","current","render","surahAndAyahSelection","body","ContentModal","innerRef","isOpen","hasCloseButton","onClose","onEscapeKeyDown","header","isDev","env","NEXT_PUBLIC_VERCEL_ENV","setIntersectionDebuggerNodeText","text","intersectionDebuggerNode","textContent","onElementVisible","observerId","elementIdKey","delayForMSKey","threshold","root","rootMargin","timeouts","Map","updateEntry","useCallback","entries","forEach","visibleEntry","elementIntersectionDebuggerNode","nodes","target","getElementsByClassName","targetNode","elementId","dataset","delayForMS","Number","isIntersecting","set","window","setTimeout","clearTimeout","get","delete","useBrowserLayoutEffect","IntersectionObserver","value","disconnect","undefined","Tab","API_HOST","process","makeQuranReflectApiUrl","path","parameters","params","client_auth_token","NEXT_PUBLIC_QURAN_REFLECT_TOKEN","stringify","makeAyahReflectionsUrl","surahId","ayahNumber","locale","page","tab","surahNumber","feed","makeReflectionViewsUrl","postId","postReflectionViews","fetcher","method","headers","ReflectionSurahAndAyahSelection","ayahReflectionsUrl","dynamic","ssr","ReflectionBody","loading","TafsirSkeleton","selectedChapterId","setSelectedChapterId","selectedVerseNumber","setSelectedVerseNumber","onReflectionViewed","reflectionContainer","getAttribute","isLoggedIn","catch","postReflectionViewsToQuranReflect","useGlobalIntersectionObserverWithDelay","REFLECTIONS_OBSERVER_ID","renderBody","data","DataFetcher","queryKey","tafsirs","useSelector","selectSelectedTafsirs","chapterId","logEvent","getVerseSelectedTafsirNavigationUrl","TafsirIcon","TafsirBody","shouldRender","toString","languageAndTafsirSelection","footnoteName","footnote","onCloseClicked","onTextClicked","isLoading","languageId","findLanguageIdByLocale","landData","getLanguageDataById","div","p","CloseIcon","Spinner","transStyles","direction","font","dangerouslySetInnerHTML","__html","translationFontScale","resourceName","setIsLoading","showFootnote","setShowFootnote","setFootnote","activeFootnoteName","setActiveFootnoteName","activeSubFootnoteName","setActiveSubFootnoteName","subFootnote","setSubFootnote","PRE_DEFINED_FOOTNOTES","sg","pl","dl","resetFootnote","resetSubFootnote","event","isSubFootnote","tagName","footnoteText","innerText","trim","subFootnoteId","id","footNoteId","getFootnote","then","res","status","footNote","finally","langData","shouldShowFootnote","FootnoteText","hasActionMenuItems","useGetQueryParamOrReduxValue","QueryParam","selectQuranReaderStyles","shallowEqual","quranFont","quranTextFontScale","mushafLines","isTajweedFont","QuranFont","cellStyles","skeletonStyles","range","map","index","Skeleton","verseTextStyles","getFontClassName","selectedTranslations","translation","QURAN_READER_OBSERVER_ID","getOptions","isReadingPreference","getObservedVersePayload","element","hizb","OverflowVerseActionsMenuBody","verse","bookmarksRangeUrl","PopoverMenu","trigger","OverflowMenuIcon","isModal","isPortalled","onOpenChange","open","audioService","useContext","AudioPlayerMachineContext","useGetQueryParamOrXstateValue","isQueryParamDifferent","isVisible","state","matches","useOnboarding","isActive","activeStepGroup","nextStep","isVerseLoading","useXstateSelector","selectIsVerseLoading","getChapterNumberFromKey","getVerseNumberFromKey","chaptersData","DataContext","chapterData","getChapterData","onPlayClicked","send","type","surah","reciterId","reciterQueryParamDifferent","OnboardingGroup","useEffect","handlePlayAudioStep","addEventListener","OnboardingEvent","removeEventListener","ButtonType","surahName","transliteratedName","PlayIcon","ContentModalSize","children","contentClassName","MEDIUM","isFixedHeight","hasHeader","overlayRef","useImperativeHandle","scrollTop","Dialog","ref","SMALL","onPointerDownOutside","currentTarget","isRTLLocale","detail","originalEvent","offsetX","clientWidth","preventDefault","content","contentSide","ContentSide","tip","tooltipDelay","defaultStyling","triggerStyles","isContainerSpan","Popover","useTooltipStyles","Tooltip","delay","ContentAlign","BOTTOM","contentAlign","CENTER","avoidCollisions","contentSideOffset","contentStyles","RadixPopover","sideOffset","side","align","containerChild","modal","aria-label","asChild","_path2","_path3","_path4","showTooltipFor","word","tooltipTextType","QURANCDN_AUDIO_BASE_URL","playWordByWordAudio","audioUrl","url","wordByWordAudioPlayerEl","pause","remove","removeDOM","Audio","play","quranReaderStyles","PlainVerseText","words","getVerseWords","Separator","translations","TranslationText","clipRule","selectSelectedTranslations","translationsQueryKey","makeByVerseKeyUrl","translationFields","join","getDefaultWordFields","getMushafId","renderTranslationsView","TranslationViewCellSkeleton","TranslationsView","responseVerse","onModalClosed","TranslationsIcon","TafsirButton","QuranReflectButton","TranslationsButton","timestamps","PlayVerseAudioButton","OverflowVerseActionsMenu","isTooltipOpened","setIsTooltipOpened","dispatch","useDispatch","setReadingViewSelectedVerseKey","onHoverChange","isHovering","setReadingViewHoveredVerseKey","onMouseEnter","onMouseLeave","ReadingViewWordActionsMenu","DATA_ATTRIBUTE_WORD_LOCATION","QuranWord","isWordByWordAllowed","isAudioHighlightingAllowed","isHighlighted","shouldShowSecondaryHighlight","isFontLoaded","wordClickFunctionality","selectWordClickFunctionality","showTooltipWhenPlayingAudio","selectShowTooltipWhenPlayingAudio","selectInlineDisplayWordByWordPreferences","showWordByWordTranslation","showWordByWordTransliteration","readingPreference","selectReadingPreference","selectTooltipContentType","areArraysEqual","wordLocation","makeWordLocation","position","isAudioPlayingWord","context","wordPosition","isWordByWordLayout","wordText","isQCFFont","GlyphWord","qpcUthmaniHafs","pageNumber","textCodeV1","codeV1","textCodeV2","codeV2","TajweedWord","alt","textUthmani","charTypeName","CharType","TextWord","charType","showTooltip","shouldBeHighLighted","translationViewTooltipContent","useMemo","getTooltipText","isRecitationEnabled","WordClickFunctionality","currentState","getSnapshot","isPlaying","currentSurah","isSameSurah","wordSegment","getWordTimeSegment","audioData","verseTimings","startTime","timestamp","milliSecondsToSeconds","playWordAudio","shouldHandleWordClicking","ReadingPreference","onKeyPress","role","tabIndex","Wrapper","shouldWrap","wrapper","MobilePopover","ReadingViewWordPopover","InlineWordByWord","transliteration","memo","QUERY_PARAMS_DATA","reduxSelector","reduxEqualityFunction","valueType","QueryParamValueType","validate","val","isValidTranslationsQueryParamValue","selectWordByWordLocale","queryParam","query","isReady","useSelectorArguments","selectedValue","valueDetails","paramStringValue","String","parsedQueryParamValue","getQueryParamValueByType","checkEquality","equalityCheckerByType","selector","isValidReciterId","defaultValueDetails","postRequest","makePostReflectionViewsUrl","followUser","usernameOrId","makeFollowUserUrl","isUserFollowed","privateFetcher","makeIsUserFollowedUrl","getQuranicCalendarPostOfWeek","makeGetUserReflectionsUrl","weekNumber","makeQuranicCalendarPostOfWeekUrl","getPrefixedUrl","makeUrl","userNameOrId","ArrayOfNumbers","ArrayOfStrings","paramValueParser","split","stringValue","a","b","parse","translationIds","isValid","translationId","isNaN","selectIsUsingDefaultReciter","DEFAULT_RECITER","selectCurrentAudioReciterId","selectIsLoading","hasTag","selectIsPlayingCurrentChapter","isAudioPlaying","selectIsAudioPlaying","selectIsLoadingCurrentChapter","makeVerseKey","module","exports"],"sourceRoot":""}