19960.e3d310e5eed7e5d7.js.map 54 KB

1
  1. {"version":3,"file":"static/chunks/19960.e3d310e5eed7e5d7.js","mappings":"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","sources":["webpack://_N_E/./src/components/QuranReader/ReadingView/hooks/useScrollToVirtualizedVerse.ts","webpack://_N_E/./src/components/QuranReader/ReadingView/groupLinesByVerses.ts","webpack://_N_E/./src/components/QuranReader/ReadingView/Line.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/PageFooter.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/Page.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/ReadingViewSkeleton.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/PageContainer.tsx","webpack://_N_E/./src/components/QuranReader/utils/page.ts","webpack://_N_E/./src/components/QuranReader/ReadingView/PageNavigationButtons/index.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/index.tsx","webpack://_N_E/./src/components/QuranReader/ReadingView/Line.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/Page.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/PageFooter.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/PageNavigationButtons/PageNavigationButtons.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/ReadingView.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingView/ReadingViewSkeleton.module.scss"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { useRouter } from 'next/router';\nimport { VirtuosoHandle } from 'react-virtuoso';\n\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getMushafId } from '@/utils/api';\nimport { makeVersesFilterUrl } from '@/utils/apiPaths';\nimport { getVerseNumberFromKey } from '@/utils/verse';\nimport { fetcher } from 'src/api';\nimport { VersesResponse } from 'types/ApiResponses';\nimport LookupRecord from 'types/LookupRecord';\nimport { MushafLines, QuranFont, QuranReaderDataType } from 'types/QuranReader';\nimport ScrollAlign from 'types/ScrollAlign';\nimport Verse from 'types/Verse';\n\n/**\n * Get where a verse lies in a mushaf page. This is achieved by:\n *\n * 1. Checking where the index of the current verse is within the page.\n * 2. Calculating how far the index is from the beginning of the array of verses of that page.\n * 3. If it lies in the first third portion, then its position is 'start', the second\n * third of the page, its position is 'center', the last third of the page its position\n * is 'end'.\n *\n * @param {string} startingVerseKey\n * @param {number} mushafPageNumber\n * @param {Record<number, LookupRecord>} pagesVersesRange\n * @returns {ScrollAlign}\n */\nconst getVersePositionWithinAMushafPage = (\n startingVerseKey: string,\n mushafPageNumber: number,\n pagesVersesRange: Record<number, LookupRecord>,\n): ScrollAlign => {\n const pageStartVerseNumber = getVerseNumberFromKey(pagesVersesRange[mushafPageNumber].from);\n const pageEndVerseNumber = getVerseNumberFromKey(pagesVersesRange[mushafPageNumber].to);\n const verseOrderWithinPage = getVerseNumberFromKey(startingVerseKey) - pageStartVerseNumber + 1;\n const totalPageNumberOfVerses = pageEndVerseNumber - pageStartVerseNumber + 1;\n const verseKeyPosition = (verseOrderWithinPage * 100) / totalPageNumberOfVerses;\n if (verseKeyPosition <= 33.3) {\n return ScrollAlign.Start;\n }\n if (verseKeyPosition <= 66.6) {\n return ScrollAlign.Center;\n }\n return ScrollAlign.End;\n};\n\n/**\n * This hook listens to startingVerse query param and navigate to the\n * location where the page of that verse is in the virtualized list if we\n * already have the data of that verse; otherwise, we will call BE to fetch\n * the page number of the verse we want to navigate to.\n *\n * [NOTE]: This is meant to be used by ReadingView only.\n *\n * @param {QuranReaderDataType} quranReaderDataType\n * @param {React.MutableRefObject<VirtuosoHandle>} virtuosoRef\n * @param {VersesResponse} initialData\n * @param {QuranReaderStyles} quranReaderStyles\n * @param {Verse[]} verses\n * @param {Record<number, LookupRecord>} pagesVersesRange\n * @param {boolean} isUsingDefaultFont\n * @param {QuranFont} quranFont\n * @param {MushafLines} mushafLines\n * @param {boolean} isPagesLookupLoading\n */\nconst useScrollToVirtualizedReadingView = (\n quranReaderDataType: QuranReaderDataType,\n virtuosoRef: React.MutableRefObject<VirtuosoHandle>,\n initialData: VersesResponse,\n quranReaderStyles: QuranReaderStyles,\n verses: Verse[],\n pagesVersesRange: Record<number, LookupRecord>,\n isUsingDefaultFont: boolean,\n quranFont: QuranFont,\n mushafLines: MushafLines,\n isPagesLookupLoading: boolean,\n) => {\n const router = useRouter();\n const { startingVerse, chapterId } = router.query;\n const shouldScroll = useRef(true);\n\n /**\n * We need to scroll again when we have just changed the font since the same\n * verse might lie on another page/position. Same for when we change the\n * verse.\n */\n useEffect(() => {\n shouldScroll.current = true;\n }, [quranFont, mushafLines, startingVerse]);\n\n useEffect(\n // eslint-disable-next-line react-func/max-lines-per-function\n () => {\n // if we have the data of the page lookup\n if (!isPagesLookupLoading && virtuosoRef.current && Object.keys(pagesVersesRange).length) {\n // if startingVerse is present in the url\n if (quranReaderDataType === QuranReaderDataType.Chapter && startingVerse) {\n const startingVerseNumber = Number(startingVerse);\n // if the startingVerse is a valid integer and is above 1\n if (Number.isInteger(startingVerseNumber) && startingVerseNumber > 0) {\n const firstPageOfCurrentChapter = isUsingDefaultFont\n ? initialData.verses[0].pageNumber\n : Number(Object.keys(pagesVersesRange)[0]);\n // search for the verse number in the already fetched verses first\n const startFromVerseData = verses.find(\n (verse) => verse.verseNumber === startingVerseNumber,\n );\n if (\n startFromVerseData &&\n shouldScroll.current === true &&\n pagesVersesRange[startFromVerseData.pageNumber]\n ) {\n const scrollToPageIndex = startFromVerseData.pageNumber - firstPageOfCurrentChapter;\n virtuosoRef.current.scrollToIndex({\n index: scrollToPageIndex,\n align: getVersePositionWithinAMushafPage(\n `${chapterId}:${startingVerseNumber}`,\n startFromVerseData.pageNumber,\n pagesVersesRange,\n ),\n });\n shouldScroll.current = false;\n } else {\n // get the page number by the verse key and the mushafId (because the page will be different for Indopak Mushafs)\n fetcher(\n makeVersesFilterUrl({\n filters: `${chapterId}:${startingVerseNumber}`,\n fields: `page_number`,\n ...getMushafId(quranReaderStyles.quranFont, quranReaderStyles.mushafLines),\n }),\n ).then((response: VersesResponse) => {\n if (response.verses.length && shouldScroll.current === true) {\n const scrollToPageIndex =\n response.verses[0].pageNumber - firstPageOfCurrentChapter;\n if (pagesVersesRange[response.verses[0].pageNumber]) {\n virtuosoRef.current.scrollToIndex({\n index: scrollToPageIndex,\n align: getVersePositionWithinAMushafPage(\n `${chapterId}:${startingVerseNumber}`,\n response.verses[0].pageNumber,\n pagesVersesRange,\n ),\n });\n shouldScroll.current = false;\n }\n }\n });\n }\n }\n }\n }\n },\n [\n chapterId,\n initialData.verses,\n isPagesLookupLoading,\n isUsingDefaultFont,\n pagesVersesRange,\n quranReaderDataType,\n quranReaderStyles.mushafLines,\n quranReaderStyles.quranFont,\n startingVerse,\n verses,\n virtuosoRef,\n ],\n );\n};\n\nexport default useScrollToVirtualizedReadingView;\n","import groupBy from 'lodash/groupBy';\n\nimport { getVerseWords } from '@/utils/verse';\nimport Verse from 'types/Verse';\nimport Word from 'types/Word';\n\n/**\n * Groups verses into lines to match the Quran Page (Madani Mushaf) layout\n * The returning value is an object containing the page and line number as a key,\n * and array of word for the value. E.g.\n * {\n * Page1-Line2: [words],\n * Page1-Line3: [words]\n * ...\n * }\n *\n * @returns {Record<string, Word[]}\n */\nconst groupLinesByVerses = (verses: Verse[]): Record<string, Word[]> => {\n let words = [];\n\n // Flattens the verses into an array of words\n verses.forEach((verse) => {\n words = [...words, ...getVerseWords(verse, true)];\n });\n\n // Groups the words based on their (page and) line number\n const lines = groupBy(words, (word) => `Page${word.pageNumber}-Line${word.lineNumber}`);\n\n return lines;\n};\n\nexport default groupLinesByVerses;\n","import React, { useEffect, memo, useContext, RefObject } from 'react';\n\nimport { useSelector as useXstateSelector } from '@xstate/react';\nimport classNames from 'classnames';\nimport { shallowEqual, useSelector } from 'react-redux';\n\nimport { verseFontChanged } from '../utils/memoization';\n\nimport styles from './Line.module.scss';\n\nimport ChapterHeader from '@/components/chapters/ChapterHeader';\nimport { useOnboarding } from '@/components/Onboarding/OnboardingProvider';\nimport VerseText from '@/components/Verse/VerseText';\nimport useScroll, { SMOOTH_SCROLL_TO_CENTER } from '@/hooks/useScrollToElement';\nimport { selectEnableAutoScrolling } from '@/redux/slices/AudioPlayer/state';\nimport { selectInlineDisplayWordByWordPreferences } from '@/redux/slices/QuranReader/readingPreferences';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getWordDataByLocation } from '@/utils/verse';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\nimport Word from 'types/Word';\n\nexport type LineProps = {\n words: Word[];\n lineKey: string;\n isBigTextLayout: boolean;\n // eslint-disable-next-line react/no-unused-prop-types\n quranReaderStyles: QuranReaderStyles;\n pageIndex: number;\n lineIndex: number;\n};\n\nconst Line = ({ lineKey, words, isBigTextLayout, pageIndex, lineIndex }: LineProps) => {\n const audioService = useContext(AudioPlayerMachineContext);\n const isHighlighted = useXstateSelector(audioService, (state) => {\n const { surah, ayahNumber } = state.context;\n const verseKeys = words.map((word) => word.verseKey);\n return verseKeys.includes(`${surah}:${ayahNumber}`);\n });\n\n const [scrollToSelectedItem, selectedItemRef]: [() => void, RefObject<HTMLDivElement>] =\n useScroll(SMOOTH_SCROLL_TO_CENTER);\n\n const { isActive } = useOnboarding();\n // disable auto scrolling when the user is onboarding\n const enableAutoScrolling = useSelector(selectEnableAutoScrolling, shallowEqual) && !isActive;\n const { showWordByWordTranslation, showWordByWordTransliteration } = useSelector(\n selectInlineDisplayWordByWordPreferences,\n shallowEqual,\n );\n\n useEffect(() => {\n if (isHighlighted && enableAutoScrolling) {\n scrollToSelectedItem();\n }\n }, [isHighlighted, scrollToSelectedItem, enableAutoScrolling]);\n\n const firstWordData = getWordDataByLocation(words[0].location);\n const shouldShowChapterHeader = firstWordData[1] === '1' && firstWordData[2] === '1';\n const isWordByWordLayout = showWordByWordTranslation || showWordByWordTransliteration;\n\n return (\n <div\n ref={selectedItemRef}\n id={lineKey}\n className={classNames(styles.container, {\n [styles.highlighted]: isHighlighted,\n [styles.mobileInline]: isBigTextLayout,\n })}\n >\n {shouldShowChapterHeader && (\n <ChapterHeader\n chapterId={firstWordData[0]}\n pageNumber={words[0].pageNumber}\n hizbNumber={words[0].hizbNumber}\n />\n )}\n <div\n className={classNames(styles.line, {\n [styles.mobileInline]: isBigTextLayout,\n [styles.fixedWidth]: !isWordByWordLayout,\n })}\n >\n <VerseText\n words={words}\n isReadingMode\n isHighlighted={isHighlighted}\n shouldShowH1ForSEO={pageIndex === 0 && lineIndex === 0}\n />\n </div>\n </div>\n );\n};\n\n/**\n * Since we are passing words and it's an array\n * even if the same words are passed, their reference will change\n * on fetching a new page and since Memo only does shallow comparison,\n * we need to use custom comparing logic:\n *\n * 1. Check if the line keys are the same.\n * 2. Check if the number of words are the same.\n * 3. Check if isBigTextLayout values are the same.\n * 4. Check if the font changed.\n *\n * If the above conditions are met, it's safe to assume that the result\n * of both renders are the same.\n *\n * @param {LineProps} prevProps\n * @param {LineProps} nextProps\n * @returns {boolean}\n */\nconst areLinesEqual = (prevProps: LineProps, nextProps: LineProps): boolean =>\n prevProps.lineKey === nextProps.lineKey &&\n prevProps.isBigTextLayout === nextProps.isBigTextLayout &&\n !verseFontChanged(\n prevProps.quranReaderStyles,\n nextProps.quranReaderStyles,\n prevProps.words,\n nextProps.words,\n );\n\nexport default memo(Line, areLinesEqual);\n","import React from 'react';\n\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from './PageFooter.module.scss';\n\nimport Link from '@/dls/Link/Link';\nimport { toLocalizedNumber } from '@/utils/locale';\nimport { getPageNavigationUrl } from '@/utils/navigation';\n\ninterface Props {\n page: number;\n}\n\nconst PageFooter: React.FC<Props> = ({ page }) => {\n const { lang } = useTranslation('quran-reader');\n const pageUrl = getPageNavigationUrl(page);\n\n return (\n <div className={styles.pageText}>\n <Link href={pageUrl} shouldPassHref shouldPrefetch={false}>\n <p className={styles.pageLink}>{toLocalizedNumber(page, lang)}</p>\n </Link>\n </div>\n );\n};\n\nexport default PageFooter;\n","import React, { useMemo } from 'react';\n\nimport classNames from 'classnames';\nimport { shallowEqual, useSelector } from 'react-redux';\n\nimport groupLinesByVerses from './groupLinesByVerses';\nimport Line from './Line';\nimport styles from './Page.module.scss';\nimport PageFooter from './PageFooter';\n\nimport useIsFontLoaded from '@/components/QuranReader/hooks/useIsFontLoaded';\nimport { selectInlineDisplayWordByWordPreferences } from '@/redux/slices/QuranReader/readingPreferences';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getLineWidthClassName } from '@/utils/fontFaceHelper';\nimport { FALLBACK_FONT, QuranFont } from 'types/QuranReader';\nimport Verse from 'types/Verse';\n\ntype PageProps = {\n verses: Verse[];\n pageNumber: number;\n quranReaderStyles: QuranReaderStyles;\n pageIndex: number;\n};\n\nconst Page = ({ verses, pageNumber, quranReaderStyles, pageIndex }: PageProps) => {\n const lines = useMemo(\n () => (verses && verses.length ? groupLinesByVerses(verses) : {}),\n [verses],\n );\n const { quranTextFontScale, quranFont, mushafLines } = quranReaderStyles;\n const { showWordByWordTranslation, showWordByWordTransliteration } = useSelector(\n selectInlineDisplayWordByWordPreferences,\n shallowEqual,\n );\n const isWordByWordLayout = showWordByWordTranslation || showWordByWordTransliteration;\n const isBigTextLayout =\n isWordByWordLayout || quranTextFontScale > 3 || quranFont === QuranFont.Tajweed;\n const isFontLoaded = useIsFontLoaded(pageNumber, quranFont);\n\n return (\n <div\n id={`page-${pageNumber}`}\n className={classNames(styles.container, {\n [styles.mobileCenterText]: isBigTextLayout,\n [styles[getLineWidthClassName(FALLBACK_FONT, quranTextFontScale, mushafLines, true)]]:\n !isFontLoaded,\n })}\n >\n {Object.keys(lines).map((key, lineIndex) => (\n <Line\n pageIndex={pageIndex}\n lineIndex={lineIndex}\n lineKey={key}\n words={lines[key]}\n key={key}\n isBigTextLayout={isBigTextLayout}\n quranReaderStyles={quranReaderStyles}\n />\n ))}\n <PageFooter page={pageNumber} />\n </div>\n );\n};\n\nexport default Page;\n","import classNames from 'classnames';\nimport range from 'lodash/range';\nimport { shallowEqual, useSelector } from 'react-redux';\n\nimport styles from './ReadingViewSkeleton.module.scss';\n\nimport verseTextStyles from '@/components/Verse/VerseText.module.scss';\nimport Skeleton from '@/dls/Skeleton/Skeleton';\nimport { selectInlineDisplayWordByWordPreferences } from '@/redux/slices/QuranReader/readingPreferences';\nimport { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles';\nimport { getFontClassName } from '@/utils/fontFaceHelper';\nimport { getMushafLinesNumber } from '@/utils/page';\n\nconst ReadingViewSkeleton = () => {\n const { quranFont, quranTextFontScale, mushafLines } = useSelector(\n selectQuranReaderStyles,\n shallowEqual,\n );\n const { showWordByWordTranslation, showWordByWordTransliteration } = useSelector(\n selectInlineDisplayWordByWordPreferences,\n shallowEqual,\n );\n const numberOfLines = getMushafLinesNumber(quranFont, mushafLines);\n const isWordByWordLayout = showWordByWordTranslation || showWordByWordTransliteration;\n\n return (\n <div className={styles.skeletonContainer}>\n {range(numberOfLines).map((i) => (\n <Skeleton\n key={i}\n className={classNames(\n styles.skeleton,\n verseTextStyles[getFontClassName(quranFont, quranTextFontScale, mushafLines)],\n {\n [styles.fixedWidth]: !isWordByWordLayout,\n },\n )}\n />\n ))}\n </div>\n );\n};\n\nexport default ReadingViewSkeleton;\n","import React, { useEffect, useMemo } from 'react';\n\nimport useSWRImmutable from 'swr/immutable';\n\nimport { getPageNumberByPageIndex } from '../utils/page';\n\nimport Page from './Page';\nimport ReadingViewSkeleton from './ReadingViewSkeleton';\n\nimport { getReaderViewRequestKey, verseFetcher } from '@/components/QuranReader/api';\nimport useIsUsingDefaultSettings from '@/hooks/useIsUsingDefaultSettings';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { VersesResponse } from 'types/ApiResponses';\nimport LookupRecord from 'types/LookupRecord';\nimport Verse from 'types/Verse';\n\ntype Props = {\n pagesVersesRange: Record<number, LookupRecord>;\n quranReaderStyles: QuranReaderStyles;\n reciterId: number;\n lang: string;\n wordByWordLocale: string;\n pageIndex: number;\n setMushafPageToVersesMap: (data: Record<number, Verse[]>) => void;\n initialData: VersesResponse;\n};\n\nconst getPageVersesRange = (\n currentMushafPage: number,\n apiPagesVersesRange: Record<number, LookupRecord>,\n): LookupRecord => {\n const lookupRecord = { ...apiPagesVersesRange[currentMushafPage] };\n // TODO: remove this from BE\n // we remove firstVerseKey and lastVerseKey before we send the params to BE as BE doesn't need them\n delete lookupRecord.firstVerseKey;\n delete lookupRecord.lastVerseKey;\n return lookupRecord;\n};\n\n/**\n * Get the verses returned from the initialData of the first page.\n * This function will filter out all the words that don't\n * belong to the first page in-case we have some verses\n * that contain words that don't belong to the first page\n * (applies to 16-line Indopak Mushaf e.g. /ur/haji/25 or /ur/2/211-216)\n *\n * @param {number} pageNumber\n * @param {Verse[]} initialVerses\n * @returns {Verse[]}\n */\nconst getInitialVerses = (pageNumber: number, initialVerses: Verse[]): Verse[] =>\n initialVerses.map((verse) => ({\n ...verse,\n words: verse.words.filter((word) => word.pageNumber === pageNumber),\n }));\n\n/**\n * A component that will fetch the verses of the current mushaf page\n * and will render a skeleton while it's loading.\n *\n * @param {Props} param0\n * @returns {JSX.Element}\n */\nconst PageContainer: React.FC<Props> = ({\n pagesVersesRange,\n quranReaderStyles,\n reciterId,\n lang,\n wordByWordLocale,\n pageIndex,\n setMushafPageToVersesMap,\n initialData,\n}: Props): JSX.Element => {\n const pageNumber = useMemo(\n () => getPageNumberByPageIndex(pageIndex, pagesVersesRange),\n [pageIndex, pagesVersesRange],\n );\n const initialVerses = useMemo(\n () => (pageIndex === 0 ? getInitialVerses(pageNumber, initialData.verses) : initialData.verses),\n [initialData.verses, pageIndex, pageNumber],\n );\n\n const isUsingDefaultSettings = useIsUsingDefaultSettings();\n const shouldUseInitialData = pageIndex === 0 && isUsingDefaultSettings;\n const { data: verses, isValidating } = useSWRImmutable(\n getReaderViewRequestKey({\n pageNumber,\n pageVersesRange: getPageVersesRange(pageNumber, pagesVersesRange),\n quranReaderStyles,\n reciter: reciterId,\n locale: lang,\n wordByWordLocale,\n }),\n verseFetcher,\n {\n fallbackData: shouldUseInitialData ? initialVerses : null,\n revalidateOnMount: !shouldUseInitialData,\n },\n );\n\n useEffect(() => {\n if (verses) {\n // @ts-ignore\n setMushafPageToVersesMap((prevMushafPageToVersesMap: Record<number, Verse[]>) => ({\n ...prevMushafPageToVersesMap,\n [pageNumber]: verses,\n }));\n }\n }, [pageNumber, setMushafPageToVersesMap, verses]);\n\n if (!verses || isValidating) {\n return <ReadingViewSkeleton />;\n }\n\n return (\n <Page\n verses={verses}\n key={`page-${pageNumber}`}\n pageNumber={Number(pageNumber)}\n quranReaderStyles={quranReaderStyles}\n pageIndex={pageIndex}\n />\n );\n};\n\nexport default PageContainer;\n","import LookupRecord from 'types/LookupRecord';\n\n/**\n * Get the page number by adding the first page number of the current\n * resource e.g. chapter to the item (page) index from the virtualized list.\n *\n * @param {number} pageIndex\n * @param {Record<number, LookupRecord>} pagesVersesRange\n * @returns {number}\n */\nexport const getPageNumberByPageIndex = (\n pageIndex: number,\n pagesVersesRange: Record<number, LookupRecord>,\n): number => Number(Object.keys(pagesVersesRange)[0]) + pageIndex;\n\n/**\n * Get the page index by the page number.\n *\n * @param {number} pageNumber\n * @param {Record<number, LookupRecord>} pagesVersesRange\n * @returns {number}\n */\nexport const getPageIndexByPageNumber = (\n pageNumber: number,\n pagesVersesRange: Record<number, LookupRecord>,\n): number => Number(pageNumber) - Number(Object.keys(pagesVersesRange)[0]);\n\n/**\n * Get the number of pages of the current resource e.g. chapter.\n *\n * @param {number} numberOfVerses\n * @param {number} versesPerPage\n * @returns {number}\n */\nexport const getNumberOfPages = (numberOfVerses: number, versesPerPage: number): number =>\n Math.ceil(numberOfVerses / versesPerPage);\n\n/**\n * Convert a verse index to a page number by dividing the index\n * by how many items there are in a page.\n *\n * @param {number} verseNumber\n * @param {number} versesPerPage\n * @returns {number}\n */\nexport const verseIndexToApiPageNumber = (verseNumber: number, versesPerPage: number): number =>\n Math.floor(verseNumber / versesPerPage) + 1;\n","import React, { useContext } from 'react';\n\nimport { useSelector } from '@xstate/react';\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from './PageNavigationButtons.module.scss';\n\nimport Button, { ButtonSize } from '@/dls/Button/Button';\nimport KeyboardInput from '@/dls/KeyboardInput';\nimport { ContentSide } from '@/dls/Tooltip';\nimport ChevronDownIcon from '@/icons/chevron-down.svg';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\n\ninterface Props {\n scrollToNextPage: () => void;\n scrollToPreviousPage: () => void;\n}\n\nconst PageNavigationButtons: React.FC<Props> = ({ scrollToNextPage, scrollToPreviousPage }) => {\n const { t } = useTranslation('quran-reader');\n const audioService = useContext(AudioPlayerMachineContext);\n const isAudioPlayerHidden = useSelector(audioService, (state) => state.matches('HIDDEN'));\n return (\n <div\n className={classNames(styles.buttonsContainer, {\n [styles.audioPlayerOpen]: !isAudioPlayerHidden,\n })}\n >\n <Button\n size={ButtonSize.Small}\n className={styles.prevButton}\n onClick={scrollToPreviousPage}\n shouldFlipOnRTL={false}\n tooltip={\n <>\n {t('prev-page')} <KeyboardInput invertColors keyboardKey=\"⬆\" />\n </>\n }\n tooltipContentSide={ContentSide.LEFT}\n >\n <ChevronDownIcon />\n </Button>\n <Button\n size={ButtonSize.Small}\n onClick={scrollToNextPage}\n tooltip={\n <>\n {t('next-page')} <KeyboardInput invertColors keyboardKey=\"⬇\" />\n </>\n }\n tooltipContentSide={ContentSide.LEFT}\n >\n <ChevronDownIcon />\n </Button>\n </div>\n );\n};\n\nexport default PageNavigationButtons;\n","/* eslint-disable max-lines */\n/* eslint-disable react-func/max-lines-per-function */\n/* eslint-disable react/no-multi-comp */\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport dynamic from 'next/dynamic';\nimport useTranslation from 'next-translate/useTranslation';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { shallowEqual, useSelector } from 'react-redux';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\n\nimport { getPageIndexByPageNumber } from '../utils/page';\n\nimport useScrollToVirtualizedVerse from './hooks/useScrollToVirtualizedVerse';\nimport PageContainer from './PageContainer';\nimport PageNavigationButtons from './PageNavigationButtons';\nimport styles from './ReadingView.module.scss';\nimport ReadingViewSkeleton from './ReadingViewSkeleton';\n\nimport useFetchPagesLookup from '@/components/QuranReader/hooks/useFetchPagesLookup';\nimport onCopyQuranWords from '@/components/QuranReader/onCopyQuranWords';\nimport QueryParamMessage from '@/components/QuranReader/QueryParamMessage';\nimport Spinner from '@/dls/Spinner/Spinner';\nimport useGetQueryParamOrReduxValue from '@/hooks/useGetQueryParamOrReduxValue';\nimport useGetQueryParamOrXstateValue from '@/hooks/useGetQueryParamOrXstateValue';\nimport useQcfFont from '@/hooks/useQcfFont';\nimport { selectedLastReadPage } from '@/redux/slices/QuranReader/readingTracker';\nimport { selectIsUsingDefaultFont } from '@/redux/slices/QuranReader/styles';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { getLineWidthClassName } from '@/utils/fontFaceHelper';\nimport Error from 'src/pages/_error';\nimport { VersesResponse } from 'types/ApiResponses';\nimport QueryParam from 'types/QueryParam';\nimport { QuranReaderDataType } from 'types/QuranReader';\nimport Verse from 'types/Verse';\n\nconst EndOfScrollingControls = dynamic(\n () => import('@/components/QuranReader/EndOfScrollingControls'),\n {\n ssr: false,\n loading: () => <Spinner />,\n },\n);\n\ntype ReadingViewProps = {\n quranReaderStyles: QuranReaderStyles;\n quranReaderDataType: QuranReaderDataType;\n initialData: VersesResponse;\n resourceId: number | string; // can be the chapter, verse, tafsir, hizb, juz, rub or page's ID.\n};\n\nconst INCREASE_VIEWPORT_BY_PIXELS = 1200;\n\nconst ReadingView = ({\n quranReaderStyles,\n quranReaderDataType,\n initialData,\n resourceId,\n}: ReadingViewProps) => {\n const [mushafPageToVersesMap, setMushafPageToVersesMap] = useState<Record<number, Verse[]>>({\n [initialData.verses[0].pageNumber]: initialData.verses,\n });\n const { lang } = useTranslation('quran-reader');\n const isUsingDefaultFont = useSelector(selectIsUsingDefaultFont);\n const lastReadPageNumber = useSelector(selectedLastReadPage, shallowEqual);\n const verses = useMemo(\n () => Object.values(mushafPageToVersesMap).flat(),\n [mushafPageToVersesMap],\n );\n const {\n value: reciterId,\n isQueryParamDifferent: reciterQueryParamDifferent,\n }: { value: number; isQueryParamDifferent: boolean } = useGetQueryParamOrXstateValue(\n QueryParam.Reciter,\n );\n const {\n value: wordByWordLocale,\n isQueryParamDifferent: wordByWordLocaleQueryParamDifferent,\n }: { value: string; isQueryParamDifferent: boolean } = useGetQueryParamOrReduxValue(\n QueryParam.WBW_LOCALE,\n );\n const { quranFont, mushafLines, quranTextFontScale } = quranReaderStyles;\n useQcfFont(quranFont, verses);\n const { pagesCount, hasError, pagesVersesRange, isLoading } = useFetchPagesLookup(\n resourceId,\n quranReaderDataType,\n initialData,\n quranReaderStyles,\n isUsingDefaultFont,\n );\n const currentPageIndex = useMemo(\n () => getPageIndexByPageNumber(Number(lastReadPageNumber), pagesVersesRange),\n [lastReadPageNumber, pagesVersesRange],\n );\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n useScrollToVirtualizedVerse(\n quranReaderDataType,\n virtuosoRef,\n initialData,\n quranReaderStyles,\n verses,\n pagesVersesRange,\n isUsingDefaultFont,\n quranFont,\n mushafLines,\n isLoading,\n );\n\n const scrollToPreviousPage = useCallback(() => {\n virtuosoRef.current.scrollToIndex({\n index: currentPageIndex - 1,\n align: 'start',\n offset: -35,\n });\n }, [currentPageIndex]);\n\n const scrollToNextPage = useCallback(() => {\n virtuosoRef.current.scrollToIndex({\n index: currentPageIndex + 1,\n align: 'start',\n offset: 25,\n });\n }, [currentPageIndex]);\n\n const onPrevPageClicked = useCallback(() => {\n logButtonClick('reading_view_prev_page_button');\n scrollToPreviousPage();\n }, [scrollToPreviousPage]);\n\n const onNextPageClicked = useCallback(() => {\n logButtonClick('reading_view_next_page_button');\n scrollToNextPage();\n }, [scrollToNextPage]);\n\n const allowKeyboardNavigation = quranTextFontScale <= 5;\n const onUpClicked = useCallback(\n (event: KeyboardEvent) => {\n event.preventDefault();\n scrollToPreviousPage();\n },\n [scrollToPreviousPage],\n );\n\n const onDownClicked = useCallback(\n (event: KeyboardEvent) => {\n event.preventDefault();\n scrollToNextPage();\n },\n [scrollToNextPage],\n );\n\n useHotkeys('Up', onUpClicked, { enabled: allowKeyboardNavigation }, [scrollToPreviousPage]);\n useHotkeys('Down', onDownClicked, { enabled: allowKeyboardNavigation }, [scrollToNextPage]);\n\n const itemContentRenderer = (pageIndex: number) => {\n if (pageIndex === pagesCount) {\n const pageVerses = mushafPageToVersesMap[lastReadPageNumber];\n const lastVerse = pageVerses?.[pageVerses.length - 1];\n if (!lastVerse) return null;\n\n return (\n <EndOfScrollingControls\n quranReaderDataType={quranReaderDataType}\n lastVerse={lastVerse}\n initialData={initialData}\n />\n );\n }\n\n return (\n <PageContainer\n pagesVersesRange={pagesVersesRange}\n quranReaderStyles={quranReaderStyles}\n reciterId={reciterId}\n lang={lang}\n wordByWordLocale={wordByWordLocale}\n pageIndex={pageIndex}\n setMushafPageToVersesMap={setMushafPageToVersesMap}\n initialData={initialData}\n />\n );\n };\n\n if (hasError) {\n return <Error />;\n }\n\n const shouldShowQueryParamMessage =\n reciterQueryParamDifferent || wordByWordLocaleQueryParamDifferent;\n\n return (\n <>\n {shouldShowQueryParamMessage && (\n <QueryParamMessage\n translationsQueryParamDifferent={false}\n reciterQueryParamDifferent={reciterQueryParamDifferent}\n wordByWordLocaleQueryParamDifferent={wordByWordLocaleQueryParamDifferent}\n />\n )}\n <div\n onCopy={(event) => onCopyQuranWords(event, verses, quranFont)}\n className={classNames(\n styles.container,\n styles[getLineWidthClassName(quranFont, quranTextFontScale, mushafLines)],\n )}\n >\n {isLoading ? (\n <div className={styles.virtuosoScroller}>\n <ReadingViewSkeleton />\n </div>\n ) : (\n <Virtuoso\n ref={virtuosoRef}\n useWindowScroll\n increaseViewportBy={INCREASE_VIEWPORT_BY_PIXELS}\n className={styles.virtuosoScroller}\n initialItemCount={1} // needed for SSR.\n totalCount={pagesCount + 1}\n itemContent={itemContentRenderer}\n />\n )}\n </div>\n {allowKeyboardNavigation && (\n <PageNavigationButtons\n scrollToNextPage={onNextPageClicked}\n scrollToPreviousPage={onPrevPageClicked}\n />\n )}\n </>\n );\n};\n\nexport default ReadingView;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"line\":\"Line_line__3jPyY\",\"container\":\"Line_container__CApVP\",\"mobileInline\":\"Line_mobileInline__jEjq9\",\"fixedWidth\":\"Line_fixedWidth__AHk9W\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"fallback_qpc_uthmani_hafs-line-width-1\":\"Page_fallback_qpc_uthmani_hafs-line-width-1__X9dUi\",\"fallback_qpc_uthmani_hafs-line-width-2\":\"Page_fallback_qpc_uthmani_hafs-line-width-2__prdZQ\",\"fallback_qpc_uthmani_hafs-line-width-3\":\"Page_fallback_qpc_uthmani_hafs-line-width-3__CpdkI\",\"fallback_qpc_uthmani_hafs-line-width-4\":\"Page_fallback_qpc_uthmani_hafs-line-width-4__bpdKT\",\"fallback_qpc_uthmani_hafs-line-width-5\":\"Page_fallback_qpc_uthmani_hafs-line-width-5__r0dhC\",\"fallback_qpc_uthmani_hafs-line-width-6\":\"Page_fallback_qpc_uthmani_hafs-line-width-6__hNehk\",\"fallback_qpc_uthmani_hafs-line-width-7\":\"Page_fallback_qpc_uthmani_hafs-line-width-7__W627r\",\"fallback_qpc_uthmani_hafs-line-width-8\":\"Page_fallback_qpc_uthmani_hafs-line-width-8__obMGX\",\"fallback_qpc_uthmani_hafs-line-width-9\":\"Page_fallback_qpc_uthmani_hafs-line-width-9__uE3Np\",\"fallback_qpc_uthmani_hafs-line-width-10\":\"Page_fallback_qpc_uthmani_hafs-line-width-10__g_Coa\",\"container\":\"Page_container__hkXnW\",\"mobileCenterText\":\"Page_mobileCenterText__WB1en\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"pageText\":\"PageFooter_pageText__YdcIS\",\"pageLink\":\"PageFooter_pageLink__YT3wq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"buttonsContainer\":\"PageNavigationButtons_buttonsContainer__fomTO\",\"prevButton\":\"PageNavigationButtons_prevButton__OOwCQ\",\"audioPlayerOpen\":\"PageNavigationButtons_audioPlayerOpen__sIOdL\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"code_v1-line-width-1\":\"ReadingView_code_v1-line-width-1__u_hC8\",\"code_v1-line-width-2\":\"ReadingView_code_v1-line-width-2__Hf8MJ\",\"code_v1-line-width-3\":\"ReadingView_code_v1-line-width-3__C3GX9\",\"code_v1-line-width-4\":\"ReadingView_code_v1-line-width-4__JF_zd\",\"code_v1-line-width-5\":\"ReadingView_code_v1-line-width-5__6kO9e\",\"code_v1-line-width-6\":\"ReadingView_code_v1-line-width-6__Xmg9T\",\"code_v1-line-width-7\":\"ReadingView_code_v1-line-width-7__5DID0\",\"code_v1-line-width-8\":\"ReadingView_code_v1-line-width-8__QSPjI\",\"code_v1-line-width-9\":\"ReadingView_code_v1-line-width-9__g4KUg\",\"code_v1-line-width-10\":\"ReadingView_code_v1-line-width-10__EbYvu\",\"code_v2-line-width-1\":\"ReadingView_code_v2-line-width-1__LKGTJ\",\"code_v2-line-width-2\":\"ReadingView_code_v2-line-width-2__XxvSm\",\"code_v2-line-width-3\":\"ReadingView_code_v2-line-width-3__boomP\",\"code_v2-line-width-4\":\"ReadingView_code_v2-line-width-4__jii3F\",\"code_v2-line-width-5\":\"ReadingView_code_v2-line-width-5__yh418\",\"code_v2-line-width-6\":\"ReadingView_code_v2-line-width-6__PmlQ_\",\"code_v2-line-width-7\":\"ReadingView_code_v2-line-width-7__L3zwX\",\"code_v2-line-width-8\":\"ReadingView_code_v2-line-width-8__fodHn\",\"code_v2-line-width-9\":\"ReadingView_code_v2-line-width-9__R51Sk\",\"code_v2-line-width-10\":\"ReadingView_code_v2-line-width-10__aRnmF\",\"text_indopak_15_lines-line-width-1\":\"ReadingView_text_indopak_15_lines-line-width-1__HIvVb\",\"text_indopak_15_lines-line-width-2\":\"ReadingView_text_indopak_15_lines-line-width-2__COw_J\",\"text_indopak_15_lines-line-width-3\":\"ReadingView_text_indopak_15_lines-line-width-3__x0I0x\",\"text_indopak_15_lines-line-width-4\":\"ReadingView_text_indopak_15_lines-line-width-4__oxtcz\",\"text_indopak_15_lines-line-width-5\":\"ReadingView_text_indopak_15_lines-line-width-5__CIg5C\",\"text_indopak_15_lines-line-width-6\":\"ReadingView_text_indopak_15_lines-line-width-6__e8_Zq\",\"text_indopak_15_lines-line-width-7\":\"ReadingView_text_indopak_15_lines-line-width-7__R1c56\",\"text_indopak_15_lines-line-width-8\":\"ReadingView_text_indopak_15_lines-line-width-8__f1hhH\",\"text_indopak_15_lines-line-width-9\":\"ReadingView_text_indopak_15_lines-line-width-9__e_Fhh\",\"text_indopak_15_lines-line-width-10\":\"ReadingView_text_indopak_15_lines-line-width-10__av8qG\",\"text_indopak_16_lines-line-width-1\":\"ReadingView_text_indopak_16_lines-line-width-1__wEGW4\",\"text_indopak_16_lines-line-width-2\":\"ReadingView_text_indopak_16_lines-line-width-2__AeVXj\",\"text_indopak_16_lines-line-width-3\":\"ReadingView_text_indopak_16_lines-line-width-3__UEeqd\",\"text_indopak_16_lines-line-width-4\":\"ReadingView_text_indopak_16_lines-line-width-4__2Nw2u\",\"text_indopak_16_lines-line-width-5\":\"ReadingView_text_indopak_16_lines-line-width-5__r2tKN\",\"text_indopak_16_lines-line-width-6\":\"ReadingView_text_indopak_16_lines-line-width-6__ybw6l\",\"text_indopak_16_lines-line-width-7\":\"ReadingView_text_indopak_16_lines-line-width-7____CTX\",\"text_indopak_16_lines-line-width-8\":\"ReadingView_text_indopak_16_lines-line-width-8__ymIE0\",\"text_indopak_16_lines-line-width-9\":\"ReadingView_text_indopak_16_lines-line-width-9__MKM2y\",\"text_indopak_16_lines-line-width-10\":\"ReadingView_text_indopak_16_lines-line-width-10__XhBAV\",\"qpc_uthmani_hafs-line-width-1\":\"ReadingView_qpc_uthmani_hafs-line-width-1__1ArHr\",\"qpc_uthmani_hafs-line-width-2\":\"ReadingView_qpc_uthmani_hafs-line-width-2__I6rKn\",\"qpc_uthmani_hafs-line-width-3\":\"ReadingView_qpc_uthmani_hafs-line-width-3__jIQg8\",\"qpc_uthmani_hafs-line-width-4\":\"ReadingView_qpc_uthmani_hafs-line-width-4__RXw5a\",\"qpc_uthmani_hafs-line-width-5\":\"ReadingView_qpc_uthmani_hafs-line-width-5__eO8Fo\",\"qpc_uthmani_hafs-line-width-6\":\"ReadingView_qpc_uthmani_hafs-line-width-6__TbgkW\",\"qpc_uthmani_hafs-line-width-7\":\"ReadingView_qpc_uthmani_hafs-line-width-7__RoJmi\",\"qpc_uthmani_hafs-line-width-8\":\"ReadingView_qpc_uthmani_hafs-line-width-8__m_AJa\",\"qpc_uthmani_hafs-line-width-9\":\"ReadingView_qpc_uthmani_hafs-line-width-9___DGtD\",\"qpc_uthmani_hafs-line-width-10\":\"ReadingView_qpc_uthmani_hafs-line-width-10__uNVi7\",\"tajweed-line-width-1\":\"ReadingView_tajweed-line-width-1__XzcHo\",\"tajweed-line-width-2\":\"ReadingView_tajweed-line-width-2__qI_3N\",\"tajweed-line-width-3\":\"ReadingView_tajweed-line-width-3__iPATb\",\"tajweed-line-width-4\":\"ReadingView_tajweed-line-width-4___gTZv\",\"tajweed-line-width-5\":\"ReadingView_tajweed-line-width-5__8creJ\",\"tajweed-line-width-6\":\"ReadingView_tajweed-line-width-6__mqO8v\",\"tajweed-line-width-7\":\"ReadingView_tajweed-line-width-7__p1Oi4\",\"tajweed-line-width-8\":\"ReadingView_tajweed-line-width-8__js74h\",\"tajweed-line-width-9\":\"ReadingView_tajweed-line-width-9__gjjDU\",\"tajweed-line-width-10\":\"ReadingView_tajweed-line-width-10__xBOUh\",\"container\":\"ReadingView_container__99RFM\",\"virtuosoScroller\":\"ReadingView_virtuosoScroller__Y3HA6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"skeletonContainer\":\"ReadingViewSkeleton_skeletonContainer__h5Sb2\",\"skeleton\":\"ReadingViewSkeleton_skeleton__hw8ZE\",\"fixedWidth\":\"ReadingViewSkeleton_fixedWidth__fIRzb\"};"],"names":["getVersePositionWithinAMushafPage","startingVerseKey","mushafPageNumber","pagesVersesRange","pageStartVerseNumber","getVerseNumberFromKey","from","pageEndVerseNumber","to","verseKeyPosition","ScrollAlign","quranReaderDataType","virtuosoRef","initialData","quranReaderStyles","verses","isUsingDefaultFont","quranFont","mushafLines","isPagesLookupLoading","router","useRouter","query","startingVerse","chapterId","shouldScroll","useRef","useEffect","current","Object","keys","length","QuranReaderDataType","startingVerseNumber","Number","isInteger","firstPageOfCurrentChapter","pageNumber","startFromVerseData","find","verse","verseNumber","scrollToPageIndex","scrollToIndex","index","align","fetcher","makeVersesFilterUrl","filters","fields","getMushafId","then","response","words","forEach","getVerseWords","groupBy","word","lineNumber","Line","lineKey","isBigTextLayout","pageIndex","lineIndex","audioService","useContext","AudioPlayerMachineContext","isHighlighted","useXstateSelector","state","context","surah","ayahNumber","map","verseKey","includes","useScroll","SMOOTH_SCROLL_TO_CENTER","scrollToSelectedItem","selectedItemRef","useOnboarding","isActive","enableAutoScrolling","useSelector","selectEnableAutoScrolling","shallowEqual","selectInlineDisplayWordByWordPreferences","showWordByWordTranslation","showWordByWordTransliteration","firstWordData","getWordDataByLocation","location","shouldShowChapterHeader","isWordByWordLayout","div","ref","id","className","classNames","styles","ChapterHeader","hizbNumber","VerseText","isReadingMode","shouldShowH1ForSEO","areLinesEqual","prevProps","nextProps","verseFontChanged","memo","page","useTranslation","lang","pageUrl","getPageNavigationUrl","Link","href","shouldPassHref","shouldPrefetch","p","toLocalizedNumber","lines","useMemo","groupLinesByVerses","quranTextFontScale","QuranFont","isFontLoaded","useIsFontLoaded","getLineWidthClassName","FALLBACK_FONT","key","PageFooter","selectQuranReaderStyles","numberOfLines","getMushafLinesNumber","range","i","Skeleton","verseTextStyles","getFontClassName","getPageVersesRange","currentMushafPage","apiPagesVersesRange","lookupRecord","firstVerseKey","lastVerseKey","reciterId","wordByWordLocale","setMushafPageToVersesMap","getPageNumberByPageIndex","initialVerses","filter","getInitialVerses","isUsingDefaultSettings","useIsUsingDefaultSettings","shouldUseInitialData","useSWRImmutable","getReaderViewRequestKey","pageVersesRange","reciter","locale","verseFetcher","fallbackData","revalidateOnMount","data","isValidating","prevMushafPageToVersesMap","ReadingViewSkeleton","Page","scrollToNextPage","scrollToPreviousPage","t","isAudioPlayerHidden","matches","Button","size","ButtonSize","onClick","shouldFlipOnRTL","tooltip","KeyboardInput","invertColors","keyboardKey","tooltipContentSide","ContentSide","ChevronDownIcon","EndOfScrollingControls","dynamic","ssr","loading","Spinner","resourceId","useState","mushafPageToVersesMap","selectIsUsingDefaultFont","lastReadPageNumber","selectedLastReadPage","values","flat","useGetQueryParamOrXstateValue","QueryParam","value","isQueryParamDifferent","useGetQueryParamOrReduxValue","useQcfFont","useFetchPagesLookup","pagesCount","hasError","isLoading","currentPageIndex","getPageIndexByPageNumber","useScrollToVirtualizedVerse","useCallback","offset","onPrevPageClicked","logButtonClick","onNextPageClicked","allowKeyboardNavigation","onUpClicked","event","preventDefault","onDownClicked","useHotkeys","enabled","Error","shouldShowQueryParamMessage","reciterQueryParamDifferent","wordByWordLocaleQueryParamDifferent","QueryParamMessage","translationsQueryParamDifferent","onCopy","onCopyQuranWords","Virtuoso","useWindowScroll","increaseViewportBy","initialItemCount","totalCount","itemContent","pageVerses","lastVerse","PageContainer","PageNavigationButtons","module","exports"],"sourceRoot":""}