90893-0c8ee5c13a30470d.js.map 243 KB

1
  1. {"version":3,"file":"static/chunks/90893-0c8ee5c13a30470d.js","mappings":"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","sources":["webpack://_N_E/./public/icons/book.svg","webpack://_N_E/./public/icons/bookmark.svg","webpack://_N_E/./public/icons/info.svg","webpack://_N_E/./public/icons/notes-empty.svg","webpack://_N_E/./public/icons/notes-filled.svg","webpack://_N_E/./public/icons/pause.svg","webpack://_N_E/./public/icons/play-arrow.svg","webpack://_N_E/./public/icons/reader.svg","webpack://_N_E/./node_modules/clipboard-copy/index.js","webpack://_N_E/./node_modules/lodash/_asciiToArray.js","webpack://_N_E/./node_modules/lodash/_baseSlice.js","webpack://_N_E/./node_modules/lodash/_castSlice.js","webpack://_N_E/./node_modules/lodash/_createCaseFirst.js","webpack://_N_E/./node_modules/lodash/_hasUnicode.js","webpack://_N_E/./node_modules/lodash/_stringToArray.js","webpack://_N_E/./node_modules/lodash/_unicodeToArray.js","webpack://_N_E/./node_modules/lodash/capitalize.js","webpack://_N_E/./node_modules/lodash/upperFirst.js","webpack://_N_E/./src/components/NextSeoWrapper.tsx","webpack://_N_E/./src/components/QuranReader/QueryParamMessage/index.tsx","webpack://_N_E/./src/components/QuranReader/RevelationOrderNavigationNotice.tsx","webpack://_N_E/./src/components/QuranReader/api.ts","webpack://_N_E/./src/components/QuranReader/hooks/useFetchPagesLookup.ts","webpack://_N_E/./src/components/QuranReader/ReadingPreferenceSwitcher/ReadingPreferenceOption.tsx","webpack://_N_E/./src/components/QuranReader/ReadingPreferenceSwitcher/index.tsx","webpack://_N_E/./src/components/QuranReader/ContextMenu.tsx","webpack://_N_E/./src/components/QuranReader/contexts/VerseTrackerContext.tsx","webpack://_N_E/./src/components/QuranReader/DebuggingObserverWindow/index.tsx","webpack://_N_E/./src/components/QuranReader/Notes/Notes.tsx","webpack://_N_E/./src/hooks/useGlobalIntersectionObserver.ts","webpack://_N_E/./src/utils/mergeVerseKeys.ts","webpack://_N_E/./src/components/Verse/Notes/index.tsx","webpack://_N_E/./src/components/QuranReader/hooks/useSyncReadingProgress.ts","webpack://_N_E/./src/components/QuranReader/TranslationView/hooks/useGetVersesCount.ts","webpack://_N_E/./src/components/QuranReader/TranslationView/hooks/useScrollToVirtualizedVerse.ts","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationViewVerse/hooks/useDedupedFetchVerse.ts","webpack://_N_E/./src/components/QuranReader/TranslationView/BookmarkIcon.tsx","webpack://_N_E/./src/components/dls/Badge/NewLabel/index.tsx","webpack://_N_E/./src/components/Verse/VerseLink/index.tsx","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationViewCell.tsx","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationViewVerse/TranslationPageVerse.tsx","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationViewVerse/index.tsx","webpack://_N_E/./src/components/QuranReader/TranslationView/index.tsx","webpack://_N_E/./src/components/QuranReader/QuranReaderView.tsx","webpack://_N_E/./src/components/QuranReader/SidebarNavigation/SidebarSelectionSkeleton.tsx","webpack://_N_E/./src/components/QuranReader/SidebarNavigation/SidebarNavigationSelections.tsx","webpack://_N_E/./src/components/QuranReader/SidebarNavigation/SidebarNavigation.tsx","webpack://_N_E/./src/components/QuranReader/index.tsx","webpack://_N_E/./src/components/QuranReader/onCopyQuranWords.ts","webpack://_N_E/./src/components/QuranReader/utils/memoization.ts","webpack://_N_E/./src/components/Verse/pageUtils.ts","webpack://_N_E/./src/components/Verse/VerseText.tsx","webpack://_N_E/./public/bismillah.svg","webpack://_N_E/./src/components/QuranReader/PlayChapterAudioButton.tsx","webpack://_N_E/./src/components/dls/Bismillah/Bismillah.tsx","webpack://_N_E/./src/components/chapters/ChapterHeader/index.tsx","webpack://_N_E/./src/components/chapters/ChapterIcon/ChapterIconContainer.tsx","webpack://_N_E/./src/components/chapters/ChapterIcon/index.tsx","webpack://_N_E/./src/components/dls/Badge/Badge.tsx","webpack://_N_E/./src/components/dls/KeyboardInput/index.tsx","webpack://_N_E/./src/hooks/auth/useCountRangeNotes.ts","webpack://_N_E/./src/hooks/useIsUsingDefaultSettings.tsx","webpack://_N_E/./src/hooks/useObserveElement.ts","webpack://_N_E/./src/hooks/useScrollToElement.ts","webpack://_N_E/./src/pages/_error.tsx","webpack://_N_E/./src/utils/activity-day.ts","webpack://_N_E/./src/utils/juz.ts","webpack://_N_E/./src/utils/page.ts","webpack://_N_E/./src/utils/string.ts","webpack://_N_E/./src/utils/validator.ts","webpack://_N_E/./src/utils/word.ts","webpack://_N_E/./types/ScrollAlign.ts","webpack://_N_E/./src/components/QuranReader/ContextMenu.module.scss","webpack://_N_E/./src/components/QuranReader/DebuggingObserverWindow/ObserverWindow.module.scss","webpack://_N_E/./src/components/QuranReader/Notes/Notes.module.scss","webpack://_N_E/./src/components/QuranReader/PlayButton.module.scss","webpack://_N_E/./src/components/QuranReader/QueryParamMessage/QueryParamMessage.module.scss","webpack://_N_E/./src/components/QuranReader/QuranReader.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingPreferenceSwitcher/ReadingPreference.module.scss","webpack://_N_E/./src/components/QuranReader/ReadingPreferenceSwitcher/ReadingPreferenceSwitcher.module.scss","webpack://_N_E/./src/components/QuranReader/RevelationOrderNavigationNotice.module.scss","webpack://_N_E/./src/components/QuranReader/SidebarNavigation/SidebarNavigation.module.scss","webpack://_N_E/./src/components/QuranReader/SidebarNavigation/SidebarSelectionSkeleton.module.scss","webpack://_N_E/./src/components/QuranReader/TranslationView/TranslationView.module.scss","webpack://_N_E/./src/components/Verse/Notes/Notes.module.scss","webpack://_N_E/./src/components/Verse/VerseLink/VerseLink.module.scss","webpack://_N_E/./src/components/chapters/ChapterHeader/ChapterHeader.module.scss","webpack://_N_E/./src/components/chapters/ChapterIcon/ChapterIconContainer.module.scss","webpack://_N_E/./src/components/dls/Badge/Badge.module.scss","webpack://_N_E/./src/components/dls/Badge/NewLabel/NewLabel.module.scss","webpack://_N_E/./src/components/dls/KeyboardInput/KeyboardInput.module.scss","webpack://_N_E/./src/pages/_error.module.scss"],"sourcesContent":["var _path, _path2;\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 SvgBook = function SvgBook(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\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\"\n })));\n};\nexport default SvgBook;","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 SvgBookmark = function SvgBookmark(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: \"currentColor\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n className: \"feather feather-bookmark\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m19 21-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\"\n })));\n};\nexport default SvgBookmark;","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 SvgInfo = function SvgInfo(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: \"M11.625 0C5.208 0 0 5.208 0 11.625S5.208 23.25 11.625 23.25 23.25 18.042 23.25 11.625 18.042 0 11.625 0Zm1.162 17.438h-2.325v-6.975h2.325v6.975Zm0-9.3h-2.325V5.812h2.325v2.324Z\",\n fill: \"currentColor\"\n })));\n};\nexport default SvgInfo;","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 SvgNotesEmpty = function SvgNotesEmpty(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 15,\n height: 15,\n viewBox: \"0 0 15 15\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M3 2.5a.5.5 0 0 1 .5-.5h5.586a.5.5 0 0 1 .353.146l2.415 2.415a.5.5 0 0 1 .146.353V12.5a.5.5 0 0 1-.5.5h-8a.5.5 0 0 1-.5-.5v-10ZM3.5 1A1.5 1.5 0 0 0 2 2.5v10A1.5 1.5 0 0 0 3.5 14h8a1.5 1.5 0 0 0 1.5-1.5V4.914a1.5 1.5 0 0 0-.44-1.06l-2.414-2.415A1.5 1.5 0 0 0 9.086 1H3.5Zm1 3a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1h-3Zm0 3a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1h-6Zm0 3a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1h-6Z\",\n fill: \"currentColor\",\n fillRule: \"evenodd\",\n clipRule: \"evenodd\"\n })));\n};\nexport default SvgNotesEmpty;","var _path, _path2;\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 SvgNotesFilled = function SvgNotesFilled(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"1.928 0.875 11.023 13.01\",\n width: 11.023,\n height: 13.01,\n xmlns: \"http://www.w3.org/2000/svg\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M3.451.875a1.5 1.5 0 0 0-1.5 1.5v10a1.5 1.5 0 0 0 1.5 1.5h8a1.5 1.5 0 0 0 1.5-1.5V4.789c0-.398-.158-.779-.439-1.061l-2.414-2.414A1.5 1.5 0 0 0 9.037.875H3.451Z\",\n fill: \"#00abff\",\n fillRule: \"evenodd\",\n clipRule: \"evenodd\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M2.928 2.385a.5.5 0 0 1 .5-.5h5.586a.5.5 0 0 1 .354.146l2.414 2.414a.5.5 0 0 1 .146.354v7.586a.5.5 0 0 1-.5.5h-8a.5.5 0 0 1-.5-.5v-10Zm.5-1.5a1.5 1.5 0 0 0-1.5 1.5v10a1.5 1.5 0 0 0 1.5 1.5h8a1.5 1.5 0 0 0 1.5-1.5V4.799c0-.398-.158-.779-.439-1.061l-2.414-2.414A1.5 1.5 0 0 0 9.014.885H3.428Zm1 3a.5.5 0 0 0 0 1h3a.5.5 0 1 0 0-1h-3Zm0 3a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1h-6Zm0 3a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1h-6Z\",\n fillRule: \"evenodd\",\n clipRule: \"evenodd\"\n })));\n};\nexport default SvgNotesFilled;","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 SvgPause = function SvgPause(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 20h4.571V4H5v16Zm9.143-16v16h4.571V4h-4.571Z\",\n fill: \"currentColor\"\n })));\n};\nexport default SvgPause;","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 SvgPlayArrow = function SvgPlayArrow(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: \"M4 2v20.364l16-10.182L4 2Z\",\n fill: \"currentColor\"\n })));\n};\nexport default SvgPlayArrow;","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 SvgReader = function SvgReader(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: \"M3 .623v22.004c0 .165.067.324.186.44a.64.64 0 0 0 .448.183h17.332a.64.64 0 0 0 .448-.182.617.617 0 0 0 .186-.44V.622a.617.617 0 0 0-.186-.44.64.64 0 0 0-.448-.183H3.634a.64.64 0 0 0-.448.182.617.617 0 0 0-.186.44Zm10.146 13.493H7.227v-1.66h5.918v1.66Zm4.227-4.152H7.227v-1.66h10.146v1.66Zm0-4.152H7.227v-1.66h10.146v1.66Z\"\n })));\n};\nexport default SvgReader;","/*! clipboard-copy. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* global DOMException */\n\nmodule.exports = clipboardCopy\n\nfunction makeError () {\n return new DOMException('The request is not allowed', 'NotAllowedError')\n}\n\nasync function copyClipboardApi (text) {\n // Use the Async Clipboard API when available. Requires a secure browsing\n // context (i.e. HTTPS)\n if (!navigator.clipboard) {\n throw makeError()\n }\n return navigator.clipboard.writeText(text)\n}\n\nasync function copyExecCommand (text) {\n // Put the text to copy into a <span>\n const span = document.createElement('span')\n span.textContent = text\n\n // Preserve consecutive spaces and newlines\n span.style.whiteSpace = 'pre'\n span.style.webkitUserSelect = 'auto'\n span.style.userSelect = 'all'\n\n // Add the <span> to the page\n document.body.appendChild(span)\n\n // Make a selection object representing the range of text selected by the user\n const selection = window.getSelection()\n const range = window.document.createRange()\n selection.removeAllRanges()\n range.selectNode(span)\n selection.addRange(range)\n\n // Copy text to the clipboard\n let success = false\n try {\n success = window.document.execCommand('copy')\n } finally {\n // Cleanup\n selection.removeAllRanges()\n window.document.body.removeChild(span)\n }\n\n if (!success) throw makeError()\n}\n\nasync function clipboardCopy (text) {\n try {\n await copyClipboardApi(text)\n } catch (err) {\n // ...Otherwise, use document.execCommand() fallback\n try {\n await copyExecCommand(text)\n } catch (err2) {\n throw (err2 || err || makeError())\n }\n }\n}\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var castSlice = require('./_castSlice'),\n hasUnicode = require('./_hasUnicode'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\nmodule.exports = createCaseFirst;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n","var toString = require('./toString'),\n upperFirst = require('./upperFirst');\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\nmodule.exports = capitalize;\n","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n","import React from 'react';\n\nimport { NextSeo } from 'next-seo';\n\nimport { SEOProps } from '@/utils/seo';\nimport { truncateString } from '@/utils/string';\n\ninterface Props extends SEOProps {\n url?: string;\n image?: string;\n imageAlt?: string;\n imageWidth?: number;\n imageHeight?: number;\n}\n\nconst NextSeoWrapper: React.FC<Props> = (props) => {\n const { url, image, imageAlt, imageHeight, imageWidth, openGraph, description, ...rest } = props;\n const openGraphParams = {\n ...(openGraph && { openGraph }),\n ...(url && { url }),\n ...(image && {\n images: [{ url: image, width: imageWidth, height: imageHeight, alt: imageAlt }],\n }),\n };\n const params = {\n ...rest,\n ...(description && { description: truncateString(description, 150) }),\n };\n return <NextSeo {...params} openGraph={openGraphParams} />;\n};\n\nexport default NextSeoWrapper;\n","/* eslint-disable react-func/max-lines-per-function */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport React, { useContext } from 'react';\n\nimport { useSelector as useXstateSelector } from '@xstate/react';\nimport { useRouter } from 'next/router';\nimport Trans from 'next-translate/Trans';\nimport useTranslation from 'next-translate/useTranslation';\nimport { shallowEqual, useSelector } from 'react-redux';\n\nimport styles from './QueryParamMessage.module.scss';\n\nimport usePersistPreferenceGroup from '@/hooks/auth/usePersistPreferenceGroup';\nimport {\n selectWordByWordLocale,\n setSelectedWordByWordLocale,\n} from '@/redux/slices/QuranReader/readingPreferences';\nimport {\n selectSelectedTranslations,\n setSelectedTranslations,\n} from '@/redux/slices/QuranReader/translations';\nimport PreferenceGroup from '@/types/auth/PreferenceGroup';\nimport { QuranReaderFlow } from '@/types/QuranReader';\nimport { areArraysEqual } from '@/utils/array';\nimport { isValidTranslationsQueryParamValue } from '@/utils/queryParamValidator';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\nimport QueryParam from 'types/QueryParam';\n\ninterface Props {\n translationsQueryParamDifferent: boolean;\n reciterQueryParamDifferent: boolean;\n wordByWordLocaleQueryParamDifferent: boolean;\n}\n\nconst QueryParamMessage: React.FC<Props> = ({\n translationsQueryParamDifferent,\n reciterQueryParamDifferent,\n wordByWordLocaleQueryParamDifferent,\n}) => {\n const { lang } = useTranslation('common');\n const router = useRouter();\n const audioService = useContext(AudioPlayerMachineContext);\n const selectedTranslations = useSelector(selectSelectedTranslations, areArraysEqual);\n const selectedReciterId = useXstateSelector(audioService, (state) => state.context.reciterId);\n const selectedWordByWordLocale = useSelector(selectWordByWordLocale, shallowEqual);\n const {\n actions: { onSettingsChange, onXstateSettingsChange },\n } = usePersistPreferenceGroup();\n\n /**\n * When the use clicks on use Redux, we will import the values from redux and\n * push them into the url params so that the useGetQueryParamOrReduxValue hook\n * picks and applies them.\n */\n const onResetToReduxStateClicked = () => {\n if (translationsQueryParamDifferent) {\n router.query[QueryParam.Translations] = selectedTranslations.join(',');\n }\n if (reciterQueryParamDifferent) {\n router.query[QueryParam.Reciter] = String(selectedReciterId);\n }\n if (wordByWordLocaleQueryParamDifferent) {\n router.query[QueryParam.WBW_LOCALE] = selectedWordByWordLocale;\n }\n // if is in Quranic Calendar flow, remove the flow query param\n if (router.query[QueryParam.FLOW] === QuranReaderFlow.QURANIC_CALENDER) {\n delete router.query[QueryParam.FLOW];\n // if hide arabic is true, remove it so that the arabic text get shown again\n if (router.query[QueryParam.HIDE_ARABIC] === 'true') {\n delete router.query[QueryParam.HIDE_ARABIC];\n }\n }\n\n router.push(router, undefined, { shallow: true });\n };\n\n /**\n * When the use clicks on persist query params, we will persist the values\n * from the query params into Redux.\n */\n const onPersistQueryParamsClicked = () => {\n if (\n translationsQueryParamDifferent &&\n isValidTranslationsQueryParamValue(router.query[QueryParam.Translations] as string)\n ) {\n const nextTranslations = (router.query[QueryParam.Translations] as string)\n .split(',')\n .map((stringValue) => Number(stringValue));\n\n onSettingsChange(\n 'selectedTranslations',\n nextTranslations,\n setSelectedTranslations({ translations: nextTranslations, locale: lang }),\n setSelectedTranslations({ translations: selectedTranslations, locale: lang }),\n PreferenceGroup.TRANSLATIONS,\n );\n }\n\n if (wordByWordLocaleQueryParamDifferent) {\n const nextWordByWord = router.query[QueryParam.WBW_LOCALE] as string;\n onSettingsChange(\n 'selectedWordByWordLocale',\n nextWordByWord,\n setSelectedWordByWordLocale({ value: nextWordByWord, locale: lang }),\n setSelectedWordByWordLocale({ value: selectedWordByWordLocale, locale: lang }),\n PreferenceGroup.READING,\n );\n }\n\n if (reciterQueryParamDifferent) {\n const nextReciterId = Number(router.query[QueryParam.Reciter]);\n onXstateSettingsChange(\n 'reciter',\n nextReciterId,\n () => audioService.send({ type: 'CHANGE_RECITER', reciterId: nextReciterId }),\n () => audioService.send({ type: 'CHANGE_RECITER', reciterId: selectedReciterId }),\n PreferenceGroup.AUDIO,\n );\n }\n };\n\n return (\n <div className={styles.container}>\n <Trans\n i18nKey=\"quran-reader:query-param-message\"\n components={[\n <span key={0} onClick={onResetToReduxStateClicked} className={styles.link} />,\n <span key={1} onClick={onPersistQueryParamsClicked} className={styles.link} />,\n ]}\n />\n </div>\n );\n};\n\nexport default QueryParamMessage;\n","import classNames from 'classnames';\nimport Trans from 'next-translate/Trans';\n\nimport styles from './RevelationOrderNavigationNotice.module.scss';\n\nimport Spinner from '@/dls/Spinner/Spinner';\nimport usePersistPreferenceGroup from '@/hooks/auth/usePersistPreferenceGroup';\nimport { setIsReadingByRevelationOrder } from '@/redux/slices/revelationOrder';\nimport PreferenceGroup from '@/types/auth/PreferenceGroup';\nimport { logButtonClick } from '@/utils/eventLogger';\n\nexport enum RevelationOrderNavigationNoticeView {\n SideDrawer = 'side-drawer',\n EndOfScrollingControls = 'end-of-scrolling-controls',\n}\n\ntype Props = {\n view?: RevelationOrderNavigationNoticeView;\n};\n\n// A notice that lets users know that the ordering and navigation are not the default ones.\nconst RevelationOrderNavigationNotice = ({ view }: Props) => {\n const {\n actions: { onSettingsChange },\n isLoading,\n } = usePersistPreferenceGroup();\n\n const revertToDefaultOrdering = () => {\n onSettingsChange(\n 'isReadingByRevelationOrder',\n false,\n setIsReadingByRevelationOrder(false),\n setIsReadingByRevelationOrder(true),\n PreferenceGroup.READING,\n );\n logButtonClick(`revert_to_default_ordering_${view}`);\n };\n\n return (\n <div\n className={classNames({\n [styles.sideDrawerViewContainer]: view === RevelationOrderNavigationNoticeView.SideDrawer,\n [styles.endOfScrollingViewContainer]:\n view === RevelationOrderNavigationNoticeView.EndOfScrollingControls,\n })}\n >\n {isLoading && <Spinner />}\n <Trans\n components={{\n link: (\n <span className={styles.link} onClick={revertToDefaultOrdering} aria-hidden=\"true\" />\n ),\n }}\n i18nKey=\"quran-reader:revelation-order-notice\"\n />\n </div>\n );\n};\n\nexport default RevelationOrderNavigationNotice;\n","/* eslint-disable max-lines */\n/* eslint-disable react-func/max-lines-per-function */\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getDefaultWordFields, getMushafId } from '@/utils/api';\nimport {\n makeHizbVersesUrl,\n makeJuzVersesUrl,\n makePageVersesUrl,\n makeVersesUrl,\n makeRubVersesUrl,\n makeByRangeVersesUrl,\n} from '@/utils/apiPaths';\nimport { fetcher } from 'src/api';\nimport { PagesLookUpRequest } from 'types/ApiRequests';\nimport { VersesResponse } from 'types/ApiResponses';\nimport LookupRecord from 'types/LookupRecord';\nimport { QuranReaderDataType } from 'types/QuranReader';\nimport Verse from 'types/Verse';\n\ninterface TranslationViewRequestKeyInput {\n quranReaderDataType: QuranReaderDataType;\n pageNumber: number;\n initialData: VersesResponse;\n quranReaderStyles: QuranReaderStyles;\n selectedTranslations: number[];\n isVerseData: boolean;\n id: string | number;\n reciter: number;\n locale: string;\n wordByWordLocale: string;\n}\n\ninterface ReadingViewRequestKeyInput {\n pageNumber: number;\n quranReaderStyles: QuranReaderStyles;\n reciter: number;\n locale: string;\n wordByWordLocale: string;\n pageVersesRange?: LookupRecord;\n}\n\n/**\n * Generate the request key (the API url based on the params)\n * which will be used by useSwr to determine whether to call BE\n * again or return the cached response.\n *\n * @returns {string}\n */\nexport const getTranslationViewRequestKey = ({\n id,\n isVerseData,\n initialData,\n pageNumber,\n quranReaderStyles,\n quranReaderDataType,\n selectedTranslations,\n reciter,\n locale,\n wordByWordLocale,\n}: TranslationViewRequestKeyInput): string => {\n // if the response has only 1 verse it means we should set the page to that verse this will be combined with perPage which will be set to only 1.\n const page = isVerseData ? initialData.verses[0].verseNumber : pageNumber;\n const commonParams = {\n page,\n reciter,\n wordTranslationLanguage: wordByWordLocale,\n translations: selectedTranslations.join(','),\n ...getDefaultWordFields(quranReaderStyles.quranFont),\n ...getMushafId(quranReaderStyles.quranFont, quranReaderStyles.mushafLines),\n };\n if (quranReaderDataType === QuranReaderDataType.Juz) {\n return makeJuzVersesUrl(id, locale, {\n ...commonParams,\n perPage: initialData.pagination.perPage,\n });\n }\n if (quranReaderDataType === QuranReaderDataType.Hizb) {\n return makeHizbVersesUrl(id, locale, {\n ...commonParams,\n perPage: initialData.pagination.perPage,\n });\n }\n if (quranReaderDataType === QuranReaderDataType.Page) {\n return makePageVersesUrl(id, locale, {\n perPage: 'all',\n ...commonParams,\n });\n }\n if (quranReaderDataType === QuranReaderDataType.Rub) {\n return makeRubVersesUrl(id, locale, {\n from: initialData.metaData.from,\n perPage: initialData.pagination.perPage,\n to: initialData.metaData.to,\n ...commonParams,\n });\n }\n if (quranReaderDataType === QuranReaderDataType.ChapterVerseRanges) {\n return makeVersesUrl(id, locale, {\n from: initialData.metaData.from,\n perPage: initialData.pagination.perPage,\n to: initialData.metaData.to,\n ...commonParams,\n });\n }\n if (quranReaderDataType === QuranReaderDataType.Ranges) {\n return makeByRangeVersesUrl(locale, {\n from: initialData.pagesLookup.lookupRange.from,\n perPage: initialData.pagination.perPage,\n to: initialData.pagesLookup.lookupRange.to,\n ...commonParams,\n });\n }\n\n return makeVersesUrl(id, locale, {\n perPage: isVerseData ? 1 : initialData.pagination.perPage, // the idea is that when it's a verse view, we want to fetch only 1 verse starting from the verse's number and we can do that by passing per_page option to the API.\n ...commonParams,\n });\n};\n\nexport const getReaderViewRequestKey = ({\n pageNumber,\n locale,\n quranReaderStyles,\n reciter,\n wordByWordLocale,\n pageVersesRange,\n}: ReadingViewRequestKeyInput): string => {\n return makePageVersesUrl(\n pageNumber,\n locale,\n {\n ...getDefaultWordFields(quranReaderStyles.quranFont),\n ...getMushafId(quranReaderStyles.quranFont, quranReaderStyles.mushafLines),\n reciter,\n perPage: 'all',\n wordTranslationLanguage: wordByWordLocale,\n filterPageWords: true,\n ...(pageVersesRange && { ...pageVersesRange }), // add the from and to verse range of the current page\n },\n false,\n );\n};\n\nexport const getPagesLookupParams = (\n resourceId: number | string,\n quranReaderDataType: QuranReaderDataType,\n mushafId: number,\n initialData: VersesResponse,\n) => {\n const params: PagesLookUpRequest = { mushaf: mushafId };\n const resourceIdNumber = Number(resourceId);\n switch (quranReaderDataType) {\n case QuranReaderDataType.Chapter:\n params.chapterNumber = resourceIdNumber;\n break;\n case QuranReaderDataType.Hizb:\n params.hizbNumber = resourceIdNumber;\n break;\n case QuranReaderDataType.Juz:\n params.juzNumber = resourceIdNumber;\n break;\n case QuranReaderDataType.Page:\n params.pageNumber = resourceIdNumber;\n break;\n case QuranReaderDataType.Rub:\n params.rubElHizbNumber = resourceIdNumber;\n break;\n case QuranReaderDataType.Verse:\n params.chapterNumber = resourceIdNumber;\n params.from = initialData.verses[0].verseKey;\n params.to = initialData.verses[0].verseKey;\n break;\n case QuranReaderDataType.ChapterVerseRanges:\n params.chapterNumber = resourceIdNumber;\n params.from = initialData.metaData.from;\n params.to = initialData.metaData.to;\n break;\n case QuranReaderDataType.Ranges:\n params.from = initialData.pagesLookup.lookupRange.from;\n params.to = initialData.pagesLookup.lookupRange.to;\n break;\n default:\n break;\n }\n return params;\n};\n\n/**\n * A custom fetcher that returns the verses array from the api result.\n * We need this workaround as useSWRInfinite requires the data from the api\n * to be an array, while the result we get is formatted as {meta: {}, verses: Verse[]}\n *\n * @returns {Promise<Verse[]>}\n */\nexport const verseFetcher = async (input: RequestInfo, init?: RequestInit): Promise<Verse[]> => {\n const res = await fetcher<VersesResponse>(input, init);\n // @ts-ignore ignore this typing for now, we'll get back into this when we fix the \"initial data not being used\" issue\n return res.verses;\n};\n","import useSWRImmutable from 'swr/immutable';\n\nimport { getPagesLookupParams } from '@/components/QuranReader/api';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getMushafId } from '@/utils/api';\nimport { makePagesLookupUrl } from '@/utils/apiPaths';\nimport { fetcher } from 'src/api';\nimport { PagesLookUpResponse, VersesResponse } from 'types/ApiResponses';\nimport LookupRange from 'types/LookupRange';\nimport LookupRecord from 'types/LookupRecord';\nimport { QuranReaderDataType } from 'types/QuranReader';\n\n/**\n * This hooks fetches the total number of pages of a specific Mushaf of\n * a resource e.g. a page/juz/verse/range/hiz etc.\n *\n * @param {number|string} resourceId\n * @param {QuranReaderDataType} quranReaderDataType\n * @param {VersesResponse} initialData\n * @param {QuranReaderStyles} quranReaderStyles\n *\n * @returns {{ pagesCount: number; hasError: boolean }}\n */\nconst useFetchPagesLookup = (\n resourceId: number | string,\n quranReaderDataType: QuranReaderDataType,\n initialData: VersesResponse,\n quranReaderStyles: QuranReaderStyles,\n isUsingDefaultFont: boolean,\n): {\n data: PagesLookUpResponse;\n pagesCount: number;\n hasError: boolean;\n pagesVersesRange: Record<number, LookupRecord>;\n lookupRange: LookupRange;\n isLoading: boolean;\n} => {\n const { data, error, isValidating } = useSWRImmutable<PagesLookUpResponse>(\n makePagesLookupUrl(\n getPagesLookupParams(\n resourceId,\n quranReaderDataType,\n getMushafId(quranReaderStyles.quranFont, quranReaderStyles.mushafLines).mushaf,\n initialData,\n ),\n ),\n fetcher,\n {\n fallbackData: initialData.pagesLookup,\n revalidateOnMount: !isUsingDefaultFont,\n },\n );\n\n return {\n data,\n pagesCount: data.totalPage,\n pagesVersesRange: data.pages,\n lookupRange: data.lookupRange,\n hasError: !!error,\n isLoading: isValidating && !data,\n };\n};\n\nexport default useFetchPagesLookup;\n","import React from 'react';\n\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from '@/components/QuranReader/ReadingPreferenceSwitcher/ReadingPreference.module.scss';\nimport Spinner from '@/dls/Spinner/Spinner';\nimport BookIcon from '@/icons/book.svg';\nimport ReaderIcon from '@/icons/reader.svg';\nimport { ReadingPreference } from 'types/QuranReader';\n\ntype Props = {\n readingPreference: ReadingPreference;\n selectedReadingPreference: ReadingPreference;\n isIconsOnly?: boolean;\n isLoading: boolean;\n};\n\nexport const readingPreferenceIcons = {\n [ReadingPreference.Reading]: <ReaderIcon />,\n [ReadingPreference.Translation]: <BookIcon />,\n};\n\nconst LoadingSwitcher: React.FC<Props> = ({\n readingPreference,\n selectedReadingPreference,\n isIconsOnly = false,\n isLoading,\n}) => {\n const { t } = useTranslation('common');\n return isLoading && readingPreference === selectedReadingPreference ? (\n <div className={styles.container}>\n <span>\n <Spinner className={styles.spinner} />\n </span>\n {!isIconsOnly && (\n <span className={styles.preferenceTextContainer}>\n {t(`reading-preference.${selectedReadingPreference}`)}\n </span>\n )}\n </div>\n ) : (\n <div className={styles.container}>\n <span className={classNames(styles.iconContainer, isIconsOnly && styles.iconsCenter)}>\n {readingPreferenceIcons[selectedReadingPreference]}\n </span>\n {!isIconsOnly && (\n <span className={styles.preferenceTextContainer}>\n {t(`reading-preference.${selectedReadingPreference}`)}\n </span>\n )}\n </div>\n );\n};\n\nexport default LoadingSwitcher;\n","import classNames from 'classnames';\nimport { useRouter } from 'next/router';\nimport { useSelector } from 'react-redux';\n\nimport LoadingSwitcher from './ReadingPreferenceOption';\nimport styles from './ReadingPreferenceSwitcher.module.scss';\n\nimport Switch, { SwitchSize } from '@/dls/Switch/Switch';\nimport usePersistPreferenceGroup from '@/hooks/auth/usePersistPreferenceGroup';\nimport {\n selectReadingPreferences,\n setReadingPreference,\n} from '@/redux/slices/QuranReader/readingPreferences';\nimport { selectLastReadVerseKey } from '@/redux/slices/QuranReader/readingTracker';\nimport { logValueChange } from '@/utils/eventLogger';\nimport PreferenceGroup from 'types/auth/PreferenceGroup';\nimport { ReadingPreference } from 'types/QuranReader';\n\nexport enum ReadingPreferenceSwitcherType {\n SurahHeader = 'surah_header',\n ContextMenu = 'context_menu',\n}\n\ninterface Props {\n size?: SwitchSize;\n isIconsOnly?: boolean;\n type?: ReadingPreferenceSwitcherType;\n}\n\nconst ReadingPreferenceSwitcher: React.FC<Props> = ({\n size,\n isIconsOnly = false,\n type = ReadingPreferenceSwitcherType.SurahHeader,\n}) => {\n const readingPreferences = useSelector(selectReadingPreferences);\n const lastReadVerseKey = useSelector(selectLastReadVerseKey);\n const lastReadVerse = lastReadVerseKey.verseKey?.split(':')[1];\n const { readingPreference } = readingPreferences;\n const {\n actions: { onSettingsChange },\n isLoading,\n } = usePersistPreferenceGroup();\n const router = useRouter();\n\n const readingPreferencesOptions = [\n {\n name: (\n <LoadingSwitcher\n readingPreference={readingPreference}\n selectedReadingPreference={ReadingPreference.Translation}\n isLoading={isLoading}\n isIconsOnly={isIconsOnly}\n />\n ),\n value: ReadingPreference.Translation,\n },\n {\n name: (\n <LoadingSwitcher\n readingPreference={readingPreference}\n selectedReadingPreference={ReadingPreference.Reading}\n isLoading={isLoading}\n isIconsOnly={isIconsOnly}\n />\n ),\n value: ReadingPreference.Reading,\n },\n ];\n\n const onViewSwitched = (view: ReadingPreference) => {\n logValueChange(`${type}_reading_preference`, readingPreference, view);\n\n const newQueryParams = { ...router.query };\n\n // Track `startingVerse` once we're past the start of the page so we can\n // continue from the same ayah when switching views. Without the > 1 check,\n // switching views at the start of the page causes unnecessary scrolls\n\n if (type === ReadingPreferenceSwitcherType.SurahHeader) {\n delete newQueryParams.startingVerse;\n } else if (parseInt(lastReadVerse, 10) > 1) {\n newQueryParams.startingVerse = lastReadVerse;\n }\n\n const newUrlObject = {\n pathname: router.pathname,\n query: newQueryParams,\n };\n\n router.replace(newUrlObject, null, { shallow: true }).then(() => {\n onSettingsChange(\n 'readingPreference',\n view,\n setReadingPreference(view),\n setReadingPreference(readingPreference),\n PreferenceGroup.READING,\n );\n });\n };\n\n return (\n <div\n className={classNames(styles.container, {\n [styles.surahHeaderContainer]: type === ReadingPreferenceSwitcherType.SurahHeader,\n [styles.contextMenuContainer]: type === ReadingPreferenceSwitcherType.ContextMenu,\n })}\n id=\"reading-preference-switcher\"\n >\n <Switch\n items={readingPreferencesOptions}\n selected={readingPreference}\n onSelect={onViewSwitched}\n size={size}\n />\n </div>\n );\n};\nexport default ReadingPreferenceSwitcher;\n","/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport React, { useContext, useMemo } from 'react';\n\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\n\nimport styles from './ContextMenu.module.scss';\nimport ReadingPreferenceSwitcher, {\n ReadingPreferenceSwitcherType,\n} from './ReadingPreferenceSwitcher';\n\nimport { useOnboarding } from '@/components/Onboarding/OnboardingProvider';\nimport { SwitchSize } from '@/dls/Switch/Switch';\nimport ChevronDownIcon from '@/icons/chevron-down.svg';\nimport { selectNavbar } from '@/redux/slices/navbar';\nimport { selectContextMenu } from '@/redux/slices/QuranReader/contextMenu';\nimport { selectNotes } from '@/redux/slices/QuranReader/notes';\nimport { selectLastReadVerseKey } from '@/redux/slices/QuranReader/readingTracker';\nimport {\n selectIsSidebarNavigationVisible,\n setIsVisible,\n} from '@/redux/slices/QuranReader/sidebarNavigation';\nimport { getChapterData, getChapterReadingProgress } from '@/utils/chapter';\nimport { logEvent } from '@/utils/eventLogger';\nimport { getJuzNumberByHizb } from '@/utils/juz';\nimport { toLocalizedNumber } from '@/utils/locale';\nimport { isMobile } from '@/utils/responsive';\nimport { getVerseNumberFromKey } from '@/utils/verse';\nimport DataContext from 'src/contexts/DataContext';\n\nconst ContextMenu = () => {\n const dispatch = useDispatch();\n const chaptersData = useContext(DataContext);\n const isSidebarNavigationVisible = useSelector(selectIsSidebarNavigationVisible);\n const { t, lang } = useTranslation('common');\n const isSideBarVisible = useSelector(selectNotes, shallowEqual).isVisible;\n const { isExpanded, showReadingPreferenceSwitcher: isReadingPreferenceSwitcherVisible } =\n useSelector(selectContextMenu, shallowEqual);\n\n const { isActive } = useOnboarding();\n const { isVisible: isNavbarVisible } = useSelector(selectNavbar, shallowEqual);\n const showNavbar = isNavbarVisible || isActive;\n const showReadingPreferenceSwitcher = isReadingPreferenceSwitcherVisible && !isActive;\n\n const { verseKey, chapterId, page, hizb } = useSelector(selectLastReadVerseKey, shallowEqual);\n const chapterData = useMemo(() => {\n return chapterId ? getChapterData(chaptersData, chapterId) : null;\n }, [chapterId, chaptersData]);\n const juzNumber = useMemo(() => {\n return hizb ? toLocalizedNumber(getJuzNumberByHizb(Number(hizb)), lang) : null;\n }, [hizb, lang]);\n const localizedHizb = useMemo(() => {\n return toLocalizedNumber(Number(hizb), lang);\n }, [hizb, lang]);\n const localizedPageNumber = useMemo(() => {\n return toLocalizedNumber(Number(page), lang);\n }, [page, lang]);\n\n // if it's SSR or the first time we render this\n if (!verseKey) {\n return <></>;\n }\n const verse = getVerseNumberFromKey(verseKey);\n const progress = getChapterReadingProgress(verse, chapterData.versesCount);\n\n return (\n <div\n className={classNames(styles.container, {\n [styles.visibleContainer]: showNavbar,\n [styles.expandedContainer]: isExpanded,\n [styles.withVisibleSideBar]: isSideBarVisible,\n })}\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n style={{ '--progress': `${progress}%` }} // this is to pass the value to css so it can be used to show the progress bar.\n >\n <div className={styles.sectionsContainer}>\n <div className={showReadingPreferenceSwitcher ? styles.section : styles.halfSection}>\n <div className={classNames(styles.row)}>\n <p\n className={classNames(styles.bold, styles.alignStart, styles.surahName, {\n [styles.disabledOnMobile]: isSidebarNavigationVisible,\n // on mobile, the click event is conflicting with `onClickOutside`,\n // causing the sidebar to be closed and opened again when this clicked. So we disable one of them for now\n })}\n onClick={(e) => {\n logEvent(\n `sidebar_navigation_${isSidebarNavigationVisible ? 'close' : 'open'}_trigger`,\n );\n e.stopPropagation();\n if (isSidebarNavigationVisible === 'auto') {\n // eslint-disable-next-line no-unneeded-ternary\n const shouldBeVisible = isMobile() ? true : false;\n dispatch(setIsVisible(shouldBeVisible));\n } else {\n dispatch(setIsVisible(!isSidebarNavigationVisible));\n }\n }}\n >\n {chapterData.transliteratedName}\n <span\n className={classNames(styles.chevronIconContainer, {\n [styles.rotate180]: isSidebarNavigationVisible === true,\n [styles.rotateAuto]: isSidebarNavigationVisible === 'auto',\n })}\n >\n <ChevronDownIcon />\n </span>\n </p>\n </div>\n </div>\n {showReadingPreferenceSwitcher && (\n <div className={styles.halfSection}>\n <ReadingPreferenceSwitcher\n size={SwitchSize.XSmall}\n isIconsOnly\n type={ReadingPreferenceSwitcherType.ContextMenu}\n />\n </div>\n )}\n <div className={showReadingPreferenceSwitcher ? styles.section : styles.halfSection}>\n <div className={classNames(styles.row)}>\n <p\n className={classNames(styles.alignEnd, {\n [styles.hide]: !isExpanded,\n })}\n />\n <p className={classNames(styles.alignEnd)}>\n {isExpanded && (\n <span className={styles.secondaryInfo}>\n {/* eslint-disable-next-line i18next/no-literal-string */}\n {t('juz')} {juzNumber} / {t('hizb')} {localizedHizb} -{' '}\n </span>\n )}\n <span className={styles.primaryInfo}>\n {t('page')} {localizedPageNumber}\n </span>\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ContextMenu;\n","import { createContext, useContext, useMemo, useRef } from 'react';\n\ninterface VerseTrackerContextType {\n // this will store a queue of verse keys that have been read by the user\n verseKeysQueue: React.MutableRefObject<Set<string>>;\n\n shouldTrackObservedVerses: React.MutableRefObject<boolean>;\n}\n\nconst VerseTrackerContext = createContext<VerseTrackerContextType>(null);\n\nexport const VerseTrackerContextProvider: React.FC<{\n children: React.ReactNode;\n}> = ({ children }) => {\n const verseKeysQueue = useRef<Set<string>>(new Set());\n const shouldTrackObservedVerses = useRef(true);\n const value = useMemo(() => ({ verseKeysQueue, shouldTrackObservedVerses }), []);\n\n return <VerseTrackerContext.Provider value={value}>{children}</VerseTrackerContext.Provider>;\n};\n\nexport const useVerseTrackerContext = () => useContext(VerseTrackerContext);\n","import React from 'react';\n\nimport classNames from 'classnames';\n\nimport styles from './ObserverWindow.module.scss';\n\ninterface Props {\n isReadingMode: boolean;\n}\n\nconst DebuggingObserverWindow: React.FC<Props> = ({ isReadingMode }) => {\n if (process.env.NEXT_PUBLIC_DEBUG_OBSERVER_WINDOW !== 'true') {\n return <></>;\n }\n return (\n <div\n className={classNames(styles.container, {\n [styles.readingMode]: isReadingMode,\n })}\n />\n );\n};\n\nexport default DebuggingObserverWindow;\n","/* eslint-disable i18next/no-literal-string */\nimport React from 'react';\n\nimport classNames from 'classnames';\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\n\nimport styles from './Notes.module.scss';\n\nimport { setIsVisible, selectNotes } from '@/redux/slices/QuranReader/notes';\n\nconst Notes = () => {\n const dispatch = useDispatch();\n const { isVisible } = useSelector(selectNotes, shallowEqual);\n\n return (\n <div className={classNames(styles.container, { [styles.visibleContainer]: isVisible })}>\n Notes placeholders\n <br />\n <button type=\"button\" onClick={() => dispatch({ type: setIsVisible.type, payload: false })}>\n close\n </button>\n </div>\n );\n};\n\nexport default Notes;\n","import { useCallback } from 'react';\n\nimport useBrowserLayoutEffect from '@/hooks/useBrowserLayoutEffect';\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.\n *\n * @param {IntersectionObserverInit} options\n * @param {(element:Element)=>void} onElementVisible\n * @param {string} observerId the name of the observer\n */\nconst useGlobalIntersectionObserver = (\n { threshold = 1, root = null, rootMargin = '0%' }: IntersectionObserverInit,\n onElementVisible: (element: Element) => void,\n observerId: string,\n) => {\n const updateEntry = useCallback(\n (entries: IntersectionObserverEntry[]): void => {\n entries\n .filter((entry) => entry.isIntersecting)\n .forEach((visibleEntry) => {\n onElementVisible(visibleEntry.target);\n });\n },\n [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 window[observerId].disconnect();\n window[observerId] = undefined;\n };\n }, [root, rootMargin, threshold, updateEntry, observerId]);\n};\n\nexport default useGlobalIntersectionObserver;\n","import { getVerseAndChapterNumbersFromKey } from '@/utils/verse';\n\n// given an array of verse keys, merge back to back verses into a single range like this:\n// ['1:1', '1:2', '1:3', '1:7'] will be ['1:1-1:3', '1:7-1:7']\nfunction mergeVerseKeys(\n verses: Set<string>,\n // chaptersData: ChaptersData\n) {\n const combinedVerses = new Set<string>();\n const verseMap: { [key: string]: number[] } = {};\n\n // Create a map of chapter to verse numbers\n verses.forEach((verseKey) => {\n const [chapter, verseNumber] = getVerseAndChapterNumbersFromKey(verseKey);\n if (!verseMap[chapter]) verseMap[chapter] = [];\n verseMap[chapter].push(Number(verseNumber));\n });\n\n // Merge the verse numbers for each chapter\n const entries = Object.entries(verseMap);\n for (let i = 0; i < entries.length; i += 1) {\n // eslint-disable-next-line prefer-const\n const [chapter, verseNumbers] = entries[i];\n verseNumbers.sort((a, b) => a - b);\n\n let start = verseNumbers[0];\n let end = start;\n\n for (let j = 1; j < verseNumbers.length; j += 1) {\n // merge back to back verses into a single range\n // OR\n // merge verses into a single range if they are not back to back but the distance is 1\n // e.g. 1:1, 1:2, 1:3, 1:5 will be merged into 1:1-1:5\n if (verseNumbers[j] - end > 0 && verseNumbers[j] - end <= 5) {\n end = verseNumbers[j];\n } else {\n combinedVerses.add(`${chapter}:${start}-${chapter}:${end}`);\n start = verseNumbers[j];\n end = start;\n }\n }\n combinedVerses.add(`${chapter}:${start}-${chapter}:${end}`);\n }\n\n return combinedVerses;\n}\n\nexport default mergeVerseKeys;\n","import { useState } from 'react';\n\nimport classNames from 'classnames';\nimport { useRouter } from 'next/router';\nimport useTranslation from 'next-translate/useTranslation';\nimport useSWRImmutable from 'swr/immutable';\n\nimport internalStyles from './Notes.module.scss';\n\nimport NoteModal from '@/components/Notes/NoteModal';\nimport styles from '@/components/QuranReader/TranslationView/TranslationViewCell.module.scss';\nimport Wrapper from '@/components/Wrapper/Wrapper';\nimport Badge from '@/dls/Badge/Badge';\nimport NewLabel from '@/dls/Badge/NewLabel';\nimport Button, { ButtonShape, ButtonSize, ButtonType, ButtonVariant } from '@/dls/Button/Button';\nimport EmptyNotesIcon from '@/icons/notes-empty.svg';\nimport NotesIcon from '@/icons/notes-filled.svg';\nimport ConsentType from '@/types/auth/ConsentType';\nimport { getUserProfile } from '@/utils/auth/api';\nimport { makeUserProfileUrl } from '@/utils/auth/apiPaths';\nimport { isLoggedIn } from '@/utils/auth/login';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { getChapterWithStartingVerseUrl, getLoginNavigationUrl } from '@/utils/navigation';\n\nexport enum VerseNotesTrigger {\n IconButton = 'button',\n PopoverItem = 'popoverItem',\n}\n\ntype VerseNotesProps = {\n verseKey: string;\n isTranslationView: boolean;\n hasNotes?: boolean;\n};\n\nconst VerseNotes = ({ verseKey, isTranslationView, hasNotes }: VerseNotesProps) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const { t } = useTranslation('common');\n const router = useRouter();\n\n const { data: userData } = useSWRImmutable(\n isLoggedIn() ? makeUserProfileUrl() : null,\n getUserProfile,\n );\n\n const onItemClicked = () => {\n const isUserLoggedIn = isLoggedIn();\n logButtonClick('verse_actions_menu_note', {\n isTranslationView,\n isLoggedIn,\n });\n if (!isUserLoggedIn) {\n router.push(getLoginNavigationUrl(getChapterWithStartingVerseUrl(verseKey)));\n } else {\n setIsModalOpen(true);\n }\n };\n\n const onClose = () => {\n setIsModalOpen(false);\n };\n\n // TODO: consents is used as a temporary solution until we have a proper way to check if the user has notes\n const shouldShowNewLabel = !userData?.consents?.[ConsentType.HAS_NOTES];\n\n return (\n <>\n <NoteModal isOpen={isModalOpen} onClose={onClose} verseKey={verseKey} />\n <Button\n className={classNames(styles.iconContainer, styles.verseAction, styles.fadedVerseAction)}\n onClick={onItemClicked}\n tooltip={t('notes.title')}\n type={ButtonType.Primary}\n shape={ButtonShape.Circle}\n variant={ButtonVariant.Ghost}\n size={ButtonSize.Small}\n >\n <span className={styles.icon}>\n {hasNotes ? (\n <NotesIcon />\n ) : (\n <Wrapper\n shouldWrap={shouldShowNewLabel}\n wrapper={(children) => (\n <Badge\n className={internalStyles.newLabelContainer}\n contentClassName={internalStyles.newLabel}\n content={shouldShowNewLabel && <NewLabel />}\n >\n {children}\n </Badge>\n )}\n >\n <EmptyNotesIcon />\n </Wrapper>\n )}\n </span>\n </Button>\n </>\n );\n};\n\nexport default VerseNotes;\n","/* eslint-disable react-func/max-lines-per-function */\nimport { useCallback, useContext, useEffect, useRef, useMemo } from 'react';\n\nimport debounce from 'lodash/debounce';\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\nimport { useSWRConfig } from 'swr';\n\nimport { useVerseTrackerContext } from '../contexts/VerseTrackerContext';\nimport { getObservedVersePayload, getOptions, QURAN_READER_OBSERVER_ID } from '../observer';\n\nimport DataContext from '@/contexts/DataContext';\nimport useGlobalIntersectionObserver from '@/hooks/useGlobalIntersectionObserver';\nimport { setLastReadVerse } from '@/redux/slices/QuranReader/readingTracker';\nimport { selectQuranFont, selectQuranMushafLines } from '@/redux/slices/QuranReader/styles';\nimport {\n ActivityDayType,\n UpdateActivityDayBody,\n UpdateQuranActivityDayBody,\n} from '@/types/auth/ActivityDay';\nimport { getFilterActivityDaysParamsOfCurrentMonth } from '@/utils/activity-day';\nimport { getMushafId } from '@/utils/api';\nimport { addReadingSession, updateActivityDay } from '@/utils/auth/api';\nimport {\n makeFilterActivityDaysUrl,\n makeReadingSessionsUrl,\n makeStreakUrl,\n} from '@/utils/auth/apiPaths';\nimport { isLoggedIn } from '@/utils/auth/login';\nimport mergeVerseKeys from '@/utils/mergeVerseKeys';\nimport { getVerseAndChapterNumbersFromKey } from '@/utils/verse';\n\nconst READING_DAY_SYNC_TIME_MS = 5000; // 5 seconds\nconst READING_SESSION_DEBOUNCE_WAIT_TIME = 2000; // 5 seconds\n\ninterface UseSyncReadingProgressProps {\n isReadingPreference: boolean;\n}\n\n/**\n * This hook is responsible for syncing the user's reading progress with the backend.\n *\n * @param {UseSyncReadingProgressProps} options\n */\nconst useSyncReadingProgress = ({ isReadingPreference }: UseSyncReadingProgressProps) => {\n const chaptersData = useContext(DataContext);\n\n const quranFont = useSelector(selectQuranFont, shallowEqual);\n const mushafLines = useSelector(selectQuranMushafLines, shallowEqual);\n const { mushaf } = getMushafId(quranFont, mushafLines);\n\n /**\n * `verseKeysQueue` is a queue of verse keys that we need to send to the backend\n * we will clear the queue every {READING_DAY_SYNC_TIME} milliseconds after sending the data to the backend\n * it is also a Set not an array to avoid duplicate verse keys\n */\n const { verseKeysQueue, shouldTrackObservedVerses } = useVerseTrackerContext();\n\n const elapsedReadingTimeInSeconds = useRef(0);\n const dispatch = useDispatch();\n const { cache, mutate } = useSWRConfig();\n\n const addReadingSessionAndClearCache = useCallback(\n (chapterNumber, verseNumber) => {\n addReadingSession(chapterNumber, verseNumber).then(() => {\n cache.delete(makeReadingSessionsUrl());\n });\n },\n [cache],\n );\n\n const debouncedAddReadingSession = useMemo(\n () => debounce(addReadingSessionAndClearCache, READING_SESSION_DEBOUNCE_WAIT_TIME),\n [addReadingSessionAndClearCache],\n );\n\n // send the data to the backend and clear the SWR cache\n const updateReadingDayAndClearCache = useCallback(\n (body: UpdateActivityDayBody<UpdateQuranActivityDayBody>) => {\n updateActivityDay(body).then(() => {\n // invalidate the current month's history cache to refetch the data if we navigated to it\n const currentMonthHistoryUrl = makeFilterActivityDaysUrl(\n getFilterActivityDaysParamsOfCurrentMonth(),\n );\n cache.delete(currentMonthHistoryUrl);\n\n mutate(makeStreakUrl());\n });\n },\n [mutate, cache],\n );\n\n // this function will be called when an element is triggered by the intersection observer\n const onElementVisible = useCallback(\n (element: Element) => {\n const lastReadVerse = getObservedVersePayload(element);\n\n dispatch(\n setLastReadVerse({\n lastReadVerse,\n chaptersData,\n }),\n );\n\n if (isLoggedIn() && shouldTrackObservedVerses.current) {\n /**\n * Add the verse key to the queue.\n * We make sure the user is logged-in first so that we don't add it to the queue and never clear it (which causes a memory leak).\n */\n verseKeysQueue.current.add(lastReadVerse.verseKey);\n\n const [chapterNumber, verseNumber] = getVerseAndChapterNumbersFromKey(\n lastReadVerse.verseKey,\n );\n debouncedAddReadingSession(Number(chapterNumber), Number(verseNumber));\n }\n },\n [chaptersData, debouncedAddReadingSession, dispatch, verseKeysQueue, shouldTrackObservedVerses],\n );\n\n // eslint-disable-next-line consistent-return\n useEffect(() => {\n // if the user is not logged in, we don't need to sync the reading day\n // TODO: maybe we can save this in the local storage and sync it when the user logs in?\n if (!isLoggedIn()) {\n return () => null;\n }\n\n const interval = setInterval(() => {\n // nothing to send\n if (verseKeysQueue.current.size === 0 && elapsedReadingTimeInSeconds.current === 0) {\n return;\n }\n\n // an array of verse ranges that we will send to the backend\n // we will get them by merging the verse keys in the queue\n let verseRanges: string[] = null;\n if (verseKeysQueue.current.size > 0) {\n // merge the verse keys and clear the queue\n verseRanges = Array.from(mergeVerseKeys(verseKeysQueue.current));\n verseKeysQueue.current.clear();\n }\n\n let seconds: number = null;\n if (elapsedReadingTimeInSeconds.current > 0) {\n seconds = elapsedReadingTimeInSeconds.current;\n elapsedReadingTimeInSeconds.current = 0;\n }\n\n const body: UpdateActivityDayBody<UpdateQuranActivityDayBody> = {\n mushafId: mushaf,\n type: ActivityDayType.QURAN,\n };\n\n if (verseRanges) {\n body.ranges = verseRanges;\n }\n\n if (seconds) {\n body.seconds = seconds;\n }\n\n updateReadingDayAndClearCache(body);\n }, READING_DAY_SYNC_TIME_MS);\n\n return () => {\n clearInterval(interval);\n };\n }, [chaptersData, updateReadingDayAndClearCache, verseKeysQueue, mushaf]);\n\n // this will track user's reading time\n // also, if the user is not on the same tab, we will pause the timer\n useEffect(() => {\n if (!isLoggedIn()) {\n return () => null;\n }\n\n let interval: NodeJS.Timeout = null;\n\n const handleFocus = () => {\n if (interval) clearInterval(interval);\n\n interval = setInterval(() => {\n elapsedReadingTimeInSeconds.current += 1;\n }, 1000);\n };\n\n const handleBlur = () => {\n clearInterval(interval);\n };\n\n window.addEventListener('focus', handleFocus);\n window.addEventListener('blur', handleBlur);\n\n handleFocus();\n\n return () => {\n window.removeEventListener('focus', handleFocus);\n window.removeEventListener('blur', handleBlur);\n };\n }, []);\n\n useGlobalIntersectionObserver(\n getOptions(isReadingPreference),\n onElementVisible,\n QURAN_READER_OBSERVER_ID,\n );\n};\n\nexport default useSyncReadingProgress;\n","import { useContext, useMemo } from 'react';\n\nimport { useSelector } from 'react-redux';\n\nimport useFetchPagesLookup from '@/components/QuranReader/hooks/useFetchPagesLookup';\nimport DataContext from '@/contexts/DataContext';\nimport { selectIsUsingDefaultFont } from '@/redux/slices/QuranReader/styles';\nimport { generateVerseKeysBetweenTwoVerseKeys } from '@/utils/verseKeys';\n\n/**\n * This hooks calculates the total number of verses based on the verses range\n * and the current Mushaf settings\n *\n * @param {number|string} resourceId\n * @param {QuranReaderDataType} quranReaderDataType\n * @param {VersesResponse} initialData\n * @param {QuranReaderStyles} quranReaderStyles\n *\n * @returns {number} versesCount\n */\n\nconst useGetVersesCount = ({\n resourceId,\n quranReaderDataType,\n initialData,\n quranReaderStyles,\n}): number => {\n const isUsingDefaultFont = useSelector(selectIsUsingDefaultFont);\n const { lookupRange } = useFetchPagesLookup(\n resourceId,\n quranReaderDataType,\n initialData,\n quranReaderStyles,\n isUsingDefaultFont,\n );\n\n const chaptersData = useContext(DataContext);\n\n const versesCount = useMemo(() => {\n return generateVerseKeysBetweenTwoVerseKeys(chaptersData, lookupRange.from, lookupRange.to)\n .length;\n }, [chaptersData, lookupRange.from, lookupRange.to]);\n\n return versesCount;\n};\n\nexport default useGetVersesCount;\n","import { useCallback, useEffect, useState, useContext, useRef } from 'react';\n\nimport { useRouter } from 'next/router';\nimport { VirtuosoHandle } from 'react-virtuoso';\n\nimport { useVerseTrackerContext } from '../../contexts/VerseTrackerContext';\n\nimport DataContext from '@/contexts/DataContext';\nimport Verse from '@/types/Verse';\nimport { getPageNumberFromIndexAndPerPage } from '@/utils/number';\nimport { isValidVerseId } from '@/utils/validator';\nimport { makeVerseKey } from '@/utils/verse';\nimport { QuranReaderDataType } from 'types/QuranReader';\nimport ScrollAlign from 'types/ScrollAlign';\n\n/**\n * This hook listens to startingVerse query param and navigate to\n * the location where the verse is in the virtualized list.\n *\n * [NOTE]: This is meant to be used for TranslationView only.\n *\n * @param {QuranReaderDataType} quranReaderDataType\n * @param {React.MutableRefObject<VirtuosoHandle>} virtuosoRef\n * @param {Record<number, Verse[]>} apiPageToVersesMap\n * @param {string} chapterId\n * @param {number} versesPerPage\n */\nconst useScrollToVirtualizedTranslationView = (\n quranReaderDataType: QuranReaderDataType,\n virtuosoRef: React.MutableRefObject<VirtuosoHandle>,\n apiPageToVersesMap: Record<number, Verse[]>,\n chapterId: string,\n versesPerPage: number,\n) => {\n const router = useRouter();\n const chaptersData = useContext(DataContext);\n const [shouldReadjustScroll, setShouldReadjustScroll] = useState(false);\n const timeoutId = useRef<ReturnType<typeof setTimeout>>(null);\n const { verseKeysQueue, shouldTrackObservedVerses } = useVerseTrackerContext();\n\n const { startingVerse } = router.query;\n const startingVerseNumber = Number(startingVerse);\n const isValidStartingVerse =\n startingVerse && isValidVerseId(chaptersData, chapterId, String(startingVerse));\n\n const scrollToBeginningOfVerseCell = useCallback(\n (verseNumber: number) => {\n const verseIndex = verseNumber - 1;\n virtuosoRef.current.scrollToIndex({\n index: verseIndex,\n align: ScrollAlign.Start,\n // this offset is to push the scroll a little bit down so that the context menu doesn't cover the verse\n offset: -70,\n });\n },\n [virtuosoRef],\n );\n\n // this effect runs when there is initially a `startingVerse` in the url or when the user navigates to a new verse\n // it scrolls to the beginning of the verse cell and we set `shouldReadjustScroll` to true so that the other effect\n // adjusts the scroll to the correct position\n useEffect(() => {\n if (quranReaderDataType === QuranReaderDataType.Chapter && isValidStartingVerse) {\n scrollToBeginningOfVerseCell(startingVerseNumber);\n setShouldReadjustScroll(true);\n }\n }, [\n quranReaderDataType,\n startingVerseNumber,\n isValidStartingVerse,\n scrollToBeginningOfVerseCell,\n ]);\n\n // this effect handles the case when the user navigates to a verse that is not yet loaded\n // we need to wait for the verse to be loaded and then scroll to it\n useEffect(() => {\n if (\n quranReaderDataType === QuranReaderDataType.Chapter &&\n isValidStartingVerse &&\n // we only want to run this effect when the user navigates to a new verse\n // and not when the user is scrolling through the verses while apiPageToVersesMap is being populated\n shouldReadjustScroll\n ) {\n shouldTrackObservedVerses.current = false;\n const pageNumber = getPageNumberFromIndexAndPerPage(startingVerseNumber - 1, versesPerPage);\n const isFirstVerseInPage = startingVerseNumber % versesPerPage === 1;\n\n const isBeforeDoneLoading =\n pageNumber > 1 && isFirstVerseInPage ? !!apiPageToVersesMap[pageNumber - 1] : true;\n const isDoneLoading = !!apiPageToVersesMap[pageNumber] && isBeforeDoneLoading;\n\n // if the verse finished loading, or the one right before, we `setTimeout` and scroll to the beginning of the verse cell (this is a hacky solution so that the verse renders before we scroll to it)\n // and set `shouldReadjustScroll` to false so that this effect doesn't run again\n //\n // otherwise, we use `scrollToBeginningOfVerseCell` to scroll near the beginning of the verse cell without setting `shouldReadjustScroll` to false so that this effect runs again when the data loads\n if (isDoneLoading) {\n if (timeoutId.current !== null) {\n clearTimeout(timeoutId.current);\n }\n\n timeoutId.current = setTimeout(() => {\n scrollToBeginningOfVerseCell(startingVerseNumber);\n shouldTrackObservedVerses.current = true;\n\n // we need to add the verse we scrolled to to the queue\n verseKeysQueue.current.add(makeVerseKey(chapterId, startingVerseNumber));\n }, 1000);\n\n setShouldReadjustScroll(false);\n } else {\n scrollToBeginningOfVerseCell(startingVerseNumber);\n }\n }\n }, [\n shouldReadjustScroll,\n startingVerseNumber,\n isValidStartingVerse,\n apiPageToVersesMap,\n quranReaderDataType,\n versesPerPage,\n scrollToBeginningOfVerseCell,\n virtuosoRef,\n shouldTrackObservedVerses,\n verseKeysQueue,\n chapterId,\n ]);\n\n // this effect clears the timeout when the component unmounts\n useEffect(() => {\n return () => {\n if (timeoutId.current !== null) {\n clearTimeout(timeoutId.current);\n }\n };\n }, []);\n};\n\nexport default useScrollToVirtualizedTranslationView;\n","import { useEffect, useMemo } from 'react';\n\nimport { useRouter } from 'next/router';\nimport useTranslation from 'next-translate/useTranslation';\nimport useSWRImmutable from 'swr/immutable';\n\nimport { getTranslationViewRequestKey, verseFetcher } from '@/components/QuranReader/api';\nimport useIsUsingDefaultSettings from '@/hooks/useIsUsingDefaultSettings';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { VersesResponse } from '@/types/ApiResponses';\nimport { Mushaf, QuranReaderDataType } from '@/types/QuranReader';\nimport Verse from '@/types/Verse';\nimport { makeBookmarksRangeUrl } from '@/utils/auth/apiPaths';\nimport { isLoggedIn } from '@/utils/auth/login';\nimport { getPageNumberFromIndexAndPerPage } from '@/utils/number';\n\ninterface QuranReaderParams {\n quranReaderDataType: QuranReaderDataType;\n wordByWordLocale: string;\n reciterId: number;\n resourceId: number | string;\n initialData: VersesResponse;\n quranReaderStyles: QuranReaderStyles;\n mushafId: Mushaf;\n selectedTranslations: number[];\n setApiPageToVersesMap: (data: Record<number, Verse[]>) => void;\n verseIdx: number;\n}\n\ninterface UseDedupedFetchVerseResult {\n verse: Verse | null;\n firstVerseInPage: Verse | null;\n bookmarksRangeUrl: string | null;\n notesRange: {\n from: string;\n to: string;\n } | null;\n}\n\n/**\n * This hook fetches the verse of the given `verseIdx` and dedupes the data based on their page number.\n *\n * For an example, passing `verseIdx` of `0 | 1 | 2 | 3 | 4` should only trigger one API request because they are all in the same page.\n *\n * @param {QuranReaderParams} params\n * @returns {UseDedupedFetchVerseResult}\n */\nconst useDedupedFetchVerse = ({\n quranReaderDataType,\n quranReaderStyles,\n wordByWordLocale,\n reciterId,\n resourceId,\n selectedTranslations,\n initialData,\n setApiPageToVersesMap,\n mushafId,\n verseIdx,\n}: QuranReaderParams): UseDedupedFetchVerseResult => {\n const router = useRouter();\n\n const { lang } = useTranslation();\n\n const translationParams = useMemo(\n () =>\n (router.query.translations as string)?.split(',')?.map((translation) => Number(translation)),\n [router.query.translations],\n );\n\n const pageNumber = getPageNumberFromIndexAndPerPage(verseIdx, initialData.pagination.perPage);\n\n const idxInPage = verseIdx % initialData.pagination.perPage;\n\n const isUsingDefaultSettings = useIsUsingDefaultSettings({\n translationParams,\n selectedTranslations,\n });\n const shouldUseInitialData = pageNumber === 1 && isUsingDefaultSettings;\n const { data: verses } = useSWRImmutable(\n getTranslationViewRequestKey({\n quranReaderDataType,\n pageNumber,\n initialData,\n quranReaderStyles,\n selectedTranslations,\n isVerseData: quranReaderDataType === QuranReaderDataType.Verse,\n id: resourceId,\n reciter: reciterId,\n locale: lang,\n wordByWordLocale,\n }),\n verseFetcher,\n {\n fallbackData: shouldUseInitialData ? initialData.verses : undefined,\n },\n );\n\n useEffect(() => {\n if (verses) {\n // @ts-ignore\n setApiPageToVersesMap((prevMushafPageToVersesMap: Record<number, Verse[]>) => ({\n ...prevMushafPageToVersesMap,\n [pageNumber]: verses,\n }));\n }\n }, [pageNumber, setApiPageToVersesMap, verses]);\n\n const bookmarksRangeUrl =\n verses && verses.length && isLoggedIn()\n ? makeBookmarksRangeUrl(\n mushafId,\n Number(verses?.[0].chapterId),\n Number(verses?.[0].verseNumber),\n initialData.pagination.perPage,\n )\n : null;\n\n const verse = verses ? verses[idxInPage] : null;\n\n // This part handles an edge case where the user has no selected translations but the `initialData` sent from server-side rendering has a default translation.\n // So, we need to remove the translations from the verse if the user has no selected translations.\n if (verse && selectedTranslations.length === 0) {\n verse.translations = [];\n }\n\n return {\n verse,\n firstVerseInPage: verses ? verses[0] : null,\n bookmarksRangeUrl,\n notesRange:\n verses && verses.length > 0\n ? {\n from: verses?.[0].verseKey,\n to: verses?.[verses.length - 1].verseKey,\n }\n : null,\n };\n};\n\nexport default useDedupedFetchVerse;\n","/* eslint-disable react-func/max-lines-per-function */\nimport { useMemo } from 'react';\n\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\nimport { useSWRConfig } from 'swr';\n\nimport styles from './TranslationViewCell.module.scss';\n\nimport Button, { ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport { ToastStatus, useToast } from '@/dls/Toast/Toast';\nimport BookmarkedIcon from '@/icons/bookmark.svg';\nimport { selectBookmarks, toggleVerseBookmark } from '@/redux/slices/QuranReader/bookmarks';\nimport { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles';\nimport { getMushafId } from '@/utils/api';\nimport { deleteBookmarkById } from '@/utils/auth/api';\nimport { makeBookmarkUrl } from '@/utils/auth/apiPaths';\nimport { isLoggedIn } from '@/utils/auth/login';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport BookmarksMap from 'types/BookmarksMap';\nimport BookmarkType from 'types/BookmarkType';\nimport Verse from 'types/Verse';\n\ntype Props = {\n verse: Verse;\n pageBookmarks: BookmarksMap | undefined;\n bookmarksRangeUrl: string;\n};\n\nconst BookmarkIcon: React.FC<Props> = ({ verse, pageBookmarks, bookmarksRangeUrl }) => {\n const { t } = useTranslation('quran-reader');\n const quranReaderStyles = useSelector(selectQuranReaderStyles, shallowEqual);\n const bookmarkedVerses = useSelector(selectBookmarks, shallowEqual);\n const { cache, mutate } = useSWRConfig();\n const toast = useToast();\n const dispatch = useDispatch();\n\n const isVerseBookmarked = useMemo(() => {\n const isUserLoggedIn = isLoggedIn();\n if (isUserLoggedIn && pageBookmarks) {\n return !!pageBookmarks[verse.verseKey];\n }\n return !!bookmarkedVerses[verse.verseKey];\n }, [bookmarkedVerses, pageBookmarks, verse.verseKey]);\n\n if (!isVerseBookmarked) return null;\n\n const mushafId = getMushafId(quranReaderStyles.quranFont, quranReaderStyles.mushafLines).mushaf;\n\n const onClick = () => {\n logButtonClick('translation_view_un_bookmark_verse');\n\n if (isLoggedIn()) {\n const bookmarkedVersesRange = cache.get(bookmarksRangeUrl);\n const nextBookmarkedVersesRange = {\n ...bookmarkedVersesRange,\n [verse.verseKey]: !isVerseBookmarked,\n };\n mutate(bookmarksRangeUrl, nextBookmarkedVersesRange, {\n revalidate: false,\n });\n\n cache.delete(\n makeBookmarkUrl(\n mushafId,\n Number(verse.chapterId),\n BookmarkType.Ayah,\n Number(verse.verseNumber),\n ),\n );\n\n const bookmarkId = pageBookmarks[verse.verseKey].id;\n if (bookmarkId) {\n deleteBookmarkById(bookmarkId).catch((err) => {\n if (err.status === 400) {\n toast(t('common:error.bookmark-sync'), {\n status: ToastStatus.Error,\n });\n return;\n }\n toast(t('common:error.general'), {\n status: ToastStatus.Error,\n });\n });\n }\n } else {\n dispatch(toggleVerseBookmark(verse.verseKey));\n }\n };\n\n return (\n <Button\n className={classNames(styles.iconContainer, styles.verseAction)}\n onClick={onClick}\n tooltip={t('remove-bookmark')}\n variant={ButtonVariant.Ghost}\n size={ButtonSize.Small}\n >\n <BookmarkedIcon />\n </Button>\n );\n};\n\nexport default BookmarkIcon;\n","import React from 'react';\n\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from './NewLabel.module.scss';\n\nconst NewLabel = () => {\n const { t } = useTranslation('common');\n return <p className={styles.label}>{t('new')}</p>;\n};\n\nexport default NewLabel;\n","import React from 'react';\n\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from './VerseLink.module.scss';\n\nimport Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { toLocalizedVerseKey } from '@/utils/locale';\nimport { getChapterWithStartingVerseUrl } from '@/utils/navigation';\n\ninterface Props {\n verseKey: string;\n}\n\nconst VerseLink: React.FC<Props> = ({ verseKey }) => {\n const { lang } = useTranslation('');\n return (\n <Button\n className={styles.verseLink}\n size={ButtonSize.Small}\n shape={ButtonShape.Circle}\n href={getChapterWithStartingVerseUrl(verseKey)}\n shouldShallowRoute\n variant={ButtonVariant.Ghost}\n shouldPrefetch={false}\n onClick={() => {\n logButtonClick('translation_view_verse_link');\n }}\n >\n {toLocalizedVerseKey(verseKey, lang)}\n </Button>\n );\n};\n\nexport default VerseLink;\n","import React, { RefObject, memo, useContext, useEffect } from 'react';\n\nimport { useSelector as useSelectorXstate } from '@xstate/react';\nimport classNames from 'classnames';\nimport { useRouter } from 'next/router';\nimport { useSelector } from 'react-redux';\n\nimport {\n verseFontChanged,\n verseTranslationChanged,\n verseTranslationFontChanged,\n} from '../utils/memoization';\n\nimport BookmarkIcon from './BookmarkIcon';\nimport TranslationText from './TranslationText';\nimport styles from './TranslationViewCell.module.scss';\n\nimport { useOnboarding } from '@/components/Onboarding/OnboardingProvider';\nimport QuranReflectButton from '@/components/QuranReader/QuranReflectButton';\nimport TafsirButton from '@/components/QuranReader/TafsirButton';\nimport VerseNotes from '@/components/Verse/Notes';\nimport OverflowVerseActionsMenu from '@/components/Verse/OverflowVerseActionsMenu';\nimport PlayVerseAudioButton from '@/components/Verse/PlayVerseAudioButton';\nimport VerseLink from '@/components/Verse/VerseLink';\nimport VerseText from '@/components/Verse/VerseText';\nimport Separator from '@/dls/Separator/Separator';\nimport useScroll, { SMOOTH_SCROLL_TO_TOP } from '@/hooks/useScrollToElement';\nimport { selectEnableAutoScrolling } from '@/redux/slices/AudioPlayer/state';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getVerseWords, makeVerseKey } from '@/utils/verse';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\nimport BookmarksMap from 'types/BookmarksMap';\nimport Translation from 'types/Translation';\nimport Verse from 'types/Verse';\n\ntype TranslationViewCellProps = {\n verse: Verse;\n quranReaderStyles: QuranReaderStyles;\n verseIndex: number;\n pageBookmarks: BookmarksMap | undefined;\n bookmarksRangeUrl: string;\n hasNotes?: boolean;\n};\n\nconst TranslationViewCell: React.FC<TranslationViewCellProps> = ({\n verse,\n quranReaderStyles,\n verseIndex,\n pageBookmarks,\n bookmarksRangeUrl,\n hasNotes,\n}) => {\n const router = useRouter();\n const { startingVerse } = router.query;\n\n const audioService = useContext(AudioPlayerMachineContext);\n\n const isHighlighted = useSelectorXstate(audioService, (state) => {\n const { ayahNumber, surah } = state.context;\n return makeVerseKey(surah, ayahNumber) === verse.verseKey;\n });\n\n const { isActive } = useOnboarding();\n // disable auto scrolling when the user is onboarding\n const enableAutoScrolling = useSelector(selectEnableAutoScrolling) && !isActive;\n\n const [scrollToSelectedItem, selectedItemRef]: [() => void, RefObject<HTMLDivElement>] =\n useScroll(SMOOTH_SCROLL_TO_TOP);\n\n useEffect(() => {\n if ((isHighlighted && enableAutoScrolling) || Number(startingVerse) === verseIndex + 1) {\n scrollToSelectedItem();\n }\n }, [isHighlighted, scrollToSelectedItem, enableAutoScrolling, startingVerse, verseIndex]);\n\n return (\n <div ref={selectedItemRef}>\n <div\n className={classNames(styles.cellContainer, {\n [styles.highlightedContainer]: isHighlighted,\n })}\n >\n <div className={styles.actionContainer}>\n <div className={styles.actionContainerLeft}>\n <div className={styles.actionItem}>\n <VerseLink verseKey={verse.verseKey} />\n </div>\n <div className={styles.actionItem}>\n <BookmarkIcon\n verse={verse}\n pageBookmarks={pageBookmarks}\n bookmarksRangeUrl={bookmarksRangeUrl}\n />\n </div>\n <div className={styles.actionItem}>\n <VerseNotes verseKey={verse.verseKey} isTranslationView hasNotes={hasNotes} />\n </div>\n <div className={classNames(styles.actionItem, styles.priorityAction)}>\n <PlayVerseAudioButton verseKey={verse.verseKey} />\n </div>\n <div className={classNames(styles.actionItem)}>\n <TafsirButton verseKey={verse.verseKey} />\n </div>\n <div className={classNames(styles.actionItem)}>\n <QuranReflectButton verseKey={verse.verseKey} />\n </div>\n </div>\n <div className={styles.actionContainerRight}>\n <div className={styles.actionItem}>\n <OverflowVerseActionsMenu bookmarksRangeUrl={bookmarksRangeUrl} verse={verse} />\n </div>\n </div>\n </div>\n\n <div className={classNames(styles.contentContainer)}>\n <div className={styles.arabicVerseContainer}>\n <VerseText words={getVerseWords(verse)} shouldShowH1ForSEO={verseIndex === 0} />\n </div>\n <div className={styles.verseTranslationsContainer}>\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={verse.translations?.length > 1 ? translation.resourceName : null}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n <Separator />\n </div>\n );\n};\n\n/**\n * Since we are passing verse and it's an object\n * even if the same verse is passed, its 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 verse id is the same.\n * 2. Check if the font changed.\n * 3. Check if number of translations are the same since on translation change, it should change.\n *\n * If the above condition is met, it's safe to assume that the result\n * of both renders are the same.\n *\n * @param {TranslationViewCellProps} prevProps\n * @param {TranslationViewCellProps} nextProps\n * @returns {boolean}\n */\nconst areVersesEqual = (\n prevProps: TranslationViewCellProps,\n nextProps: TranslationViewCellProps,\n): boolean =>\n prevProps.verse.id === nextProps.verse.id &&\n prevProps.hasNotes === nextProps.hasNotes &&\n !verseFontChanged(\n prevProps.quranReaderStyles,\n nextProps.quranReaderStyles,\n prevProps.verse.words,\n nextProps.verse.words,\n ) &&\n !verseTranslationChanged(prevProps.verse, nextProps.verse) &&\n !verseTranslationFontChanged(prevProps.quranReaderStyles, nextProps.quranReaderStyles) &&\n JSON.stringify(prevProps.pageBookmarks) === JSON.stringify(nextProps.pageBookmarks) &&\n prevProps.bookmarksRangeUrl === nextProps.bookmarksRangeUrl;\n\nexport default memo(TranslationViewCell, areVersesEqual);\n","import { useEffect, useRef } from 'react';\n\nimport useTranslation from 'next-translate/useTranslation';\nimport useSWRImmutable from 'swr/immutable';\n\nimport { useVerseTrackerContext } from '../../contexts/VerseTrackerContext';\nimport TranslationViewCell from '../TranslationViewCell';\n\nimport ChapterHeader from '@/components/chapters/ChapterHeader';\nimport useCountRangeNotes from '@/hooks/auth/useCountRangeNotes';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { VersesResponse } from '@/types/ApiResponses';\nimport Translation from '@/types/Translation';\nimport Verse from '@/types/Verse';\nimport { getPageBookmarks } from '@/utils/auth/api';\nimport { toLocalizedNumber } from '@/utils/locale';\n\ninterface TranslationPageVerse {\n verse: Verse;\n selectedTranslations?: number[];\n bookmarksRangeUrl: string | null;\n mushafId: number;\n verseIdx: number;\n quranReaderStyles: QuranReaderStyles;\n initialData: VersesResponse;\n firstVerseInPage: Verse;\n isLastVerseInView: boolean;\n notesRange: {\n from: string;\n to: string;\n } | null;\n}\n\nconst TranslationPageVerse: React.FC<TranslationPageVerse> = ({\n verse,\n selectedTranslations,\n bookmarksRangeUrl,\n mushafId,\n verseIdx,\n quranReaderStyles,\n initialData,\n firstVerseInPage,\n isLastVerseInView,\n notesRange,\n}) => {\n const { t, lang } = useTranslation('common');\n const containerRef = useRef<HTMLDivElement>(null);\n const { verseKeysQueue } = useVerseTrackerContext();\n\n const { data: pageBookmarks } = useSWRImmutable(bookmarksRangeUrl, async () => {\n const response = await getPageBookmarks(\n mushafId,\n Number(firstVerseInPage.chapterId),\n Number(firstVerseInPage.verseNumber),\n initialData.pagination.perPage,\n );\n return response;\n });\n\n const { data: notesCount } = useCountRangeNotes(notesRange);\n\n const getTranslationNameString = (translations?: Translation[]) => {\n let translationName = t('settings.no-translation-selected');\n if (translations?.length === 1) translationName = translations?.[0].resourceName;\n if (translations?.length === 2) {\n translationName = t('settings.value-and-other', {\n value: translations?.[0].resourceName,\n othersCount: toLocalizedNumber(translations.length - 1, lang),\n });\n }\n if (translations?.length > 2) {\n translationName = t('settings.value-and-others', {\n value: translations?.[0].resourceName,\n othersCount: toLocalizedNumber(translations.length - 1, lang),\n });\n }\n\n return translationName;\n };\n\n useEffect(() => {\n let observer: IntersectionObserver = null;\n\n if (containerRef.current) {\n observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n verseKeysQueue.current.add(verse.verseKey);\n }\n },\n {\n root: null,\n rootMargin: '0px',\n threshold: 0.5,\n },\n );\n observer.observe(containerRef.current);\n }\n\n return () => {\n observer?.disconnect();\n };\n }, [isLastVerseInView, verse, verseKeysQueue]);\n\n return (\n <div\n ref={isLastVerseInView ? containerRef : undefined}\n // key={currentVerseIndex}\n // if isLastPage, we want to detect when this element will be in the user's viewport\n // so we can add the last verse key to the queue\n >\n {verse.verseNumber === 1 && (\n <ChapterHeader\n translationName={getTranslationNameString(verse.translations)}\n chapterId={String(verse.chapterId)}\n pageNumber={verse.pageNumber}\n hizbNumber={verse.hizbNumber}\n isTranslationSelected={selectedTranslations?.length > 0}\n />\n )}\n\n <TranslationViewCell\n verseIndex={verseIdx}\n verse={verse}\n key={verse.id}\n quranReaderStyles={quranReaderStyles}\n pageBookmarks={pageBookmarks}\n bookmarksRangeUrl={bookmarksRangeUrl}\n hasNotes={notesCount && notesCount[verse.verseKey] > 0}\n />\n </div>\n );\n};\n\nexport default TranslationPageVerse;\n","/* eslint-disable max-lines */\nimport React from 'react';\n\nimport styles from '../TranslationView.module.scss';\nimport TranslationViewCellSkeleton from '../TranslationViewCellSkeleton';\n\nimport useDedupedFetchVerse from './hooks/useDedupedFetchVerse';\nimport TranslationPageVerse from './TranslationPageVerse';\n\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { getMushafId } from '@/utils/api';\nimport { VersesResponse } from 'types/ApiResponses';\nimport { QuranReaderDataType } from 'types/QuranReader';\nimport Verse from 'types/Verse';\n\ninterface Props {\n quranReaderStyles: QuranReaderStyles;\n selectedTranslations: number[];\n setApiPageToVersesMap: (data: Record<number, Verse[]>) => void;\n quranReaderDataType: QuranReaderDataType;\n wordByWordLocale: string;\n reciterId: number;\n resourceId: number | string;\n initialData: VersesResponse;\n verseIdx: number;\n totalVerses: number;\n}\n\nconst TranslationViewVerse: React.FC<Props> = ({\n quranReaderDataType,\n wordByWordLocale,\n reciterId,\n resourceId,\n setApiPageToVersesMap,\n initialData,\n quranReaderStyles,\n selectedTranslations,\n verseIdx,\n totalVerses,\n}) => {\n const mushafId = getMushafId(quranReaderStyles.quranFont, quranReaderStyles.mushafLines).mushaf;\n\n const { verse, firstVerseInPage, bookmarksRangeUrl, notesRange } = useDedupedFetchVerse({\n verseIdx,\n quranReaderDataType,\n quranReaderStyles,\n wordByWordLocale,\n reciterId,\n resourceId,\n selectedTranslations,\n initialData,\n setApiPageToVersesMap,\n mushafId,\n });\n\n if (!verse) {\n return (\n <div className={styles.container}>\n <TranslationViewCellSkeleton />\n </div>\n );\n }\n\n return (\n <div className={styles.container}>\n <TranslationPageVerse\n isLastVerseInView={verseIdx + 1 === totalVerses}\n verse={verse}\n verseIdx={verseIdx}\n mushafId={mushafId}\n quranReaderStyles={quranReaderStyles}\n selectedTranslations={selectedTranslations}\n bookmarksRangeUrl={bookmarksRangeUrl}\n initialData={initialData}\n firstVerseInPage={firstVerseInPage}\n notesRange={notesRange}\n />\n </div>\n );\n};\n\nexport default TranslationViewVerse;\n","/* eslint-disable max-lines */\n/* eslint-disable react/no-multi-comp */\nimport { useMemo, useRef, useState } from 'react';\n\nimport dynamic from 'next/dynamic';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\n\nimport onCopyQuranWords from '../onCopyQuranWords';\nimport QueryParamMessage from '../QueryParamMessage';\n\nimport useGetVersesCount from './hooks/useGetVersesCount';\nimport useScrollToVirtualizedVerse from './hooks/useScrollToVirtualizedVerse';\nimport styles from './TranslationView.module.scss';\nimport TranslationViewVerse from './TranslationViewVerse';\n\nimport Spinner from '@/dls/Spinner/Spinner';\nimport useGetQueryParamOrReduxValue from '@/hooks/useGetQueryParamOrReduxValue';\nimport useGetQueryParamOrXstateValue from '@/hooks/useGetQueryParamOrXstateValue';\nimport useQcfFont from '@/hooks/useQcfFont';\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { VersesResponse } from 'types/ApiResponses';\nimport QueryParam from 'types/QueryParam';\nimport { QuranReaderDataType } from 'types/QuranReader';\nimport Verse from 'types/Verse';\n\ntype TranslationViewProps = {\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 EndOfScrollingControls = dynamic(() => import('../EndOfScrollingControls'), {\n ssr: false,\n loading: () => <Spinner />,\n});\n\nconst INCREASE_VIEWPORT_BY_PIXELS = 1000;\n\nconst TranslationView = ({\n quranReaderStyles,\n quranReaderDataType,\n initialData,\n resourceId,\n}: TranslationViewProps) => {\n const [apiPageToVersesMap, setApiPageToVersesMap] = useState<Record<number, Verse[]>>({\n 1: initialData.verses,\n });\n const {\n value: reciterId,\n isQueryParamDifferent: reciterQueryParamDifferent,\n }: { value: number; isQueryParamDifferent: boolean } = useGetQueryParamOrXstateValue(\n QueryParam.Reciter,\n );\n const {\n value: selectedTranslations,\n isQueryParamDifferent: translationsQueryParamDifferent,\n }: { value: number[]; isQueryParamDifferent: boolean } = useGetQueryParamOrReduxValue(\n QueryParam.Translations,\n );\n const {\n value: wordByWordLocale,\n isQueryParamDifferent: wordByWordLocaleQueryParamDifferent,\n }: { value: string; isQueryParamDifferent: boolean } = useGetQueryParamOrReduxValue(\n QueryParam.WBW_LOCALE,\n );\n\n const versesCount = useGetVersesCount({\n resourceId,\n quranReaderDataType,\n initialData,\n quranReaderStyles,\n });\n\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n useScrollToVirtualizedVerse(\n quranReaderDataType,\n virtuosoRef,\n apiPageToVersesMap,\n String(resourceId),\n initialData.pagination.perPage,\n );\n const verses = useMemo(() => Object.values(apiPageToVersesMap).flat(), [apiPageToVersesMap]);\n useQcfFont(quranReaderStyles.quranFont, verses);\n\n const itemContentRenderer = (verseIdx: number) => {\n if (verseIdx === versesCount) {\n return (\n <EndOfScrollingControls\n quranReaderDataType={quranReaderDataType}\n lastVerse={verses[verses.length - 1]}\n initialData={initialData}\n />\n );\n }\n\n return (\n <TranslationViewVerse\n verseIdx={verseIdx}\n totalVerses={versesCount}\n quranReaderDataType={quranReaderDataType}\n quranReaderStyles={quranReaderStyles}\n setApiPageToVersesMap={setApiPageToVersesMap}\n selectedTranslations={selectedTranslations}\n wordByWordLocale={wordByWordLocale}\n reciterId={reciterId}\n initialData={initialData}\n resourceId={resourceId}\n />\n );\n };\n\n const shouldShowQueryParamMessage =\n translationsQueryParamDifferent ||\n reciterQueryParamDifferent ||\n wordByWordLocaleQueryParamDifferent;\n\n return (\n <>\n {shouldShowQueryParamMessage && (\n <QueryParamMessage\n translationsQueryParamDifferent={translationsQueryParamDifferent}\n reciterQueryParamDifferent={reciterQueryParamDifferent}\n wordByWordLocaleQueryParamDifferent={wordByWordLocaleQueryParamDifferent}\n />\n )}\n\n <div\n className={styles.wrapper}\n onCopy={(event) => onCopyQuranWords(event, verses, quranReaderStyles.quranFont)}\n >\n <Virtuoso\n ref={virtuosoRef}\n useWindowScroll\n totalCount={versesCount + 1}\n increaseViewportBy={INCREASE_VIEWPORT_BY_PIXELS}\n initialItemCount={1} // needed for SSR.\n itemContent={itemContentRenderer}\n />\n </div>\n </>\n );\n};\n\nexport default TranslationView;\n","/* eslint-disable react/no-multi-comp */\nimport React from 'react';\n\nimport dynamic from 'next/dynamic';\n\nimport useSyncReadingProgress from './hooks/useSyncReadingProgress';\nimport ReadingPreferenceSwitcher from './ReadingPreferenceSwitcher';\nimport TranslationView from './TranslationView';\n\nimport QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport { VersesResponse } from 'types/ApiResponses';\nimport { QuranReaderDataType } from 'types/QuranReader';\n\nconst ReadingView = dynamic(() => import('./ReadingView'));\n\ninterface Props {\n isReadingPreference: boolean;\n quranReaderStyles: QuranReaderStyles;\n quranReaderDataType: QuranReaderDataType;\n initialData: VersesResponse;\n resourceId: number | string;\n}\n\nconst QuranReaderView: React.FC<Props> = ({\n isReadingPreference,\n quranReaderStyles,\n quranReaderDataType,\n initialData,\n resourceId,\n}) => {\n useSyncReadingProgress({\n isReadingPreference,\n });\n\n if (isReadingPreference) {\n return (\n <>\n <ReadingPreferenceSwitcher />\n <ReadingView\n quranReaderStyles={quranReaderStyles}\n quranReaderDataType={quranReaderDataType}\n initialData={initialData}\n resourceId={resourceId}\n />\n </>\n );\n }\n\n return (\n <>\n <ReadingPreferenceSwitcher />\n <TranslationView\n quranReaderStyles={quranReaderStyles}\n quranReaderDataType={quranReaderDataType}\n initialData={initialData}\n resourceId={resourceId}\n />\n </>\n );\n};\n\nexport default QuranReaderView;\n","import styles from './SidebarSelectionSkeleton.module.scss';\n\nimport Skeleton from '@/dls/Skeleton/Skeleton';\n\nconst ROWS_COUNT = 12;\nconst rowsArr = Array(ROWS_COUNT).fill(null);\n\nconst SidebarSelectionSkeleton = () => {\n return (\n <div className={styles.skeletonContainer}>\n {rowsArr.map((k, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Skeleton key={`skeleton_${i}`} isActive isSquared className={styles.row} />\n ))}\n </div>\n );\n};\n\nexport default SidebarSelectionSkeleton;\n","import React from 'react';\n\nimport dynamic from 'next/dynamic';\n\nimport SidebarSelectionSkeleton from './SidebarSelectionSkeleton';\n\nimport {\n IsSidebarNavigationVisible,\n NavigationItem,\n} from '@/redux/slices/QuranReader/sidebarNavigation';\n\nconst PageSelection = dynamic(() => import('./PageSelection'), {\n loading: SidebarSelectionSkeleton,\n});\nconst SurahSelection = dynamic(() => import('./SurahSelection'), {\n loading: SidebarSelectionSkeleton,\n});\nconst JuzSelection = dynamic(() => import('./JuzSelection'), {\n loading: SidebarSelectionSkeleton,\n});\n// const HizbSelection = dynamic(() => import('./HizbSelection'), {\n// loading: SidebarSelectionSkeleton,\n// });\n\ntype Props = {\n isVisible: IsSidebarNavigationVisible;\n selectedNavigationItem: string;\n};\n\nconst SidebarNavigationSelections: React.FC<Props> = ({ isVisible, selectedNavigationItem }) => {\n // we skip requesting any selection list if the drawer is not open.\n if (!isVisible) return <></>;\n\n if (selectedNavigationItem === NavigationItem.Surah) return <SurahSelection />;\n if (selectedNavigationItem === NavigationItem.Juz) return <JuzSelection />;\n // if (selectedNavigationItem === NavigationItem.Hizb) return <HizbSelection />;\n\n return <PageSelection />;\n};\n\nexport default SidebarNavigationSelections;\n","/* eslint-disable react/no-multi-comp */\nimport { useRef } from 'react';\n\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux';\n\nimport styles from './SidebarNavigation.module.scss';\nimport SidebarNavigationSelections from './SidebarNavigationSelections';\n\nimport RevelationOrderNavigationNotice, {\n RevelationOrderNavigationNoticeView,\n} from '@/components/QuranReader/RevelationOrderNavigationNotice';\nimport Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport KeyboardInput from '@/dls/KeyboardInput';\nimport Switch from '@/dls/Switch/Switch';\nimport useOutsideClickDetector from '@/hooks/useOutsideClickDetector';\nimport IconClose from '@/icons/close.svg';\nimport { selectContextMenu } from '@/redux/slices/QuranReader/contextMenu';\nimport {\n selectIsSidebarNavigationVisible,\n selectNavigationItem,\n selectSelectedNavigationItem,\n NavigationItem,\n setIsVisible,\n} from '@/redux/slices/QuranReader/sidebarNavigation';\nimport { selectIsReadingByRevelationOrder } from '@/redux/slices/revelationOrder';\nimport { logButtonClick, logEvent, logValueChange } from '@/utils/eventLogger';\nimport { isMobile } from '@/utils/responsive';\n\nconst SidebarNavigation = () => {\n const { isExpanded: isContextMenuExpanded } = useSelector(selectContextMenu, shallowEqual);\n const isVisible = useSelector(selectIsSidebarNavigationVisible);\n const selectedNavigationItem = useSelector(selectSelectedNavigationItem);\n const isReadingByRevelationOrder = useSelector(selectIsReadingByRevelationOrder);\n\n const dispatch = useDispatch();\n const { t } = useTranslation('common');\n const sidebarRef = useRef();\n\n useOutsideClickDetector(\n sidebarRef,\n () => {\n logEvent('sidebar_navigation_close_outside_click');\n dispatch(setIsVisible(false));\n },\n isVisible && isMobile(),\n );\n\n const navigationItems = [\n {\n name: t('surah'),\n value: NavigationItem.Surah,\n },\n {\n name: t('juz'),\n value: NavigationItem.Juz,\n },\n // {\n // name: t('hizb'),\n // value: NavigationItem.Hizb,\n // },\n {\n name: t('page'),\n value: NavigationItem.Page,\n },\n ];\n\n return (\n <div\n ref={sidebarRef}\n className={classNames(styles.container, {\n [styles.visibleContainer]: isVisible === true,\n [styles.containerAuto]: isVisible === 'auto',\n [styles.spaceOnTop]: isContextMenuExpanded,\n })}\n >\n {!isReadingByRevelationOrder ? (\n // Default ordering\n <>\n <div className={styles.header}>\n <div className={styles.switchContainer}>\n <Switch\n items={navigationItems}\n selected={selectedNavigationItem}\n onSelect={(value) => {\n logValueChange('sidebar_navigation_view', selectedNavigationItem, value);\n dispatch(selectNavigationItem(value as NavigationItem));\n }}\n />\n </div>\n <Button\n tooltip={t('close')}\n shape={ButtonShape.Circle}\n size={ButtonSize.Small}\n variant={ButtonVariant.Ghost}\n onClick={() => {\n logButtonClick('sidebar_navigation_close');\n dispatch(setIsVisible(false));\n }}\n ariaLabel={t('aria.sidebar-nav-close')}\n >\n <IconClose />\n </Button>\n </div>\n <p className={styles.tip}>\n <span>{t('sidebar.try-navigating-with')}</span>\n <KeyboardInput meta keyboardKey=\"K\" />\n </p>\n\n <div className={styles.contentContainer}>\n <SidebarNavigationSelections\n isVisible={isVisible}\n selectedNavigationItem={selectedNavigationItem}\n />\n </div>\n </>\n ) : (\n // Revelation ordering\n <>\n <div className={styles.revelationOrderHeader}>\n <Button\n tooltip={t('close')}\n shape={ButtonShape.Circle}\n size={ButtonSize.Small}\n variant={ButtonVariant.Ghost}\n onClick={() => {\n logButtonClick('sidebar_navigation_close');\n dispatch(setIsVisible(false));\n }}\n ariaLabel={t('aria.sidebar-nav-close')}\n >\n <IconClose />\n </Button>\n </div>\n <RevelationOrderNavigationNotice view={RevelationOrderNavigationNoticeView.SideDrawer} />\n <SidebarNavigationSelections\n isVisible={isVisible}\n selectedNavigationItem={NavigationItem.Surah}\n />{' '}\n </>\n )}\n </div>\n );\n};\n\nexport default SidebarNavigation;\n","/* eslint-disable react/no-multi-comp */\nimport React from 'react';\n\nimport classNames from 'classnames';\nimport useTranslation from 'next-translate/useTranslation';\nimport { shallowEqual, useSelector } from 'react-redux';\n\nimport ContextMenu from './ContextMenu';\nimport { VerseTrackerContextProvider } from './contexts/VerseTrackerContext';\nimport DebuggingObserverWindow from './DebuggingObserverWindow';\nimport Notes from './Notes/Notes';\nimport styles from './QuranReader.module.scss';\nimport QuranReaderView from './QuranReaderView';\nimport SidebarNavigation from './SidebarNavigation/SidebarNavigation';\n\nimport FontPreLoader from '@/components/Fonts/FontPreLoader';\nimport { selectNotes } from '@/redux/slices/QuranReader/notes';\nimport { selectReadingPreference } from '@/redux/slices/QuranReader/readingPreferences';\nimport { selectIsSidebarNavigationVisible } from '@/redux/slices/QuranReader/sidebarNavigation';\nimport { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles';\nimport { VersesResponse } from 'types/ApiResponses';\nimport { QuranReaderDataType, ReadingPreference } from 'types/QuranReader';\n\ntype QuranReaderProps = {\n initialData: VersesResponse;\n id: number | string; // can be the chapter, verse, tafsir, hizb, juz, rub or page's ID.\n quranReaderDataType?: QuranReaderDataType;\n};\n\nconst QuranReader = ({\n initialData,\n id,\n quranReaderDataType = QuranReaderDataType.Chapter,\n}: QuranReaderProps) => {\n const { lang } = useTranslation();\n const isSideBarVisible = useSelector(selectNotes, shallowEqual).isVisible;\n const quranReaderStyles = useSelector(selectQuranReaderStyles, shallowEqual);\n const isSidebarNavigationVisible = useSelector(selectIsSidebarNavigationVisible);\n const readingPreference = useSelector(selectReadingPreference) as ReadingPreference;\n const isReadingPreference = readingPreference === ReadingPreference.Reading;\n\n return (\n <>\n <FontPreLoader isQuranReader locale={lang} />\n <ContextMenu />\n <DebuggingObserverWindow isReadingMode={isReadingPreference} />\n <div\n className={classNames(styles.container, {\n [styles.withVisibleSideBar]: isSideBarVisible,\n [styles.withSidebarNavigationOpenOrAuto]: isSidebarNavigationVisible,\n })}\n >\n <div\n className={classNames(styles.infiniteScroll, {\n [styles.readingView]: isReadingPreference,\n })}\n >\n <VerseTrackerContextProvider>\n <QuranReaderView\n isReadingPreference={isReadingPreference}\n quranReaderStyles={quranReaderStyles}\n initialData={initialData}\n quranReaderDataType={quranReaderDataType}\n resourceId={id}\n />\n </VerseTrackerContextProvider>\n </div>\n </div>\n <SidebarNavigation />\n <Notes />\n </>\n );\n};\n\nexport default QuranReader;\n","import clipboardCopy from 'clipboard-copy';\n\nimport { DATA_ATTRIBUTE_WORD_LOCATION } from '@/dls/QuranWord/QuranWord';\nimport { getWordDataByLocation } from '@/utils/verse';\nimport { getWordTextFieldNameByFont } from '@/utils/word';\nimport { QuranFont } from 'types/QuranReader';\nimport Verse from 'types/Verse';\n\n/**\n * 1) select all DOM nodes that contain data attribute `data-word-location`\n * 2) see if those nodes are within `selection`\n * 3) extract uthmani_text for those nodes\n * 4) copy those uthmani_text to clipboard\n *\n * We need to use uthmani_text instead of the rendered text to support unicode based fonts like v1 and v2.\n *\n * @param {React.ClipboardEvent<HTMLDivElement>} event\n * @param {Verse[]} verses all verses to scan for `data-word-location`\n * @param {QuranFont} quranFont font to copy, if not `text_indopak` or `text_uthmani` then will use `text_uthmani` to support unicode based fonts\n */\nconst onCopyQuranWords = (\n event: React.ClipboardEvent<HTMLDivElement>,\n verses: Verse[],\n quranFont: QuranFont,\n) => {\n const selection = document.getSelection();\n const quranWordsToCopy = Array.from(\n document.querySelectorAll(`[${DATA_ATTRIBUTE_WORD_LOCATION}]`),\n )\n .filter((node) => selection.containsNode(node, true))\n .map((node) => {\n const wordLocation = node.getAttribute(DATA_ATTRIBUTE_WORD_LOCATION);\n return extractText(wordLocation, verses, quranFont);\n });\n\n if (quranWordsToCopy.length > 0) {\n // only do prevent default & call clipboardCopy when there are quran words to copy\n // otherwise, user can't copy the translation text\n event.preventDefault();\n clipboardCopy(quranWordsToCopy.join(' '));\n }\n};\n\n/**\n *\n * @param {string} wordLocation example: \"1:1:1\" (chapter 1, verse 1, word position 1)\n * @param {Verse[]} verses list of verses to search for wordLocation\n * @param {QuranFont} quranFont font to copy, if not `text_indopak` or `text_uthmani` then will use `text_uthmani` to support unicode based fonts\n * @returns {string} text of the wordLocation. example \"ٱلْحَمْدُ\"\n */\nconst extractText = (wordLocation: string, verses: Verse[], quranFont: QuranFont) => {\n const [chapter, verse, location] = getWordDataByLocation(wordLocation);\n\n // find the verse\n const selectedVerse = verses.find((v) => v.verseKey === `${chapter}:${verse}`);\n if (!selectedVerse) {\n return '';\n }\n\n // find the word\n const selectedWord = selectedVerse.words.find(\n (word) => Number(word.position) === Number(location),\n );\n if (!selectedWord) {\n return '';\n }\n return selectedWord[getWordTextFieldNameByFont(quranFont)];\n};\n\nexport default onCopyQuranWords;\n","import QuranReaderStyles from '@/redux/types/QuranReaderStyles';\nimport Verse from 'types/Verse';\nimport Word from 'types/Word';\n\n/**\n * If the number of translations has changed between 2 renders it's due to the\n * user choosing/un-choosing a translation.\n *\n * @param {Verse} prevVerse\n * @param {Verse} nextVerse\n * @returns {boolean}\n */\nexport const verseTranslationChanged = (prevVerse: Verse, nextVerse: Verse): boolean =>\n prevVerse?.translations?.length !== nextVerse?.translations?.length;\n\n/**\n * Checks whether the translation font styles has changed between the re-renders\n *\n * @param {QuranReaderStyles} prevQuranStyles\n * @param {QuranReaderStyles} nextQuranStyles\n * @returns {boolean}\n */\nexport const verseTranslationFontChanged = (\n prevQuranStyles: QuranReaderStyles,\n nextQuranStyles: QuranReaderStyles,\n): boolean => prevQuranStyles.translationFontScale !== nextQuranStyles.translationFontScale;\n\n/**\n * Check whether the font has changed or not between 2 renders. We consider the font\n * has changed also when the number of lines in indopak has changed or when the word\n * by word tooltip locale has changed.\n *\n * @param {QuranReaderStyles} prevQuranStyles\n * @param {QuranReaderStyles} nextQuranStyles\n * @param {Word[]} prevWords\n * @param {Word[]} nextWords\n * @returns {boolean}\n */\nexport const verseFontChanged = (\n prevQuranStyles: QuranReaderStyles,\n nextQuranStyles: QuranReaderStyles,\n prevWords: Word[],\n nextWords: Word[],\n): boolean =>\n prevQuranStyles.mushafLines !== nextQuranStyles.mushafLines ||\n prevWords.length !== nextWords.length ||\n prevWords[0].text !== nextWords[0].text ||\n prevWords[0].translation.languageName !== nextWords[0].translation.languageName;\n","import { QuranFont } from 'types/QuranReader';\n\n// Pages where we want to have center align text to resemble the Madani Mushaf\nconst CENTER_ALIGNED_PAGES = [1, 2];\n\n// Lines that need to be center aligned\nconst CENTER_ALIGNED_PAGE_LINES = {\n 255: [2], // 13(Ar-Ra'd), last ayah\n 528: [9], // 67 (Al Qalam) last ayah\n 534: [6], // 55(Ar-Rahman) last ayah\n 545: [6], // 58(Al-Mujadila) last ayah\n 586: [1], // 80('Abasa) last ayah\n 593: [2], // 88(Al-Ghashiyah) last 2 ayah\n 594: [5], // 89(Al-Fajr) last 2 ayah\n 600: [10], // 100(Al-'Adiyat) last 2 ayah\n 602: [5, 15], // 106(Quraysh) last ayah, 108(Al-Kawthar) last ayah\n 603: [10, 15], // 110(An-Nasr) last ayah, 111(Al-Masad) last ayah\n 604: [4, 9, 14, 15], // 112(Al-Ikhlas) last ayah, 113(Al-Falaq) last ayah, 114(An-Nas) last 2 ayah\n};\n\n/**\n * Util function to check if page or specific line should be center aligned to\n * resemble the printed Madani Mushaf.\n *\n * @param {number} pageNumber\n * @param {number} lineNumber\n * @param {QuranFont} quranFont\n * @returns {boolean}\n */\nconst isCenterAlignedPage = (\n pageNumber: number,\n lineNumber: number,\n quranFont: QuranFont,\n): boolean => {\n if (quranFont === QuranFont.IndoPak) {\n return false;\n }\n const centerAlignedLines = CENTER_ALIGNED_PAGE_LINES[pageNumber] || [];\n return CENTER_ALIGNED_PAGES.includes(pageNumber) || centerAlignedLines.includes(lineNumber);\n};\n\nexport default isCenterAlignedPage;\n","import React, { useMemo, useRef } from 'react';\n\nimport classNames from 'classnames';\nimport { useRouter } from 'next/router';\nimport { shallowEqual, useSelector } from 'react-redux';\n\nimport { QURAN_READER_OBSERVER_ID } from '../QuranReader/observer';\n\nimport isCenterAlignedPage from './pageUtils';\nimport styles from './VerseText.module.scss';\n\nimport useIsFontLoaded from '@/components/QuranReader/hooks/useIsFontLoaded';\nimport QuranWord from '@/dls/QuranWord/QuranWord';\nimport useIntersectionObserver from '@/hooks/useObserveElement';\nimport { selectInlineDisplayWordByWordPreferences } from '@/redux/slices/QuranReader/readingPreferences';\nimport {\n selectReadingViewSelectedVerseKey,\n selectReadingViewHoveredVerseKey,\n} from '@/redux/slices/QuranReader/readingViewVerse';\nimport { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles';\nimport QueryParam from '@/types/QueryParam';\nimport { getFontClassName } from '@/utils/fontFaceHelper';\nimport { getFirstWordOfSurah } from '@/utils/verse';\nimport { FALLBACK_FONT, QuranFont } from 'types/QuranReader';\nimport Word from 'types/Word';\n\ntype VerseTextProps = {\n words: Word[];\n isReadingMode?: boolean;\n isHighlighted?: boolean;\n shouldShowH1ForSEO?: boolean;\n};\n\nconst VerseText = ({\n words,\n isReadingMode = false,\n isHighlighted,\n shouldShowH1ForSEO = false,\n}: VerseTextProps) => {\n const router = useRouter();\n const textRef = useRef(null);\n useIntersectionObserver(textRef, QURAN_READER_OBSERVER_ID);\n const { quranFont, quranTextFontScale, mushafLines } = useSelector(\n selectQuranReaderStyles,\n shallowEqual,\n );\n const [firstWord] = words;\n const { lineNumber, pageNumber, location, verseKey, hizbNumber } = firstWord;\n const isFontLoaded = useIsFontLoaded(firstWord.pageNumber, quranFont);\n const { showWordByWordTranslation, showWordByWordTransliteration } = useSelector(\n selectInlineDisplayWordByWordPreferences,\n shallowEqual,\n );\n const selectedVerseKey = useSelector(selectReadingViewSelectedVerseKey, shallowEqual);\n const hoveredVerseKey = useSelector(selectReadingViewHoveredVerseKey, shallowEqual);\n const centerAlignPage = useMemo(\n () => isCenterAlignedPage(pageNumber, lineNumber, quranFont),\n [pageNumber, lineNumber, quranFont],\n );\n // if it's translation mode and hideArabic query param is true, don't show the verse text\n if (isReadingMode === false && router?.query?.[QueryParam.HIDE_ARABIC] === 'true') {\n return null;\n }\n const firstWordData = getFirstWordOfSurah(location);\n const isTajweedFont = quranFont === QuranFont.Tajweed;\n const isBigTextLayout =\n (isReadingMode &&\n (quranTextFontScale > 3 || showWordByWordTranslation || showWordByWordTransliteration)) ||\n isTajweedFont;\n\n const { chapterId } = firstWordData;\n\n const VerseTextContainer = shouldShowH1ForSEO ? 'h1' : 'div';\n const fontClassName = isFontLoaded\n ? getFontClassName(quranFont, quranTextFontScale, mushafLines)\n : getFontClassName(FALLBACK_FONT, quranTextFontScale, mushafLines, true);\n return (\n <>\n <VerseTextContainer\n ref={textRef}\n data-verse-key={verseKey}\n data-page={pageNumber}\n data-chapter-id={chapterId}\n data-hizb={hizbNumber}\n className={classNames(styles.verseTextContainer, {\n [styles.largeQuranTextLayoutContainer]: isBigTextLayout,\n [styles.highlighted]: isHighlighted,\n [styles[fontClassName]]: !isTajweedFont,\n [styles.tafsirOrTranslationMode]: !isReadingMode,\n })}\n >\n <div\n translate=\"no\"\n className={classNames(styles.verseText, {\n [styles.verseTextWrap]: !isReadingMode,\n [styles.largeQuranTextLayout]: isBigTextLayout,\n [styles.verseTextCenterAlign]: isReadingMode && centerAlignPage,\n [styles.verseTextSpaceBetween]: isReadingMode && !centerAlignPage,\n })}\n >\n {words?.map((word) => (\n <QuranWord\n key={word.location}\n word={word}\n font={quranFont}\n isFontLoaded={isFontLoaded}\n isHighlighted={word.verseKey === selectedVerseKey}\n shouldShowSecondaryHighlight={word.verseKey === hoveredVerseKey}\n />\n ))}\n </div>\n </VerseTextContainer>\n </>\n );\n};\n\nexport default React.memo(VerseText);\n","var _switch;\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 SvgBismillah = function SvgBismillah(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n baseProfile: \"tiny\",\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 220,\n height: 45,\n viewBox: \"0 0 176 36\",\n overflow: \"inherit\",\n xmlSpace: \"preserve\"\n }, props), _switch || (_switch = /*#__PURE__*/React.createElement(\"switch\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"currentColor\",\n d: \"M165.716 11.67c-.586-.089-1.021-.134-1.306-.134-.277 0-.644.273-1.099.818-.391.472-.586.781-.586.928a.217.217 0 0 0 .03.061c.012.016.03.024.055.024.008 0 .09-.063.244-.189s.301-.189.439-.189c.969 0 1.64.094 2.014.281-.357.26-.943.521-1.757.781-.659.211-.981.354-.965.427.024.081.366.094 1.025.037.651-.057 1.099-.143 1.343-.256.31-.146.667-.464 1.074-.952.439-.521.659-.932.659-1.233.002-.148-.389-.282-1.17-.404zm1.953 6.835c-.024 0-.092.13-.201.391-.11.26-.279.391-.507.391-.334 0-.501-.203-.501-.611 0-.179.051-.429.153-.75.102-.321.152-.535.152-.641 0-.065-.021-.105-.062-.122-.138-.073-.321.191-.549.793-.22.57-.329.989-.329 1.257 0 .277.081.546.243.807.188.284.411.427.672.427.342 0 .614-.179.817-.537.171-.301.257-.639.257-1.013.001-.277-.047-.408-.145-.392zm4.571 9.026c-.533-.271-.856-.408-.971-.408-.057 0-.207.258-.451.775-.244.516-.366.836-.366.958 0 .057.262.235.787.537.524.301.84.451.946.451.089 0 .254-.269.494-.806.239-.537.359-.879.359-1.025.001-.048-.266-.208-.798-.482zm2.203 3.449c-.058-.025-.92.346-2.588 1.11-1.701.781-2.648 1.257-2.844 1.429-.163.138-.362.361-.599.671-.284.366-.427.614-.427.745 0 .016.008.027.024.036-.073 0 .765-.411 2.515-1.233.919-.432 1.814-.846 2.685-1.244.163-.106.407-.338.732-.696.351-.391.525-.651.525-.781.002-.017-.007-.029-.023-.037zm-1.025-13.061c-1.074-2.034-1.733-3.051-1.978-3.051-.236 0-.354.504-.354 1.514 0 .35.04.785.122 1.306.089.545.166.818.231.818.122 0 .184-.403.184-1.208.398.529.956 1.489 1.672 2.881.789 1.529 1.184 2.502 1.184 2.917 0 .285-.211.428-.635.428-.301 0-.667-.062-1.099-.184-.488-.13-.817-.28-.988-.451.073-.488.041-.749-.098-.781-.114-.024-.293.265-.537.866-.244.603-.443.903-.598.903-.586 0-1.07-.142-1.453-.427.154-.521.244-.83.269-.928 0-.098-.028-.167-.085-.208-.106-.032-.257.114-.452.44-.261.438-.513.752-.757.939-.333.26-.813.391-1.44.391-.724 0-1.114-.057-1.171-.172.122-.072.237-.235.348-.488.109-.252.164-.459.164-.622 0-.098-.028-.15-.085-.158-.073-.017-.188.069-.342.256a2.502 2.502 0 0 1-.684.586c-.911.521-4.374 1.11-10.388 1.771-2.913.316-6.615.598-11.107.842-4.825.26-9.085.391-12.779.391-7.683 0-14.961-.342-21.837-1.025-2.971-.293-4.932-.537-5.884-.732-2.449-.496-4.142-1.266-5.078-2.307-.431-.48-.748-.717-.951-.708-.424.017-.854.415-1.294 1.196-.407.707-.61 1.298-.61 1.77 0 .326.187.659.562 1.001-2.222 1.603-3.942 2.815-5.163 3.638-.334.22-.484.357-.452.415.008.024.037.036.086.036.366 0 1.172-.252 2.416-.756 1.245-.506 2.011-.888 2.295-1.148.488-.447.903-1.082 1.245-1.904.269.18.738.362 1.41.55.671.187 1.166.272 1.482.257.098-.009.229-.257.391-.745 2.312.554 5.619 1.038 9.924 1.452 2.922.285 6.689.525 11.303.721 4.158.179 7.52.269 10.083.269 3.011 0 7.12-.163 12.328-.488 4.979-.31 9-.64 12.06-.989 4.833-.553 7.999-1.191 9.496-1.916a1.735 1.735 0 0 0-.085.439c0 .326.618.488 1.854.488.854 0 1.575-.342 2.161-1.025.586.473 1.232.708 1.94.708.398 0 .798-.603 1.196-1.807.212.188.582.432 1.11.732.627.358 1.059.537 1.294.537.236 0 .493-.179.77-.537.357-.472.537-1.082.537-1.831 0-1.052-.578-2.673-1.733-4.862zM96.61 4.59c-.109-.122-.229-.183-.359-.183-.847 0-1.567.635-2.161 1.904-.139-.008-.313-.063-.524-.165-.212-.102-.366-.152-.464-.152-.317 0-.647.22-.988.659-.31.399-.465.72-.465.964 0 .082.033.122.098.122.033 0 .161-.132.385-.397.224-.264.417-.396.58-.396.13 0 .34.071.629.213.288.143.563.214.823.214.684 0 1.29-.232 1.819-.696.528-.464.793-1.033.793-1.709a.566.566 0 0 0-.166-.378zm-1.788 10.669a1763.66 1763.66 0 0 0-.977-4.492c-.252-1.253-.406-1.879-.464-1.879-.235 0-.354.85-.354 2.551l.744 3.271c.529 2.278.858 3.812.989 4.601l.293 2.063c.105.7.183 1.05.231 1.05.236 0 .354-.766.354-2.295.003-.708-.271-2.332-.816-4.87zM85.998 6.91a7.41 7.41 0 0 0-.391 1.135c.879.968 1.363 2.079 1.453 3.332.024.366.061.549.109.549.18 0 .269-.435.269-1.306 0-1.383-.48-2.62-1.44-3.71zm2.514 6.298c-.081-.504-.188-.752-.317-.745-.105 0-.146.138-.122.415.032.326.024.529-.024.61a.632.632 0 0 1-.366.159c-.162.017-.276-.024-.342-.122-.032-.057-.057-.228-.073-.513-.008-.228-.053-.342-.134-.342-.082.017-.139.159-.171.427-.041.35-.077.562-.11.635-.105.236-.321.378-.646.427-.244 0-.395-.143-.452-.427 0-.089.028-.222.085-.397.057-.175.085-.303.085-.384 0-.065-.024-.11-.073-.134-.008-.008-.021-.012-.037-.012-.098 0-.236.24-.415.72-.13.342-.179.635-.146.879.073.578.391.838.952.781.293-.024.59-.228.891-.61.122.114.293.171.513.171.627 0 .94-.375.94-1.123a2.7 2.7 0 0 0-.038-.415zm-10.4-8.911c-.854 0-1.583.635-2.185 1.904-.114-.016-.279-.08-.494-.189-.216-.11-.38-.165-.495-.165-.301 0-.626.228-.977.684-.317.415-.476.741-.476.977 0 .089.032.134.098.134.041 0 .175-.134.402-.403.228-.269.427-.403.598-.403.123 0 .33.065.623.195s.559.196.794.196c.684 0 1.282-.22 1.794-.659.545-.472.818-1.042.818-1.709.001-.374-.166-.562-.5-.562zm13.793 16.82-1.953-5.053c-.057-.139-.114-.208-.171-.208-.017.008-.041.114-.073.317-.098.602-.146.976-.146 1.123 0 .391.336 1.402 1.007 3.033.672 1.632 1.008 2.565 1.008 2.802 0 .163-.139.244-.415.244a2 2 0 0 1-.317.024 1.862 1.862 0 0 1-1.526-.732c-.285-.358-.603-1.258-.952-2.697a485.636 485.636 0 0 1-.671-2.918c-.122-.521-.229-.781-.317-.781-.285.537-.428 1.046-.428 1.526 0 .114.062.407.184.879.423 1.644.635 2.707.635 3.186 0 .603-.24 1.074-.721 1.415-.423.302-.948.452-1.574.452-.977 0-1.53-.472-1.66-1.416-.049-.35-.073-1.126-.073-2.331 0-.659-.024-.989-.073-.989-.139 0-.269.273-.391.818a2.77 2.77 0 0 0-.073.599c0 .049-.354.24-1.062.573-.854.407-1.513.851-1.977 1.33-.277.285-.533.725-.769 1.318-.155.374-.057.655.293.843.26.139.598.207 1.013.207.903 0 1.501-.199 1.794-.598.024-.025.122-.191.293-.501.114-.212.232-.35.354-.415.033.773.183 1.339.452 1.697.439.586 1.042.879 1.807.879.806 0 1.465-.33 1.978-.989.276-.35.483-.769.622-1.257.098-.326.171-.518.22-.574.024.017.077.188.159.513.105.415.244.761.415 1.038.146.236.402.445.769.629.366.183.696.273.989.273.626 0 1.078-.346 1.354-1.037.138-.342.208-.875.208-1.599-.004-.715-.074-1.256-.212-1.623zm-10.247-7.665c-.542-.496-1.121-.745-1.739-.745-.261 0-.391.167-.391.5 0 .301.093.513.281.635-.09.236-.134.553-.134.952 0 .472.269.752.806.842-.285.407-.753.842-1.404 1.306a86.19 86.19 0 0 1-1.367.928c-.497.334-.724.545-.684.635.016.041.061.061.134.061.22 0 .626-.163 1.221-.488.562-.309 1.005-.59 1.331-.842.513-.398.984-.919 1.416-1.562.106 0 .271.047.495.14.224.094.376.14.458.14.261 0 .391-.28.391-.842-.002-.61-.273-1.163-.814-1.66zm15.679 16.075c-.203 0-.899.285-2.087.854-1.156.554-1.859.928-2.112 1.123-.398.399-.646.659-.744.781-.261.325-.366.524-.317.599.008.008.024.012.049.012a69.57 69.57 0 0 0 1.465-.793 95.53 95.53 0 0 1 2.941-1.404c.105-.081.269-.271.488-.567.22-.298.33-.494.33-.592 0-.009-.005-.013-.013-.013zM75.781 12.952c-.415-2.278-.639-3.548-.671-3.808-.073-.57-.154-.854-.244-.854-.041 0-.14.476-.299 1.428-.159.952-.222 1.514-.189 1.685.643 3.678 1.099 6.27 1.367 7.775.179 1.05.346 2.579.5 4.589.016.213.073.318.171.318.122 0 .183-.069.183-.208.154-.813.204-1.993.146-3.54-.057-1.701-.378-4.163-.964-7.385zm-5.859-7.556c-.049-.016-1.086.439-3.112 1.367-2.059.944-3.21 1.509-3.455 1.697-.146.114-.342.333-.586.659-.269.35-.403.59-.403.72 0 .024.008.037.024.037-.114 0 .712-.411 2.478-1.233 1.505-.7 2.775-1.278 3.808-1.733.163-.098.413-.336.751-.714.337-.378.506-.636.506-.775.001-.008-.003-.017-.011-.025zm-1.38 5.761c-.106-.569-.236-.842-.39-.818-.082.017-.123.085-.123.208 0 .082.012.202.037.36.024.159.037.279.037.36 0 .407-.171.61-.513.61a.33.33 0 0 1-.317-.195c-.024-.049-.062-.248-.11-.598-.041-.276-.102-.407-.183-.391-.09.017-.151.171-.183.464a8.914 8.914 0 0 1-.098.708c-.082.261-.305.411-.671.452-.261.065-.423-.077-.488-.427a1.056 1.056 0 0 1 .037-.403 2.17 2.17 0 0 0 .073-.415c0-.089-.024-.146-.073-.171-.017 0-.029-.004-.037-.012-.09 0-.232.265-.427.793-.09.391-.114.708-.073.952a.936.936 0 0 0 .366.623.842.842 0 0 0 .696.159c.447-.082.752-.305.916-.671a.788.788 0 0 0 .634.293c.635 0 .952-.427.952-1.282 0-.179-.021-.379-.062-.599zm11.536 16.4c-1.18.573-1.88.958-2.1 1.153-.448.398-.708.647-.781.744-.26.334-.354.537-.281.61a.052.052 0 0 0 .037.013c.049 0 .224-.09.525-.269.423-.252.732-.428.928-.525a216.721 216.721 0 0 1 2.966-1.416c.26-.195.5-.427.72-.695.269-.317.297-.477.085-.477-.22 0-.92.287-2.099.862zM59.547 7.3c-.586-.089-1.025-.134-1.318-.134-.277 0-.643.276-1.099.83-.399.48-.598.785-.598.916a.194.194 0 0 0 .037.048.08.08 0 0 0 .061.024c.016 0 .1-.062.25-.189.15-.126.291-.189.421-.189.195 0 .545.037 1.05.11.545.081.867.15.964.208-.358.244-.94.496-1.746.757-.659.211-.985.35-.977.415.024.057.167.085.427.085.83 0 1.477-.102 1.941-.305.301-.13.663-.444 1.086-.94.456-.521.684-.924.684-1.208.001-.164-.394-.306-1.183-.428zM72.4 16.271c-.57-3.222-.854-4.858-.854-4.907.26-.781.391-1.204.391-1.27-.008-.032-.082-.098-.22-.195-.383-.269-.598-.7-.647-1.294-.024-.261-.065-.391-.122-.391-.114 0-.252.293-.415.879-.146.529-.22.907-.22 1.135 0 .342.094.639.281.891l1.001 5.419c.651 3.516.977 5.525.977 6.03 0 .553-.464.83-1.392.83-.212 0-.362-.021-.452-.062a6.783 6.783 0 0 1-.769-.769c-.211.61-.403 1.232-.574 1.867.497.334.745.725.745 1.172 0 .285-.309.732-.928 1.343-1.286 1.27-2.754 1.904-4.406 1.904-.26 0-.647-.036-1.16-.11a8.954 8.954 0 0 0-1.147-.109c-.122 0-.183.032-.183.098 0 .146.277.361.83.646a8.06 8.06 0 0 0 1.233.537c.952.326 1.624.488 2.014.488.683 0 1.518-.464 2.502-1.391 1.123-1.059 1.798-2.242 2.026-3.553.781 0 1.375-.357 1.782-1.074.342-.586.513-1.298.513-2.136 0-.948-.269-2.942-.806-5.978zm-19.261-8.47c-.155.35-.285.724-.391 1.123.545.594.932 1.229 1.159 1.904.13.399.22.875.269 1.428.032.375.073.562.122.562.188 0 .281-.435.281-1.306 0-1.384-.48-2.621-1.44-3.711zM50.38 4.334c-.822 0-1.542.635-2.16 1.904-.146-.008-.324-.069-.531-.183-.208-.114-.36-.171-.458-.171-.317 0-.647.224-.989.671-.31.399-.464.729-.464.989 0 .089.037.134.11.134.041 0 .171-.134.391-.403s.407-.403.562-.403c.138 0 .352.065.641.195.289.13.56.195.812.195.692 0 1.3-.226 1.825-.678.525-.451.787-1.015.787-1.69-.001-.373-.177-.56-.526-.56zm2.325 10.791c-.525-.293-.84-.439-.946-.439-.082 0-.208.24-.378.72-.171.48-.256.793-.256.939 0 .122.23.33.69.623.459.292.758.439.897.439.081 0 .232-.264.452-.793s.33-.854.33-.976c-.001-.05-.264-.221-.789-.513zm-4.095-2.1c-.383-1.847-.631-3.121-.745-3.821-.089-.537-.183-.805-.281-.805-.041 0-.13.478-.268 1.434-.139.956-.191 1.516-.159 1.678a860.271 860.271 0 0 0 1.379 7.031c.211 1.14.403 2.669.574 4.59.049.212.118.317.208.317.065 0 .122-.082.171-.244.13-.847.155-2.014.073-3.504-.098-1.83-.415-4.056-.952-6.676zm-8.129-1.55c-.106-.569-.236-.842-.391-.818-.082.017-.122.085-.122.208 0 .082.014.202.042.36s.043.279.043.36c0 .407-.175.61-.525.61-.139 0-.244-.065-.317-.195a12.877 12.877 0 0 1-.085-.476l-.012-.122c-.041-.269-.102-.398-.183-.391-.098.017-.163.171-.195.464-.041.432-.069.667-.085.708-.082.261-.305.411-.671.452-.261.065-.427-.073-.5-.415-.017-.081-.002-.226.043-.433.044-.208.067-.344.067-.409 0-.089-.024-.15-.073-.183-.09-.049-.244.22-.464.806-.09.35-.11.667-.061.952.081.529.362.793.842.793.529 0 .907-.228 1.135-.684a.753.753 0 0 0 .623.293c.635 0 .952-.427.952-1.282a3.583 3.583 0 0 0-.063-.598zm15.422 17.552c-1.176.562-1.874.939-2.093 1.135a7.49 7.49 0 0 0-.745.781c-.277.334-.383.533-.317.598.008 0 .513-.26 1.514-.781a94.169 94.169 0 0 1 2.941-1.402c.285-.229.525-.461.72-.696.26-.317.289-.476.085-.476-.227 0-.929.28-2.105.841zM44.667 13.708c-.659-3.613-1.079-5.383-1.257-5.31-.22.089-.395.691-.525 1.806a17.57 17.57 0 0 0-.146 2.039c0 1.359.065 2.576.195 3.65.114.96.228 1.44.342 1.44.057 0 .085-.24.085-.72l-.073-2.587c-.024-1.196-.004-2.095.061-2.698l.891 4.651c.513 2.685.769 4.281.769 4.785 0 .252-.261.428-.781.525-.472.089-.802.094-.989.012-.309-.229-.533-.419-.671-.574-.269-.179-.48.033-.635.635-.163.595-.126 1.01.11 1.246.537.422.806.821.806 1.195 0 .619-.496 1.335-1.489 2.148-1.042.854-2.018 1.281-2.929 1.281-.912 0-1.546-.293-1.904-.879-.179-.293-.297-.756-.354-1.391-.049-.537-.106-.807-.171-.807-.171 0-.256.334-.256 1.002 0 .635.118 1.221.354 1.758.594 1.342 1.57 2.014 2.93 2.014 1.123 0 2.177-.68 3.161-2.039.928-1.277 1.371-2.461 1.331-3.552.83-.073 1.412-.407 1.746-1.001.252-.455.378-1.143.378-2.062-.002-.83-.328-3.019-.979-6.567zm-14.452-6.2c-6.274 1.57-10.225 2.75-11.852 3.54-.79.383-1.433.863-1.929 1.44-.399.464-.598.814-.598 1.05 0 .049.021.073.061.073-.016-.008.171-.142.562-.403.545-.366 1.298-.732 2.258-1.099 2.596-.993 5.989-1.994 10.18-3.002 4.28-1.034 8.78-2.071 13.5-3.113.529-.545.985-1.042 1.367-1.489-3.214.545-7.73 1.546-13.549 3.003zm35.325 8.593c-.407-.163-1.249-.578-2.527-1.245-.675-.35-1.293-.525-1.855-.525-1.058 0-1.791.5-2.197 1.501-.049.171-.094.342-.134.512a23.147 23.147 0 0 1 1.575-.061c.586 0 1.062.032 1.428.098.439.122 1.038.333 1.794.634-2.628.35-4.357.916-5.188 1.697-.204.188-.497.586-.879 1.196-.366.569-.627.915-.781 1.038-.358.284-.903.427-1.636.427-.333 0-.563-.047-.689-.141-.126-.093-.285-.308-.476-.641s-.352-.558-.482-.671c-.065-.058-.214.199-.446.769s-.262.973-.091 1.208c.496.66.745 1.294.745 1.904 0 1.855-2.673 3.801-8.02 5.835-4.378 1.668-9.313 2.502-14.806 2.502-5.477 0-10.306-1.106-14.489-3.319a18.333 18.333 0 0 1-3.039-2.027 24.436 24.436 0 0 1-1.831-1.696c-.448-.456-.7-.663-.757-.622-.008.008-.012.028-.012.061 0 .342.452 1.188 1.355 2.539 1.001 1.497 1.908 2.539 2.722 3.125 1.53 1.098 3.593 2.01 6.188 2.734 2.995.838 6.189 1.257 9.582 1.257 5.696 0 11.197-1.119 16.503-3.356 4.605-1.938 7.087-4.48 7.445-7.629.122.008.236.012.342.012 1.05 0 1.843-.557 2.38-1.672.789.96 1.782 1.44 2.979 1.44.333 0 .63-.302.891-.903.228-.521.341-.973.341-1.355 0-.602-.297-1.154-.891-1.66.391-.17 1.074-.354 2.05-.549 1.09-.22 2.01-.33 2.759-.33 1.204 0 2.547.249 4.028.745.822-.968 1.212-1.453 1.172-1.453-2.254-.472-3.938-.932-5.053-1.379zm-49.618-9.02c-.578-.089-1.013-.134-1.306-.134-.285 0-.655.276-1.11.83-.383.472-.574.777-.574.916 0 .057.024.085.073.085.016 0 .1-.063.25-.189s.287-.189.409-.189c.212 0 .566.032 1.062.098.537.081.867.155.989.22-.358.244-.944.496-1.757.756-.667.212-.989.346-.964.403.006.064.153.096.438.096.822 0 1.465-.089 1.929-.268.301-.155.659-.48 1.074-.977.439-.529.659-.936.659-1.221 0-.162-.391-.304-1.172-.426zm6.042 8.495a11.1 11.1 0 0 0-.11.549c-.073.334-.248.501-.525.501-.512 0-.769-.399-.769-1.196 0-.073.004-.183.012-.33.008-.146.012-.256.012-.33 0-.163-.024-.248-.073-.256-.106-.016-.204.228-.293.732a5.963 5.963 0 0 0-.122 1.025c0 .383.089.737.269 1.062.211.383.496.574.854.574.325 0 .582-.175.769-.525.146-.285.22-.606.22-.964 0-.626-.081-.907-.244-.842zm7.25 7.738c-.016-.016-.083.137-.201.458-.118.321-.177.519-.177.592 0 .024.008.049.024.073.838.92 1.314 2.03 1.428 3.332.032.375.073.562.122.562.163 0 .244-.428.244-1.282.001-1.399-.479-2.644-1.44-3.735zm8.899-6.078c-.797-.203-1.77-.525-2.917-.964-.854-.325-1.367-.488-1.538-.488-.7 0-1.257.313-1.672.939-.301.456-.452.854-.452 1.196 0 .024.004.041.012.049.358-.032.716-.049 1.074-.049 1.44 0 2.791.252 4.052.757-1.603.855-2.832 1.282-3.686 1.282-.48 0-.863-.118-1.147-.354-.195-.162-.293-.305-.293-.427 0 .058.02-.053.061-.33.024-.154-.008-.244-.098-.269-.057-.016-.188.09-.391.317-.277.317-.643.574-1.099.769-.968.415-2.437.785-4.406 1.11-2.238.367-4.492.55-6.762.55-4.134 0-6.958-.834-8.471-2.502-.439-.48-.749-.716-.928-.708-.448.017-.887.411-1.318 1.184-.39.7-.585 1.294-.585 1.782 0 .325.187.655.561.989-2.14 1.545-3.857 2.75-5.151 3.612-.342.228-.497.378-.464.452.008.023.041.036.098.036.358 0 1.166-.254 2.423-.763 1.257-.509 2.021-.889 2.289-1.142.48-.439.891-1.078 1.233-1.916.277.171.753.354 1.428.549s1.164.285 1.465.269c.203-.064.358-.338.464-.817 1.131.569 3.121.854 5.969.854 2.954 0 5.7-.261 8.239-.781 2.832-.578 4.447-1.33 4.846-2.258.496.968 1.038 1.452 1.624 1.452.415 0 1.615-.407 3.601-1.221s3.41-1.221 4.272-1.221c.667 0 1.293.081 1.879.244.065.017.256-.265.574-.842.26-.48.391-.757.391-.83 0-.016-.004-.024-.012-.024-2.183.002-3.904-.16-5.165-.486zm-15.118 7.116c-.565-.268-.885-.391-.958-.365-.26.455-.472.891-.635 1.306l-1.05-.464c-.431-.188-.683-.269-.756-.244-.082.024-.214.301-.397.83s-.262.842-.238.939c.016.065.293.223.83.471.537.248.863.372.977.372.098 0 .31-.436.635-1.306.977.545 1.554.793 1.733.744.073-.024.224-.303.452-.836s.325-.844.293-.934c-.025-.074-.32-.244-.886-.513zm-14.72 4.822c-1.176.562-1.882.943-2.118 1.147-.896.765-1.245 1.208-1.05 1.33.008.009.024.013.049.013.122-.09.614-.354 1.477-.794a180.24 180.24 0 0 1 2.93-1.416c.244-.146.488-.362.732-.646.269-.317.297-.476.085-.476-.228 0-.929.28-2.105.842zM95.494 6.238c-.375.122-.7.171-.977.146.431-.781.842-1.172 1.232-1.172.285 0 .428.143.428.427.001.245-.228.445-.683.599zm.61 17.284c0-.106.081-.251.244-.434.162-.183.293-.274.391-.274.081-.008.231.188.451.586.276.504.517.85.721 1.037-1.205-.251-1.807-.556-1.807-.915zM77.331 6.128c-.375.122-.7.171-.977.146.415-.797.826-1.196 1.233-1.196.285 0 .427.151.427.452.001.244-.227.444-.683.598zm4.663 8.935c-.13 0-.35-.053-.66-.159.041-.171.062-.322.062-.452a.74.74 0 0 0-.062-.33c.114.016.285.146.513.391.187.204.28.35.28.439a.114.114 0 0 1-.012.049c-.008.042-.048.062-.121.062zm-1.196-.231c-.448 0-.671-.085-.671-.256 0-.374.13-.562.391-.562.236 0 .354.143.354.427a1.287 1.287 0 0 1-.074.391zm2.306 7.628a3.531 3.531 0 0 1-1.916.366c-.375-.032-.562-.085-.562-.158 0-.154.838-.659 2.514-1.514-.023.211-.036.647-.036 1.306zM49.623 6.153c-.382.13-.708.183-.977.159.432-.781.842-1.172 1.233-1.172.285 0 .427.143.427.427.001.236-.227.432-.683.586zm10.705 15.05c-.358 0-.777-.135-1.257-.402a2.052 2.052 0 0 1-.5-.391c-.195-.204-.252-.367-.171-.488.057-.074.208-.102.452-.086.269.024.496.086.684.184.643.342.964.699.964 1.074-.001.072-.058.109-.172.109zM8.745 19.922c0-.105.082-.252.244-.439s.297-.289.403-.306c.073 0 .22.204.439.61.269.505.509.854.72 1.05-1.204-.252-1.806-.558-1.806-.915z\"\n })))));\n};\nexport default SvgBismillah;","import { useContext } from 'react';\n\nimport { useSelector } from '@xstate/react';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport Spinner from '../dls/Spinner/Spinner';\n\nimport styles from './PlayButton.module.scss';\n\nimport Button, { ButtonSize, ButtonType, ButtonVariant } from '@/dls/Button/Button';\nimport useGetQueryParamOrXstateValue from '@/hooks/useGetQueryParamOrXstateValue';\nimport PauseIcon from '@/icons/pause.svg';\nimport PlayIcon from '@/icons/play-arrow.svg';\nimport QueryParam from '@/types/QueryParam';\nimport { getChapterData } from '@/utils/chapter';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport DataContext from 'src/contexts/DataContext';\nimport {\n selectIsLoadingCurrentChapter,\n selectIsPlayingCurrentChapter,\n} from 'src/xstate/actors/audioPlayer/selectors';\nimport { AudioPlayerMachineContext } from 'src/xstate/AudioPlayerMachineContext';\n\ninterface Props {\n chapterId: number;\n}\nconst PlayChapterAudioButton: React.FC<Props> = ({ chapterId }) => {\n const { t } = useTranslation('common');\n const chaptersData = useContext(DataContext);\n const chapterData = getChapterData(chaptersData, chapterId.toString());\n\n const audioService = useContext(AudioPlayerMachineContext);\n const isLoadingCurrentChapter = useSelector(audioService, (state) =>\n selectIsLoadingCurrentChapter(state, chapterId),\n );\n const isPlayingCurrentChapter = useSelector(audioService, (state) =>\n selectIsPlayingCurrentChapter(state, chapterId),\n );\n\n const {\n value: reciterId,\n isQueryParamDifferent: reciterQueryParamDifferent,\n }: { value: number; isQueryParamDifferent: boolean } = useGetQueryParamOrXstateValue(\n QueryParam.Reciter,\n );\n\n const play = () => {\n logButtonClick('chapter_header_play_audio');\n audioService.send({\n type: 'PLAY_SURAH',\n surah: chapterId,\n reciterId: reciterQueryParamDifferent ? reciterId : undefined,\n });\n };\n\n const pause = () => {\n logButtonClick('chapter_header_pause_audio');\n audioService.send({\n type: 'TOGGLE',\n });\n };\n\n if (isLoadingCurrentChapter) {\n return (\n <div className={styles.container}>\n <Button\n variant={ButtonVariant.Ghost}\n type={ButtonType.Success}\n size={ButtonSize.Small}\n prefix={<Spinner />}\n hasSidePadding={false}\n shouldFlipOnRTL={false}\n isDisabled\n >\n {t('loading')}\n </Button>\n </div>\n );\n }\n\n return (\n <div className={styles.container}>\n {isPlayingCurrentChapter ? (\n <Button\n variant={ButtonVariant.Ghost}\n type={ButtonType.Success}\n size={ButtonSize.Small}\n prefix={<PauseIcon />}\n onClick={pause}\n hasSidePadding={false}\n shouldFlipOnRTL={false}\n >\n {t('audio.player.pause-audio')}\n </Button>\n ) : (\n <Button\n variant={ButtonVariant.Ghost}\n type={ButtonType.Success}\n size={ButtonSize.Small}\n prefix={<PlayIcon />}\n onClick={play}\n hasSidePadding={false}\n shouldFlipOnRTL={false}\n ariaLabel={t('aria.play-surah', { surahName: chapterData.transliteratedName })}\n >\n {t('audio.play')}\n </Button>\n )}\n </div>\n );\n};\n\nexport default PlayChapterAudioButton;\n","import React from 'react';\n\nimport BismillahSVG from '@/public/bismillah.svg';\n\nconst Bismillah = () => <BismillahSVG />;\n\nexport default Bismillah;\n","/* eslint-disable i18next/no-literal-string */\nimport React, { useRef } from 'react';\n\nimport useTranslation from 'next-translate/useTranslation';\nimport { useDispatch } from 'react-redux';\n\nimport styles from './ChapterHeader.module.scss';\n\nimport ChapterIconContainer, {\n ChapterIconsSize,\n} from '@/components/chapters/ChapterIcon/ChapterIconContainer';\nimport { QURAN_READER_OBSERVER_ID } from '@/components/QuranReader/observer';\nimport PlayChapterAudioButton from '@/components/QuranReader/PlayChapterAudioButton';\nimport Bismillah from '@/dls/Bismillah/Bismillah';\nimport Button, { ButtonSize, ButtonVariant } from '@/dls/Button/Button';\nimport useIntersectionObserver from '@/hooks/useObserveElement';\nimport InfoIcon from '@/icons/info.svg';\nimport { setIsSettingsDrawerOpen, setSettingsView, SettingsView } from '@/redux/slices/navbar';\nimport { logButtonClick } from '@/utils/eventLogger';\nimport { getSurahInfoNavigationUrl } from '@/utils/navigation';\n\ninterface Props {\n chapterId: string;\n pageNumber: number;\n hizbNumber: number;\n translationName?: string;\n isTranslationSelected?: boolean;\n}\n\nconst CHAPTERS_WITHOUT_BISMILLAH = ['1', '9'];\n\nconst ChapterHeader: React.FC<Props> = ({\n chapterId,\n pageNumber,\n hizbNumber,\n translationName,\n isTranslationSelected,\n}) => {\n const dispatch = useDispatch();\n const { t } = useTranslation('common');\n const headerRef = useRef(null);\n /**\n * the intersection observer is needed so that we know that the first verse\n * of the current chapter is being read when the ChapterHeader appears within\n * the intersection observer root's borders.\n */\n useIntersectionObserver(headerRef, QURAN_READER_OBSERVER_ID);\n\n const onChangeTranslationClicked = () => {\n dispatch(setIsSettingsDrawerOpen(true));\n dispatch(setSettingsView(SettingsView.Translation));\n logButtonClick('change_translation');\n };\n\n return (\n <div\n ref={headerRef}\n data-verse-key={`${chapterId}:1`}\n data-page={pageNumber}\n data-chapter-id={chapterId}\n data-hizb={hizbNumber}\n >\n <div className={styles.header}>\n <div className={styles.chapterIconContainer}>\n <ChapterIconContainer chapterId={chapterId} size={ChapterIconsSize.Mega} />\n </div>\n </div>\n <div className={styles.bismillahContainer}>\n {!CHAPTERS_WITHOUT_BISMILLAH.includes(chapterId) && <Bismillah />}\n </div>\n <div className={styles.container}>\n <div className={styles.left}>\n <div className={styles.infoContainer}>\n {translationName ? (\n <div className={styles.translation}>\n {isTranslationSelected && (\n <div className={styles.translationBy}>{t('quran-reader:translation-by')}</div>\n )}\n <span>{translationName}</span>{' '}\n <span\n onKeyPress={onChangeTranslationClicked}\n tabIndex={0}\n role=\"button\"\n onClick={onChangeTranslationClicked}\n className={styles.changeTranslation}\n >\n ({t('quran-reader:trans-change')})\n </span>\n <span className={styles.changeTranslation} />\n </div>\n ) : (\n <Button\n size={ButtonSize.Small}\n variant={ButtonVariant.Ghost}\n prefix={<InfoIcon />}\n href={getSurahInfoNavigationUrl(chapterId)}\n shouldPrefetch={false}\n hasSidePadding={false}\n onClick={() => {\n logButtonClick('chapter_header_info');\n }}\n id=\"surah-info-button\"\n >\n {t('quran-reader:surah-info')}\n </Button>\n )}\n </div>\n </div>\n <div className={styles.right}>\n {translationName && (\n <Button\n size={ButtonSize.Small}\n variant={ButtonVariant.Ghost}\n prefix={<InfoIcon />}\n href={getSurahInfoNavigationUrl(chapterId)}\n shouldPrefetch={false}\n hasSidePadding={false}\n onClick={() => {\n logButtonClick('chapter_header_info');\n }}\n id=\"surah-info-button\"\n >\n {t('quran-reader:surah-info')}\n </Button>\n )}\n <div className={styles.actionContainer}>\n <PlayChapterAudioButton chapterId={Number(chapterId)} />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ChapterHeader;\n","import React from 'react';\n\nimport classNames from 'classnames';\n\nimport styles from './ChapterIconContainer.module.scss';\n\nimport ChapterIcon from '@/components/chapters/ChapterIcon';\n\nexport enum ChapterIconsSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n Mega = 'mega',\n}\n\n// TODO: maybe replace `hasSurahPrefix` with `variant` and use it to show v1 or v2 surah name font\ninterface Props {\n chapterId: string;\n size?: ChapterIconsSize;\n hasSurahPrefix?: boolean;\n}\n\nconst IconContainer: React.FC<Props> = ({\n chapterId,\n size = ChapterIconsSize.Medium,\n hasSurahPrefix = true,\n}) => (\n <span\n className={classNames(styles.iconContainer, {\n [styles.iconContainerSmall]: size === ChapterIconsSize.Small,\n [styles.iconContainerLarge]: size === ChapterIconsSize.Large,\n [styles.iconContainerMega]: size === ChapterIconsSize.Mega,\n })}\n >\n <ChapterIcon id={chapterId} />\n {hasSurahPrefix && <ChapterIcon id=\"surah\" />}\n </span>\n);\n\nexport default IconContainer;\n","import React from 'react';\n\ninterface Props {\n id?: string;\n}\n\nconst ChapterIcon: React.FC<Props> = ({ id }) => <span translate=\"no\">{id.padStart(3, '0')}</span>;\n\nexport default ChapterIcon;\n","import classNames from 'classnames';\n\nimport styles from './Badge.module.scss';\n\ntype BadeProps = {\n content: React.ReactNode;\n children: React.ReactNode;\n contentClassName?: string;\n className?: string;\n};\n\nconst Badge = ({ content, children, contentClassName, className }: BadeProps) => {\n return (\n <div className={classNames(styles.container, className)}>\n {children}\n <div className={classNames(contentClassName, styles.content, styles.positionBottomRight)}>\n {content}\n </div>\n </div>\n );\n};\n\nexport default Badge;\n","/* eslint-disable i18next/no-literal-string */\nimport React from 'react';\n\nimport classNames from 'classnames';\n\nimport styles from './KeyboardInput.module.scss';\n\ninterface Props {\n keyboardKey?: string;\n invertColors?: boolean;\n meta?: boolean;\n shift?: boolean;\n alt?: boolean;\n ctrl?: boolean;\n}\n\nconst KeyboardInput: React.FC<Props> = ({\n keyboardKey,\n meta,\n shift,\n alt,\n ctrl,\n invertColors = false,\n}) => {\n const isMacOs = typeof window !== 'undefined' && window.navigator.userAgent.search('Mac') !== -1;\n return (\n <kbd className={classNames(styles.container, { [styles.invertedColors]: invertColors })}>\n {meta && <span>{isMacOs ? '⌘' : 'ctrl'}</span>}\n {shift && <span>⇧</span>}\n {alt && <span>⌥</span>}\n {ctrl && <span>⌃</span>}\n {keyboardKey && <span>{keyboardKey}</span>}\n </kbd>\n );\n};\n\nexport default KeyboardInput;\n","import useSWRImmutable from 'swr/immutable';\n\nimport { countNotesWithinRange } from '@/utils/auth/api';\nimport { isLoggedIn } from '@/utils/auth/login';\n\ntype Range = {\n from: string;\n to: string;\n};\n\nconst useCountRangeNotes = (notesRange: Range) => {\n const { data, isValidating, error } = useSWRImmutable(\n notesRange && isLoggedIn() ? `countNotes/${notesRange.from}-${notesRange.to}` : null,\n async () => {\n return countNotesWithinRange(notesRange.from, notesRange.to);\n },\n );\n\n return {\n data,\n isLoading: isValidating && !data,\n error,\n };\n};\n\nexport default useCountRangeNotes;\n","import { useContext, useMemo } from 'react';\n\nimport { useSelector as useXstateSelector } from '@xstate/react';\nimport useTranslation from 'next-translate/useTranslation';\nimport { useSelector } from 'react-redux';\n\nimport {\n getQuranReaderStylesInitialState,\n getTranslationsInitialState,\n} from '@/redux/defaultSettings/util';\nimport { selectIsUsingDefaultWordByWordLocale } from '@/redux/slices/QuranReader/readingPreferences';\nimport { selectQuranFont, selectQuranMushafLines } from '@/redux/slices/QuranReader/styles';\nimport { selectIsUsingDefaultTranslations } from '@/redux/slices/QuranReader/translations';\nimport { areArraysEqual, mergeTwoArraysUniquely } from '@/utils/array';\nimport { selectIsUsingDefaultReciter } from '@/xstate/actors/audioPlayer/selectors';\nimport { AudioPlayerMachineContext } from '@/xstate/AudioPlayerMachineContext';\n\nconst useIsUsingDefaultSettings = ({\n translationParams,\n selectedTranslations,\n}: {\n translationParams?: number[];\n selectedTranslations?: number[];\n} = {}) => {\n const { lang } = useTranslation();\n const audioService = useContext(AudioPlayerMachineContext);\n const isUsingDefaultReciter = useXstateSelector(audioService, (state) =>\n selectIsUsingDefaultReciter(state),\n );\n const isUsingDefaultWordByWordLocale = useSelector(selectIsUsingDefaultWordByWordLocale);\n const isUsingDefaultTranslations = useSelector(selectIsUsingDefaultTranslations);\n\n const quranFont = useSelector(selectQuranFont);\n const mushafLines = useSelector(selectQuranMushafLines);\n\n const defaultState = useMemo(() => {\n return {\n quranReaderStyles: getQuranReaderStylesInitialState(lang),\n translations: getTranslationsInitialState(lang),\n };\n }, [lang]);\n\n const isUsingDefaultFont =\n defaultState.quranReaderStyles.quranFont === quranFont &&\n defaultState.quranReaderStyles.mushafLines === mushafLines;\n\n const areTranslationsEqual = useMemo(() => {\n if (!translationParams && !selectedTranslations) {\n return false;\n }\n\n const translations = mergeTwoArraysUniquely(\n translationParams ?? [],\n selectedTranslations ?? [],\n );\n\n return areArraysEqual(defaultState.translations.selectedTranslations, translations);\n }, [translationParams, selectedTranslations, defaultState.translations.selectedTranslations]);\n\n const isUsingDefaultSettings =\n isUsingDefaultFont && isUsingDefaultReciter && isUsingDefaultWordByWordLocale;\n\n if (translationParams || selectedTranslations) {\n return isUsingDefaultSettings && isUsingDefaultTranslations && areTranslationsEqual;\n }\n\n return isUsingDefaultSettings;\n};\n\nexport default useIsUsingDefaultSettings;\n","import { RefObject, useEffect } from 'react';\n\n/**\n * This is a hook that is mean to be used in combination with {@see useGlobalIntersectionObserver}\n * that will use the global observer that had been created by the above hook to observe an element.\n *\n * @param {RefObject<Element>} elementRef the ref of the object that will be observed.\n * @param {string} observerId the name of the global observer that the element wants to use.\n */\nconst useObserveElement = (elementRef: RefObject<Element>, observerId: string) => {\n useEffect(() => {\n const node = elementRef?.current; // DOM Ref\n const hasIOSupport = !!window.IntersectionObserver;\n if (!hasIOSupport || !node) return undefined;\n\n // in-case useGlobalIntersectionObserver hasn't been used.\n if (window[observerId]) {\n window[observerId].observe(node);\n }\n return () => {\n if (window[observerId]) {\n window[observerId].unobserve(node);\n }\n };\n }, [elementRef, observerId]);\n};\n\nexport default useObserveElement;\n","import { useRef, RefObject } from 'react';\n\n/**\n * A hook that scrolls to a specific element in the DOM.\n * The scrolling will only happen when executeScroll function\n * is invoked.\n *\n * @param {ScrollIntoViewOptions} options\n * @returns {[() => void, RefObject<T>]}\n */\nexport const useScrollToElement = <T extends HTMLElement>(\n options?: ScrollIntoViewOptions,\n): [() => void, RefObject<T>] => {\n const elementRef = useRef<T>(null);\n // a function that will be invoked by the component using this hook to scroll to the element being referenced (if found).\n const executeScroll = (): void => {\n // only scroll when the ref has a value\n if (elementRef.current) {\n elementRef.current.scrollIntoView(options);\n }\n };\n\n return [executeScroll, elementRef];\n};\n\nexport const SMOOTH_SCROLL_TO_CENTER = {\n block: 'center', // 'block' relates to vertical alignment. see: https://stackoverflow.com/a/48635751/1931451 for nearest.\n behavior: 'smooth',\n} as ScrollIntoViewOptions;\n\nexport const SMOOTH_SCROLL_TO_TOP = {\n block: 'start',\n behavior: 'smooth',\n} as ScrollIntoViewOptions;\n\nexport const SCROLL_TO_NEAREST_ELEMENT = {\n block: 'nearest',\n} as ScrollIntoViewOptions;\n\nexport default useScrollToElement;\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport classNames from 'classnames';\nimport { useRouter } from 'next/router';\nimport useTranslation from 'next-translate/useTranslation';\n\nimport styles from './_error.module.scss';\n\nimport Button from '@/dls/Button/Button';\nimport Link, { LinkVariant } from '@/dls/Link/Link';\n\n// reference: https://nextjs.org/docs/advanced-features/custom-error-page#more-advanced-error-page-customizing\ntype ErrorProps = {\n statusCode?: number;\n hasFullWidth?: boolean;\n};\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst Error = ({ statusCode, hasFullWidth = true }: ErrorProps) => {\n const { t } = useTranslation('error');\n const router = useRouter();\n\n // if previous page url exist, go back, otherwise go to home\n const onBackButtonClicked = () => {\n if (document && document.referrer) {\n router.back();\n return;\n }\n router.push('/'); // go to home\n };\n return (\n <div\n className={classNames(styles.container, {\n [styles.withFullWidth]: hasFullWidth,\n })}\n >\n <h1 className={styles.title}>{t('title')}</h1>\n <div className={styles.goBack}>\n <Button onClick={onBackButtonClicked}>{t('go-back')}</Button>\n </div>\n <p className={styles.reportBug}>\n {t('if-persist')}{' '}\n <Link href=\"https://feedback.quran.com/\" variant={LinkVariant.Highlight}>\n {t('report-cta')}\n </Link>\n </p>\n </div>\n );\n};\n\nexport default Error;\n","import { getCurrentMonth, makeDateRangeFromMonth } from './datetime';\n\nimport { ActivityDayType, FilterActivityDaysParams } from '@/types/auth/ActivityDay';\n\nexport const getFilterActivityDaysParamsOfCurrentMonth = (): FilterActivityDaysParams => {\n const currentMonth = getCurrentMonth();\n const currentYear = new Date().getFullYear();\n\n return getFilterActivityDaysParams(currentMonth, currentYear);\n};\n\nexport const getFilterActivityDaysParams = (\n month: number,\n year: number,\n): FilterActivityDaysParams => {\n const { from, to } = makeDateRangeFromMonth(month, year);\n\n const params: FilterActivityDaysParams = {\n from,\n to,\n limit: 31,\n type: ActivityDayType.QURAN,\n };\n\n return params;\n};\n","import { toLocalizedNumber } from './locale';\n\n/**\n * Get the juz number by the hiz number. One hizb is half a Juz.\n *\n * @param {number} hizb\n * @returns {number}\n */\nexport const getJuzNumberByHizb = (hizb: number): number => Math.ceil(hizb / 2);\n\n/**\n * Whether the current juz is the first surah.\n *\n * @param {number} juzNumber\n * @returns {boolean}\n */\nexport const isFirstJuz = (juzNumber: number): boolean => juzNumber === 1;\n\n/**\n * Whether the current juz is the last surah.\n *\n * @param {number} juzNumber\n * @returns {boolean}\n */\nexport const isLastJuz = (juzNumber: number): boolean => juzNumber === 30;\n\nconst TOTAL_QURAN_JUZ = 30;\nexport const getJuzIds = (lang: string) => {\n return [...Array(TOTAL_QURAN_JUZ)].map((n, index) => {\n const juz = index + 1;\n return {\n value: juz,\n label: toLocalizedNumber(juz, lang),\n };\n });\n};\n","import { toLocalizedNumber } from './locale';\n\nimport { Mushaf, MushafLines, QuranFont, QuranFontMushaf } from 'types/QuranReader';\n\nconst DEFAULT_NUMBER_OF_PAGES = 604;\n\n// a map between the mushafId and the number of pages it has\nexport const PAGES_MUSHAF_MAP = {\n [Mushaf.Indopak]: 604,\n [Mushaf.KFGQPCHAFS]: 604,\n [Mushaf.QCFV1]: 604,\n [Mushaf.QCFV2]: 604,\n [Mushaf.UthmaniHafs]: 604,\n [Mushaf.Indopak16Lines]: 548,\n [Mushaf.Indopak15Lines]: 610,\n [Mushaf.Tajweeed]: 604,\n};\n\n/**\n * Whether the current page is the first page.\n *\n * @param {number} surahNumber\n * @returns {boolean}\n */\nexport const isFirstPage = (surahNumber: number): boolean => surahNumber === 1;\n\n/**\n * Whether the current page is the last page.\n *\n * @param {number} pageNumber\n * @param {QuranFont} quranFont\n * @param {MushafLines} mushafLines\n * @returns {boolean}\n */\nexport const isLastPage = (\n pageNumber: number,\n quranFont?: QuranFont,\n mushafLines?: MushafLines,\n): boolean => pageNumber === getMushafTotalPageNumber(quranFont, mushafLines);\n\n/**\n * Get the number of pages of the current mushaf based on the selected font\n * and the number of line (in the case of IndoPak).\n *\n * @param {QuranFont} quranFont\n * @param {MushafLines} mushafLines\n * @returns {number}\n */\nconst getMushafTotalPageNumber = (quranFont?: QuranFont, mushafLines?: MushafLines): number => {\n let mushafTotalPages = 0;\n // this is when we are SSR the page because those 2 values won't be there since they come from Redux\n if (!quranFont || !mushafLines) {\n mushafTotalPages = DEFAULT_NUMBER_OF_PAGES;\n } else if (quranFont === QuranFont.IndoPak) {\n mushafTotalPages =\n mushafLines === MushafLines.SixteenLines\n ? PAGES_MUSHAF_MAP[Mushaf.Indopak16Lines]\n : PAGES_MUSHAF_MAP[Mushaf.Indopak15Lines];\n } else {\n mushafTotalPages = PAGES_MUSHAF_MAP[QuranFontMushaf[quranFont]];\n }\n return mushafTotalPages;\n};\n\n/**\n * Return array of page id\n *\n * @returns {{value: number, label: string}[]}\n */\nexport const getPageIdsByMushaf = (\n lang: string,\n quranFont?: QuranFont,\n mushafLines?: MushafLines,\n): { value: number; label: string }[] =>\n [...Array(getMushafTotalPageNumber(quranFont, mushafLines))].map((n, index) => {\n const page = index + 1;\n return { value: page, label: toLocalizedNumber(page, lang) };\n });\n\n/**\n * Get the number of lines in a Mushaf page based on the Mushaf.\n * All Mushafs have 15 lines except for Indopak 16-line one.\n *\n * @param {QuranFont} quranFont\n * @param {MushafLines} mushafLines\n * @returns {number}\n */\nexport const getMushafLinesNumber = (quranFont: QuranFont, mushafLines: MushafLines): number => {\n if (\n quranFont !== QuranFont.IndoPak ||\n (quranFont === QuranFont.IndoPak && mushafLines === MushafLines.FifteenLines)\n ) {\n return 15;\n }\n return 16;\n};\n","/**\n * Shorten a text by setting the maximum number of characters\n * by the value of the parameter and adding \"...\" at the end.\n *\n * @param {string} rawString\n * @param {number} length\n * @param {string} suffix\n * @returns {string}\n */\nexport const truncateString = (rawString: string, length: number, suffix = '...'): string => {\n const characters = rawString.split('', length);\n let shortenedText = '';\n for (let index = 0; index < characters.length; index += 1) {\n const character = characters[index];\n if (shortenedText.length === length - 1) {\n shortenedText = `${shortenedText}${character}${suffix}`;\n break;\n }\n shortenedText = `${shortenedText}${character}`;\n }\n return shortenedText;\n};\n\n/**\n * Strip HTML tags from a string.\n *\n * @param {string} rawString\n * @returns {string}\n */\nexport const stripHTMLTags = (rawString: string): string => rawString.replace(/(<([^>]+)>)/gi, '');\n\n/**\n * Convert a slugified collection id to collection id only after\n * removing the slug.\n *\n * @param {string} slugifiedCollectionId\n * @returns {string}\n */\nexport const slugifiedCollectionIdToCollectionId = (slugifiedCollectionId: string): string => {\n if (!slugifiedCollectionId) {\n return '';\n }\n const splits = slugifiedCollectionId.split('-');\n // if there is no slug in the url (collections with a name that cannot be slugified e.g. emoticons)\n if (splits.length === 1) {\n return splits[0];\n }\n return splits[splits.length - 1];\n};\n","import { getChapterData } from './chapter';\nimport { PAGES_MUSHAF_MAP } from './page';\nimport { parseVerseRange } from './verseKeys';\n\nimport ChaptersData from 'types/ChaptersData';\nimport { Mushaf } from 'types/QuranReader';\n\n/**\n * Validate a chapterId which can be in-valid in 2 cases:\n *\n * 1. if it's a string that is not numeric e.g. \"test\".\n * 2. if it's a numeric string but lies outside the range 1->114.\n *\n * @param {string} chapterId\n * @returns {boolean}\n */\nexport const isValidChapterId = (chapterId: string): boolean => {\n const chapterIdNumber = Number(chapterId);\n // if it's not a numeric string or it's numeric but out of the range of chapter 1->114\n if (Number.isNaN(chapterIdNumber) || chapterIdNumber > 114 || chapterIdNumber < 1) {\n return false;\n }\n return true;\n};\n\n/**\n * Check whether the verse number is valid by trying to convert it\n * into a number.\n *\n * @param {string} verseId\n * @returns {boolean}\n */\nexport const isValidVerseNumber = (verseId: string): boolean => {\n const verseIdNumber = Number(verseId);\n return !Number.isNaN(verseIdNumber);\n};\n\n/**\n * Validate a verseId which can be in-valid in 3 cases:\n *\n * 1. if it's a string that is not numeric e.g. \"test\".\n * 2. if it's a numeric string but below 1.\n * 3. if it's a numeric string but above the maximum number of verses for the chapter. e.g. verseId 8 for chapterId 1 (Alfatiha) is invalid since it only has 7 verses.\n *\n * @param {ChaptersData} chaptersData\n * @param {string} chapterId the chapter id. We will assume it's valid since we already validated it.\n * @param {string} verseId the verse id being validated.\n * @returns {boolean}\n */\nexport const isValidVerseId = (\n chaptersData: ChaptersData,\n chapterId: string,\n verseId: string,\n): boolean => {\n const verseIdNumber = Number(verseId);\n // is not a valid number, below 1 or above the maximum number of verses for the chapter.\n if (Number.isNaN(verseIdNumber) || verseIdNumber < 1) {\n return false;\n }\n if (\n !getChapterData(chaptersData, chapterId) ||\n verseIdNumber > getChapterData(chaptersData, chapterId).versesCount\n ) {\n return false;\n }\n return true;\n};\n\n/**\n * Validate a juzId which can be in-valid in 2 cases:\n *\n * 1. if it's a string that is not numeric e.g. \"test\".\n * 2. if it's a numeric string but lies outside the range 1->30.\n *\n * @param {string} juzId\n * @returns {boolean}\n */\nexport const isValidJuzId = (juzId: string): boolean => {\n const juzIdNumber = Number(juzId);\n // if it's not a numeric string or it's numeric but out of the range of chapter 1->30\n if (Number.isNaN(juzIdNumber) || juzIdNumber > 30 || juzIdNumber < 1) {\n return false;\n }\n return true;\n};\n\n/**\n * Validate a rubId which can be in-valid in 2 cases:\n *\n * 1. if it's a string that is not numeric e.g. \"test\".\n * 2. if it's a numeric string but lies outside the range 1->240.\n *\n * @param {string} rubId\n * @returns {boolean}\n */\nexport const isValidRubId = (rubId: string): boolean => {\n const rubIdNumber = Number(rubId);\n // if it's not a numeric string or it's numeric but out of the range of chapter 1->240\n if (Number.isNaN(rubIdNumber) || rubIdNumber > 240 || rubIdNumber < 1) {\n return false;\n }\n return true;\n};\n\n/**\n * Validate a hizbId which can be in-valid in 2 cases:\n *\n * 1. if it's a string that is not numeric e.g. \"test\".\n * 2. if it's a numeric string but lies outside the range 1->60.\n *\n * @param {string} hizbId\n * @returns {boolean}\n */\nexport const isValidHizbId = (hizbId: string): boolean => {\n const hizbIdNumber = Number(hizbId);\n // if it's not a numeric string or it's numeric but out of the range of chapter 1->30\n if (Number.isNaN(hizbIdNumber) || hizbIdNumber > 60 || hizbIdNumber < 1) {\n return false;\n }\n return true;\n};\n\n/**\n * Validate a pageId which can be in-valid in 2 cases:\n *\n * 1. if it's a string that is not numeric e.g. \"test\".\n * 2. if it's a numeric string but lies outside the range of the selected Mushaf.\n *\n * @param {string | number} pageId\n * @returns {boolean}\n */\nexport const isValidPageNumber = (pageId: string | number, mushafId: Mushaf): boolean => {\n const pageIdNumber = Number(pageId);\n const MUSHAF_COUNT = PAGES_MUSHAF_MAP[mushafId];\n // if it's not a numeric string or it's numeric but out of the range of the selected Mushaf\n if (Number.isNaN(pageIdNumber) || pageIdNumber > MUSHAF_COUNT || pageIdNumber < 1) {\n return false;\n }\n return true;\n};\n\n/**\n * Extract the to and from verse by splitting the range by '-'.\n *\n * @param {string} range\n * @returns {string[]}\n */\nexport const getToAndFromFromRange = (range: string): string[] => range.split('-');\n\n/**\n * This is to check if the range passed is valid or not. It won't be valid if:\n *\n * 1. The format is not a range's format and this is known if after splitting the range string\n * by '-', we don't have 2 parts for the range representing the from verse and to verse.\n * e.g. 'one'\n * 2. If after splitting them, either of the 2 parts are not a valid number e.g. 'one-two'\n * or '1-two' or 'one-2'.\n * 3. If the from verse number exceeds the to verse number. e.g. '8-7'.\n * 4. If either the from verse number of to verse number exceeds the total number of verses\n * for the current chapter e.g. for chapter 1: '7-8' or '8-8'.\n *\n * @param {ChaptersData} chaptersData\n * @param {string} chapterId\n * @param {string} range\n * @returns {boolean}\n */\nexport const isValidVerseRange = (\n chaptersData: ChaptersData,\n chapterId: string,\n range: string,\n): boolean => {\n const rangeSplits = getToAndFromFromRange(range);\n // if the splits are not 2, it means it's not in the right format.\n if (rangeSplits.length !== 2) {\n return false;\n }\n const [from, to] = rangeSplits;\n const fromNumber = Number(from);\n const toNumber = Number(to);\n // if the range is in the right format but either value is not a number e.g. 'one-two'\n if (Number.isNaN(fromNumber) || Number.isNaN(toNumber)) {\n return false;\n }\n // 0 is not a valid verse number\n if (fromNumber === 0 || toNumber === 0) {\n return false;\n }\n // if the from verse number is bigger than the to verse number\n if (fromNumber > toNumber) {\n return false;\n }\n // if the chapterId is not a valid chapterId e.g. \"word\"\n if (!getChapterData(chaptersData, chapterId)) {\n return false;\n }\n const chapterVersesCount = getChapterData(chaptersData, chapterId).versesCount;\n // if either the from verse number of to verse number exceeds the chapter's total number.\n if (fromNumber > chapterVersesCount || toNumber > chapterVersesCount) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Check if a string range is valid or not.\n * A valid range looks like this: \"1:1-1:2\" or \"1:1-2:3\".\n *\n * @param {ChaptersData} chaptersData\n * @param {string} rangesString\n * @returns {boolean}\n */\nexport const isRangesStringValid = (chaptersData: ChaptersData, rangesString: string): boolean => {\n const parsedVerseRange = parseVerseRange(rangesString);\n // 1. if the range is not in the right format\n if (!parsedVerseRange) {\n return false;\n }\n const [fromRange, toRange] = parsedVerseRange;\n // if both ranges are in the same chapter\n if (fromRange.chapter === toRange.chapter) {\n const verseRange = `${fromRange.verse}-${toRange.verse}`;\n // 2. if range within same surah is not valid\n if (!isValidVerseRange(chaptersData, fromRange.chapter, verseRange)) {\n return false;\n }\n } else {\n // 2. if start of range verse key is not valid\n if (!isValidVerseKey(chaptersData, fromRange.verseKey)) {\n return false;\n }\n // 3. if end of range verse key is not valid\n if (!isValidVerseKey(chaptersData, toRange.verseKey)) {\n return false;\n }\n // 4. if the fromRange chapter is bigger than the toRange chapter e.g. 2:1-1:1\n if (Number(fromRange.chapter) > Number(toRange.chapter)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Check if a verse key is valid. An invalid verse key can be:\n *\n * 1. it's in a wrong format e.g. \"verseKey\"\n * 2. if the number of parts is bigger than 2 e.g. \"1:2:3\"\n * 3. if it's not a valid chapter id {@see isValidChapterId}\n * 4. if it's not a valid verse ID {@see isValidVerseId}\n *\n * @param {ChaptersData} chaptersData\n * @param {string} verseKey\n * @returns {boolean}\n */\nexport const isValidVerseKey = (chaptersData: ChaptersData, verseKey: string): boolean => {\n const splits = verseKey.split(':');\n // if the splits are not 2, it means it's not in the right format.\n if (splits.length !== 2) {\n return false;\n }\n const [chapterId, verseId] = splits;\n // if either value is not a number e.g. 'one:2' or if the verseNumber is below 0\n if (!isValidChapterId(chapterId) || !isValidVerseId(chaptersData, chapterId, verseId)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Check whether a tafsir id is valid or not. An invalid tafsirId can be:\n * 1. A non numeric value.\n * 2. A numeric value that is less than 0.\n *\n * @param {string} tafsirId\n * @returns {boolean}\n */\nexport const isValidTafsirId = (tafsirId: string): boolean => {\n const tafsirIdNumber = Number(tafsirId);\n // if the tafsir Id is not a number of if it's below 1\n if (Number.isNaN(tafsirIdNumber) || tafsirIdNumber < 1) {\n return false;\n }\n return true;\n};\n","/* eslint-disable import/prefer-default-export */\nimport { QuranFont } from 'types/QuranReader';\nimport Verse from 'types/Verse';\nimport { CharType } from 'types/Word';\n\n/**\n * Construct the verse text given an array of words.\n *\n * @param {Verse} verse\n * @returns {string}\n */\nexport const getVerseTextByWords = (verse: Verse): string => {\n let verseText = '';\n verse.words.forEach((word) => {\n if (word.charTypeName !== CharType.End) {\n verseText = `${verseText} ${word.text}`;\n }\n });\n return verseText;\n};\n\n/**\n * Get the text field name based on the currently\n * selected quranFont.\n *\n * @param {QuranFont} quranFont\n * @returns {string}\n */\nexport const getWordTextFieldNameByFont = (quranFont: QuranFont): string => {\n switch (quranFont) {\n case QuranFont.IndoPak:\n return 'textIndopak';\n\n default:\n return 'textUthmani';\n }\n};\n","enum ScrollAlign {\n Start = 'start',\n Center = 'center',\n End = 'end',\n}\nexport default ScrollAlign;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ContextMenu_container__M7_N3\",\"hide\":\"ContextMenu_hide__l1kVd\",\"visibleContainer\":\"ContextMenu_visibleContainer__KnWDa\",\"withVisibleBanner\":\"ContextMenu_withVisibleBanner__0U0w_\",\"expandedContainer\":\"ContextMenu_expandedContainer__W_YZP\",\"withVisibleSideBar\":\"ContextMenu_withVisibleSideBar__8iHQu\",\"chapter\":\"ContextMenu_chapter__VKK2w\",\"bold\":\"ContextMenu_bold__jqCU4\",\"sectionsContainer\":\"ContextMenu_sectionsContainer__x91pr\",\"halfSection\":\"ContextMenu_halfSection__vu5Iq\",\"section\":\"ContextMenu_section__hi_wD\",\"alignStart\":\"ContextMenu_alignStart__D4EZD\",\"alignEnd\":\"ContextMenu_alignEnd__4YQyB\",\"row\":\"ContextMenu_row__3Hf3R\",\"primaryInfo\":\"ContextMenu_primaryInfo__QL1fr\",\"secondaryInfo\":\"ContextMenu_secondaryInfo__FEnWx\",\"surahName\":\"ContextMenu_surahName__9ovH0\",\"chevronIconContainer\":\"ContextMenu_chevronIconContainer__Bfc57\",\"rotate180\":\"ContextMenu_rotate180__ar3NZ\",\"rotateAuto\":\"ContextMenu_rotateAuto__xUm9n\",\"disabledOnMobile\":\"ContextMenu_disabledOnMobile__Pjaj9\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ObserverWindow_container__yPD6c\",\"readingMode\":\"ObserverWindow_readingMode__fiRzr\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"Notes_container__P4U6p\",\"visibleContainer\":\"Notes_visibleContainer__8hC3J\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"PlayButton_container__CTTxf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"QueryParamMessage_container__qZWgn\",\"link\":\"QueryParamMessage_link__apDAP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"infiniteScroll\":\"QuranReader_infiniteScroll__IAfrZ\",\"readingView\":\"QuranReader_readingView__gmING\",\"loading\":\"QuranReader_loading__Wo_w6\",\"container\":\"QuranReader_container__8c0FU\",\"withVisibleSideBar\":\"QuranReader_withVisibleSideBar__STTiz\",\"withSidebarNavigationOpenOrAuto\":\"QuranReader_withSidebarNavigationOpenOrAuto__s2YDZ\",\"playButton\":\"QuranReader_playButton__dVd11\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ReadingPreference_container__bK6Hm\",\"spinner\":\"ReadingPreference_spinner__DAbUN\",\"preferenceTextContainer\":\"ReadingPreference_preferenceTextContainer___J7Dx\",\"iconContainer\":\"ReadingPreference_iconContainer__Jk5Rm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ReadingPreferenceSwitcher_container__0Dzn6\",\"surahHeaderContainer\":\"ReadingPreferenceSwitcher_surahHeaderContainer__L6XJx\",\"contextMenuContainer\":\"ReadingPreferenceSwitcher_contextMenuContainer__RALtU\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sideDrawerViewContainer\":\"RevelationOrderNavigationNotice_sideDrawerViewContainer__R0aka\",\"endOfScrollingViewContainer\":\"RevelationOrderNavigationNotice_endOfScrollingViewContainer__moJQq\",\"link\":\"RevelationOrderNavigationNotice_link__NY714\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"SidebarNavigation_container__IooCv\",\"visibleContainer\":\"SidebarNavigation_visibleContainer__Y6E1c\",\"containerAuto\":\"SidebarNavigation_containerAuto__WRE2m\",\"header\":\"SidebarNavigation_header__fqOtn\",\"switchContainer\":\"SidebarNavigation_switchContainer__DU_JH\",\"contentContainer\":\"SidebarNavigation_contentContainer__FeDCs\",\"surahBodyContainer\":\"SidebarNavigation_surahBodyContainer__bZs9R\",\"verseListContainer\":\"SidebarNavigation_verseListContainer__tE5ut\",\"scrollableSectionContainer\":\"SidebarNavigation_scrollableSectionContainer__DEA47\",\"listContainer\":\"SidebarNavigation_listContainer__Z4xaB\",\"list\":\"SidebarNavigation_list__5GJEm\",\"listItem\":\"SidebarNavigation_listItem__geBUW\",\"selectedItem\":\"SidebarNavigation_selectedItem__swGQH\",\"surahListContainer\":\"SidebarNavigation_surahListContainer__IYouq\",\"searchInput\":\"SidebarNavigation_searchInput__vhw5Z\",\"spaceOnTop\":\"SidebarNavigation_spaceOnTop__VHaMe\",\"chapterNumber\":\"SidebarNavigation_chapterNumber__39NUY\",\"tip\":\"SidebarNavigation_tip__g4nzj\",\"revelationOrderHeader\":\"SidebarNavigation_revelationOrderHeader___cG5Q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"skeletonContainer\":\"SidebarSelectionSkeleton_skeletonContainer__Pl7tL\",\"row\":\"SidebarSelectionSkeleton_row__AF4Qi\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"TranslationView_container__M0fhJ\",\"wrapper\":\"TranslationView_wrapper__C8vfW\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"Notes_container__IGuVA\",\"newLabel\":\"Notes_newLabel__mLbXd\",\"newLabelContainer\":\"Notes_newLabelContainer__kHpCe\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"verseLink\":\"VerseLink_verseLink__m_uNh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ChapterHeader_container__UANyL\",\"left\":\"ChapterHeader_left__9GlxX\",\"right\":\"ChapterHeader_right__IcBU9\",\"chapterId\":\"ChapterHeader_chapterId__Z_Pey\",\"bismillahContainer\":\"ChapterHeader_bismillahContainer__EXMlw\",\"translatedName\":\"ChapterHeader_translatedName__2sqjR\",\"arabicSurahNameContainer\":\"ChapterHeader_arabicSurahNameContainer__xn14U\",\"transliteratedName\":\"ChapterHeader_transliteratedName__V9dup\",\"actionContainer\":\"ChapterHeader_actionContainer__tbdf_\",\"translation\":\"ChapterHeader_translation__ERRFK\",\"translationBy\":\"ChapterHeader_translationBy__DDZAE\",\"changeTranslation\":\"ChapterHeader_changeTranslation__UlDJ5\",\"header\":\"ChapterHeader_header__kguEh\",\"chapterIconContainer\":\"ChapterHeader_chapterIconContainer__CJN7h\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"iconContainer\":\"ChapterIconContainer_iconContainer__5umYV\",\"iconContainerSmall\":\"ChapterIconContainer_iconContainerSmall__gvmyy\",\"iconContainerLarge\":\"ChapterIconContainer_iconContainerLarge__z49r_\",\"iconContainerMega\":\"ChapterIconContainer_iconContainerMega__rKWtt\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"Badge_container__GXfIf\",\"content\":\"Badge_content__Ue8Y7\",\"positionBottomRight\":\"Badge_positionBottomRight__1JJDw\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"NewLabel_label__azDvj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"KeyboardInput_container__Zwe4F\",\"invertedColors\":\"KeyboardInput_invertedColors__2s3F3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"_error_container__vJFnH\",\"withFullWidth\":\"_error_withFullWidth__VEzYc\",\"title\":\"_error_title__oLWAK\",\"goBack\":\"_error_goBack__U4WNd\",\"reportBug\":\"_error_reportBug__tsKmR\"};"],"names":["_path","_path2","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","props","xmlns","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","className","d","fillRule","clipRule","makeError","DOMException","module","exports","async","text","navigator","clipboard","writeText","copyClipboardApi","err","span","document","createElement","textContent","style","whiteSpace","webkitUserSelect","userSelect","body","appendChild","selection","window","getSelection","range","createRange","removeAllRanges","selectNode","addRange","success","execCommand","removeChild","copyExecCommand","err2","string","split","array","start","end","index","result","Array","baseSlice","undefined","castSlice","hasUnicode","stringToArray","toString","methodName","strSymbols","chr","charAt","trailing","join","slice","reHasUnicode","RegExp","test","asciiToArray","unicodeToArray","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","reUnicode","match","upperFirst","toLowerCase","createCaseFirst","url","image","imageAlt","imageHeight","imageWidth","openGraph","description","rest","openGraphParams","images","alt","params","truncateString","NextSeo","translationsQueryParamDifferent","reciterQueryParamDifferent","wordByWordLocaleQueryParamDifferent","useTranslation","lang","router","useRouter","audioService","useContext","AudioPlayerMachineContext","selectedTranslations","useSelector","selectSelectedTranslations","areArraysEqual","selectedReciterId","useXstateSelector","state","context","reciterId","selectedWordByWordLocale","selectWordByWordLocale","shallowEqual","usePersistPreferenceGroup","actions","onSettingsChange","onXstateSettingsChange","div","styles","Trans","i18nKey","components","onClick","query","QueryParam","String","QuranReaderFlow","push","shallow","isValidTranslationsQueryParamValue","nextTranslations","map","stringValue","Number","setSelectedTranslations","translations","locale","PreferenceGroup","nextWordByWord","setSelectedWordByWordLocale","value","nextReciterId","send","type","RevelationOrderNavigationNoticeView","view","isLoading","classNames","SideDrawer","EndOfScrollingControls","Spinner","link","setIsReadingByRevelationOrder","logButtonClick","aria-hidden","getTranslationViewRequestKey","id","isVerseData","initialData","pageNumber","quranReaderStyles","quranReaderDataType","reciter","wordByWordLocale","page","verses","verseNumber","commonParams","wordTranslationLanguage","getDefaultWordFields","quranFont","getMushafId","mushafLines","QuranReaderDataType","makeJuzVersesUrl","perPage","pagination","makeHizbVersesUrl","makePageVersesUrl","makeRubVersesUrl","from","metaData","to","makeVersesUrl","makeByRangeVersesUrl","pagesLookup","lookupRange","getReaderViewRequestKey","pageVersesRange","filterPageWords","getPagesLookupParams","resourceId","mushafId","mushaf","resourceIdNumber","chapterNumber","hizbNumber","juzNumber","rubElHizbNumber","verseKey","verseFetcher","input","init","fetcher","isUsingDefaultFont","useSWRImmutable","makePagesLookupUrl","fallbackData","revalidateOnMount","data","error","isValidating","pagesCount","totalPage","pagesVersesRange","pages","hasError","readingPreferenceIcons","ReadingPreference","ReaderIcon","BookIcon","readingPreference","selectedReadingPreference","isIconsOnly","ReadingPreferenceSwitcherType","lastReadVerseKey","size","SurahHeader","readingPreferences","selectReadingPreferences","lastReadVerse","selectLastReadVerseKey","readingPreferencesOptions","name","LoadingSwitcher","ContextMenu","Switch","items","selected","onSelect","logValueChange","newQueryParams","startingVerse","parseInt","newUrlObject","pathname","replace","then","setReadingPreference","dispatch","useDispatch","chaptersData","DataContext","isSidebarNavigationVisible","selectIsSidebarNavigationVisible","isSideBarVisible","selectNotes","isVisible","selectContextMenu","isExpanded","showReadingPreferenceSwitcher","useOnboarding","isActive","showNavbar","selectNavbar","isReadingPreferenceSwitcherVisible","chapterId","hizb","chapterData","useMemo","getChapterData","toLocalizedNumber","getJuzNumberByHizb","localizedHizb","localizedPageNumber","verse","getVerseNumberFromKey","progress","getChapterReadingProgress","versesCount","p","logEvent","stopPropagation","shouldBeVisible","isMobile","setIsVisible","transliteratedName","ChevronDownIcon","ReadingPreferenceSwitcher","SwitchSize","VerseTrackerContext","createContext","VerseTrackerContextProvider","children","verseKeysQueue","useRef","Set","shouldTrackObservedVerses","Provider","useVerseTrackerContext","isReadingMode","process","env","NEXT_PUBLIC_DEBUG_OBSERVER_WINDOW","br","button","payload","onElementVisible","observerId","threshold","root","rootMargin","updateEntry","useCallback","entries","filter","entry","isIntersecting","forEach","visibleEntry","target","useBrowserLayoutEffect","IntersectionObserver","disconnect","i","chapter","verseNumbers","sort","a","b","j","combinedVerses","add","verseMap","getVerseAndChapterNumbersFromKey","isReadingPreference","selectQuranFont","selectQuranMushafLines","elapsedReadingTimeInSeconds","useSWRConfig","cache","mutate","addReadingSessionAndClearCache","addReadingSession","delete","makeReadingSessionsUrl","debouncedAddReadingSession","debounce","updateReadingDayAndClearCache","updateActivityDay","currentMonthHistoryUrl","makeFilterActivityDaysUrl","getFilterActivityDaysParamsOfCurrentMonth","makeStreakUrl","element","getObservedVersePayload","setLastReadVerse","isLoggedIn","current","useEffect","interval","setInterval","verseRanges","mergeVerseKeys","clear","seconds","ActivityDayType","ranges","clearInterval","handleFocus","handleBlur","addEventListener","removeEventListener","useGlobalIntersectionObserver","getOptions","QURAN_READER_OBSERVER_ID","selectIsUsingDefaultFont","useFetchPagesLookup","generateVerseKeysBetweenTwoVerseKeys","virtuosoRef","apiPageToVersesMap","versesPerPage","useState","shouldReadjustScroll","setShouldReadjustScroll","timeoutId","startingVerseNumber","isValidStartingVerse","isValidVerseId","scrollToBeginningOfVerseCell","verseIndex","scrollToIndex","align","ScrollAlign","offset","getPageNumberFromIndexAndPerPage","isBeforeDoneLoading","clearTimeout","setTimeout","makeVerseKey","setApiPageToVersesMap","verseIdx","translationParams","translation","idxInPage","isUsingDefaultSettings","useIsUsingDefaultSettings","shouldUseInitialData","prevMushafPageToVersesMap","bookmarksRangeUrl","makeBookmarksRangeUrl","firstVerseInPage","notesRange","pageBookmarks","selectQuranReaderStyles","bookmarkedVerses","selectBookmarks","toast","useToast","isVerseBookmarked","Button","bookmarkedVersesRange","get","nextBookmarkedVersesRange","revalidate","makeBookmarkUrl","BookmarkType","bookmarkId","deleteBookmarkById","catch","status","ToastStatus","toggleVerseBookmark","tooltip","variant","ButtonVariant","ButtonSize","BookmarkedIcon","VerseNotesTrigger","userData","isTranslationView","hasNotes","isModalOpen","setIsModalOpen","makeUserProfileUrl","getUserProfile","shouldShowNewLabel","consents","ConsentType","NoteModal","isOpen","onClose","isUserLoggedIn","getLoginNavigationUrl","getChapterWithStartingVerseUrl","ButtonType","shape","ButtonShape","NotesIcon","Wrapper","shouldWrap","wrapper","Badge","internalStyles","contentClassName","content","NewLabel","EmptyNotesIcon","href","shouldShallowRoute","shouldPrefetch","toLocalizedVerseKey","TranslationViewCell","isHighlighted","useSelectorXstate","ayahNumber","surah","enableAutoScrolling","selectEnableAutoScrolling","useScroll","SMOOTH_SCROLL_TO_TOP","scrollToSelectedItem","selectedItemRef","ref","VerseLink","BookmarkIcon","VerseNotes","PlayVerseAudioButton","TafsirButton","QuranReflectButton","OverflowVerseActionsMenu","VerseText","words","getVerseWords","shouldShowH1ForSEO","TranslationText","translationFontScale","languageId","resourceName","Separator","areVersesEqual","prevProps","nextProps","verseFontChanged","verseTranslationChanged","verseTranslationFontChanged","JSON","stringify","memo","isLastVerseInView","containerRef","getPageBookmarks","useCountRangeNotes","observer","observe","ChapterHeader","translationName","othersCount","getTranslationNameString","isTranslationSelected","notesCount","totalVerses","useDedupedFetchVerse","TranslationPageVerse","TranslationViewCellSkeleton","dynamic","ssr","loading","useGetQueryParamOrXstateValue","isQueryParamDifferent","useGetQueryParamOrReduxValue","useGetVersesCount","useScrollToVirtualizedVerse","values","flat","useQcfFont","shouldShowQueryParamMessage","QueryParamMessage","onCopy","event","onCopyQuranWords","Virtuoso","useWindowScroll","totalCount","increaseViewportBy","initialItemCount","itemContent","lastVerse","TranslationViewVerse","ReadingView","useSyncReadingProgress","TranslationView","rowsArr","k","Skeleton","isSquared","PageSelection","SidebarSelectionSkeleton","SurahSelection","JuzSelection","selectedNavigationItem","NavigationItem","selectSelectedNavigationItem","isReadingByRevelationOrder","selectIsReadingByRevelationOrder","sidebarRef","useOutsideClickDetector","navigationItems","isContextMenuExpanded","ariaLabel","IconClose","RevelationOrderNavigationNotice","SidebarNavigationSelections","selectNavigationItem","KeyboardInput","meta","keyboardKey","selectReadingPreference","FontPreLoader","isQuranReader","DebuggingObserverWindow","QuranReaderView","SidebarNavigation","Notes","extractText","wordLocation","getWordDataByLocation","location","selectedVerse","find","v","selectedWord","word","position","getWordTextFieldNameByFont","quranWordsToCopy","querySelectorAll","DATA_ATTRIBUTE_WORD_LOCATION","node","containsNode","getAttribute","preventDefault","clipboardCopy","prevVerse","nextVerse","prevQuranStyles","nextQuranStyles","prevWords","nextWords","languageName","CENTER_ALIGNED_PAGES","CENTER_ALIGNED_PAGE_LINES","lineNumber","QuranFont","centerAlignedLines","includes","textRef","useIntersectionObserver","quranTextFontScale","firstWord","isFontLoaded","useIsFontLoaded","selectInlineDisplayWordByWordPreferences","showWordByWordTranslation","showWordByWordTransliteration","selectedVerseKey","selectReadingViewSelectedVerseKey","hoveredVerseKey","selectReadingViewHoveredVerseKey","centerAlignPage","isCenterAlignedPage","firstWordData","getFirstWordOfSurah","isTajweedFont","isBigTextLayout","VerseTextContainer","fontClassName","getFontClassName","FALLBACK_FONT","data-verse-key","data-page","data-chapter-id","data-hizb","translate","QuranWord","font","shouldShowSecondaryHighlight","React","_switch","isLoadingCurrentChapter","selectIsLoadingCurrentChapter","isPlayingCurrentChapter","selectIsPlayingCurrentChapter","prefix","hasSidePadding","shouldFlipOnRTL","isDisabled","PauseIcon","PlayIcon","surahName","baseProfile","overflow","xmlSpace","BismillahSVG","CHAPTERS_WITHOUT_BISMILLAH","headerRef","onChangeTranslationClicked","setIsSettingsDrawerOpen","setSettingsView","SettingsView","ChapterIconContainer","ChapterIconsSize","Bismillah","onKeyPress","tabIndex","role","InfoIcon","getSurahInfoNavigationUrl","PlayChapterAudioButton","padStart","Medium","hasSurahPrefix","Small","Large","Mega","ChapterIcon","shift","ctrl","invertColors","isMacOs","userAgent","search","kbd","countNotesWithinRange","isUsingDefaultReciter","selectIsUsingDefaultReciter","isUsingDefaultWordByWordLocale","selectIsUsingDefaultWordByWordLocale","isUsingDefaultTranslations","selectIsUsingDefaultTranslations","defaultState","getQuranReaderStylesInitialState","getTranslationsInitialState","areTranslationsEqual","mergeTwoArraysUniquely","elementRef","unobserve","useScrollToElement","options","scrollIntoView","SMOOTH_SCROLL_TO_CENTER","block","behavior","SCROLL_TO_NEAREST_ELEMENT","statusCode","hasFullWidth","h1","referrer","back","Link","LinkVariant","currentMonth","getCurrentMonth","currentYear","Date","getFullYear","getFilterActivityDaysParams","month","year","makeDateRangeFromMonth","limit","Math","ceil","isFirstJuz","isLastJuz","getJuzIds","juz","label","PAGES_MUSHAF_MAP","Mushaf","isFirstPage","surahNumber","isLastPage","getMushafTotalPageNumber","MushafLines","QuranFontMushaf","getPageIdsByMushaf","getMushafLinesNumber","rawString","suffix","characters","shortenedText","character","stripHTMLTags","slugifiedCollectionIdToCollectionId","slugifiedCollectionId","splits","isValidChapterId","chapterIdNumber","isNaN","verseId","verseIdNumber","isValidPageNumber","pageId","pageIdNumber","MUSHAF_COUNT","isValidVerseKey"],"sourceRoot":""}