@e-llm-studio/citation 0.0.252 → 0.0.253
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/features/PdfViewer/PdfContainer.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfContainer.js.map +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/cjs/features/SegmentReviewComponents/ApprovalDescriptionBanner.js +2 -0
- package/dist/cjs/features/SegmentReviewComponents/ApprovalDescriptionBanner.js.map +1 -0
- package/dist/cjs/features/SegmentReviewComponents/RevertCard.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/RevertCard.js.map +1 -1
- package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js +2 -0
- package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -0
- package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
- package/dist/cjs/hooks/useOnDemandCitationFetch.js +1 -1
- package/dist/cjs/hooks/useOnDemandCitationFetch.js.map +1 -1
- package/dist/cjs/service/onDemandApi.js +1 -1
- package/dist/cjs/service/onDemandApi.js.map +1 -1
- package/dist/features/PdfViewer/PdfContainer.js +1 -1
- package/dist/features/PdfViewer/PdfContainer.js.map +1 -1
- package/dist/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/features/SegmentReviewComponents/ApprovalDescriptionBanner.js +2 -0
- package/dist/features/SegmentReviewComponents/ApprovalDescriptionBanner.js.map +1 -0
- package/dist/features/SegmentReviewComponents/RevertCard.js +1 -1
- package/dist/features/SegmentReviewComponents/RevertCard.js.map +1 -1
- package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js +2 -0
- package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -0
- package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
- package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
- package/dist/hooks/useOnDemandCitationFetch.js +1 -1
- package/dist/hooks/useOnDemandCitationFetch.js.map +1 -1
- package/dist/service/onDemandApi.js +1 -1
- package/dist/service/onDemandApi.js.map +1 -1
- package/dist/types/features/PdfViewer/PdfContainer.d.ts +3 -2
- package/dist/types/features/PdfViewer/PdfContainer.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/PdfViewer.d.ts +3 -2
- package/dist/types/features/PdfViewer/PdfViewer.d.ts.map +1 -1
- package/dist/types/features/SegmentReviewComponents/ApprovalDescriptionBanner.d.ts +11 -0
- package/dist/types/features/SegmentReviewComponents/ApprovalDescriptionBanner.d.ts.map +1 -0
- package/dist/types/features/SegmentReviewComponents/RevertCard.d.ts +9 -1
- package/dist/types/features/SegmentReviewComponents/RevertCard.d.ts.map +1 -1
- package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts +15 -0
- package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts.map +1 -0
- package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts +12 -1
- package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts.map +1 -1
- package/dist/types/hooks/useOnDemandCitationFetch.d.ts.map +1 -1
- package/dist/types/service/onDemandApi.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("react"),e=require("@tanstack/react-query"),n=require("../service/onDemandApi.js");const i=(t,e,n)=>Array.isArray(t)?Array.isArray(e)&&0!==e.length?Number.isNaN(n)?(console.warn("[findCitation] citationNumber is NaN"),null):t.find(t=>{const i=(t=>{if(null==t)return console.warn("[getCitationType] received null or undefined citation"),"";const e=t?.customMetaData?.type??t?.customMetadata?.type??t?.type??"";return e||console.warn("[getCitationType] citation has no resolvable type field",t),e})(t);return(t=>null==t?(console.warn("[getCitationNumber] received null or undefined citation"),""):(null==t.citation_number&&console.warn("[getCitationNumber] citation is missing citation_number field",t),t?.citation_number??""))(t)?.toString()===n.toString()&&e.some(t=>i?.includes(t))})??null:(console.warn("[findCitation] citationTypes is empty or falsy",e),null):(console.warn("[findCitation] citations is not an array",t),null);exports.useOnDemandCitationFetch=({msg:a,citationType:o,citationNumber:c,enabled:s=!1,accessToken:r,baseUrl:u,orgName:d,citationAssistantProcessingName:l,citationAgentName:_})=>{const m=a?.requestId||a?.id||"",y=t.useMemo(()=>(t=>{switch(t){case"artifact_chunks":return["artifact_chunks","scanned_doc_citation","scanned_doc_citations"];case"rai_artifact_citation":return["rai_artifact_citation","rai_artifact_citations"];case"json_chunks":return["json_chunks"];case"scanned_doc_citation":return["scanned_doc_citation","scanned_doc_citations","artifact_chunks"];case"scanned_doc_citations":return["scanned_doc_citations","scanned_doc_citation","artifact_chunks"];default:return[t]}})(o),[o]),f=(()=>{switch(o){case"artifact_chunks":case"scanned_doc_citations":return"scanned_doc_citation";case"rai_artifact_citation":return"rai_artifact_citation";default:return o}})(),g=a?.isEcgPayloadActive?t.useMemo(()=>["onDemandCitationFetch",m,f,a?.customCitationId,a?.ecg_agent_name],[m,f,a?.customCitationId,a?.ecg_agent_name]):t.useMemo(()=>["onDemandCitationFetch",m,f,"gpt_citation"===o?a?.id:c],[m,f,c]),h=t.useMemo(()=>i(a?.citations,y,c),[a?.citations,y,c]),p=Boolean(s&&m&&f&&u&&d&&!Number.isNaN(c)&&!h),C=r,b=!0===a?.isStreamEnd,A=e.useQuery({queryKey:g,queryFn:async()=>{const t=await n.fetchOnDemandCitation(m,f,c,a?.content??"",C,u,l??"",d,_??"",a?.isEcgPayloadActive??!1,"boolean"==typeof a?.isReqPayloadActive&&a.isReqPayloadActive,a?.ecg_agent_name??"",a?.customCitationId??"",a?.plan_id??"",a?.ui_chat_history??void 0,a?.mmvf_list??void 0,Array.isArray(a?.files)?a.files:[],"string"==typeof a?.metadata&&a.metadata.trim()?a.metadata:"",a?.checkPossibleCitationPayload,a?.ui_request_body);if(t.error||!t.responseData)throw new Error(t.error?.errorMessage||"Failed to fetch on-demand citation");return t.responseData},enabled:p&&b&&Boolean(a?.content),staleTime:1/0,gcTime:1/0,refetchOnMount:!1,refetchOnWindowFocus:!1,retry:!1}),N=t.useMemo(()=>{const t=A.data?.result?.citations??[];return Array.isArray(t)&&0!==t.length?a?.customCitationId?t.find(t=>{const e=t?.title??t?.display_name??"";return"string"==typeof e&&e.includes(a.customCitationId)})??t[0]??null:i(t,y,c)??t[0]??null:null},[a?.customCitationId,c,y,A.data]);return{citation:h??N,isFetching:A.isFetching,isLoading:A.isLoading,isComplete:A.isSuccess,status:A.status,refetch:A.refetch}};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("react"),e=require("@tanstack/react-query"),n=require("../service/onDemandApi.js");const i=(t,e,n)=>Array.isArray(t)?Array.isArray(e)&&0!==e.length?Number.isNaN(n)?(console.warn("[findCitation] citationNumber is NaN"),null):t.find(t=>{const i=(t=>{if(null==t)return console.warn("[getCitationType] received null or undefined citation"),"";const e=t?.customMetaData?.type??t?.customMetadata?.type??t?.type??"";return e||console.warn("[getCitationType] citation has no resolvable type field",t),e})(t);return(t=>null==t?(console.warn("[getCitationNumber] received null or undefined citation"),""):(null==t.citation_number&&console.warn("[getCitationNumber] citation is missing citation_number field",t),t?.citation_number??""))(t)?.toString()===n.toString()&&e.some(t=>i?.includes(t))})??null:(console.warn("[findCitation] citationTypes is empty or falsy",e),null):(console.warn("[findCitation] citations is not an array",t),null);exports.useOnDemandCitationFetch=({msg:a,citationType:o,citationNumber:c,enabled:s=!1,accessToken:r,baseUrl:u,orgName:d,citationAssistantProcessingName:l,citationAgentName:_})=>{const m=a?.requestId||a?.id||"",y=t.useMemo(()=>(t=>{switch(t){case"artifact_chunks":return["artifact_chunks","scanned_doc_citation","scanned_doc_citations"];case"rai_artifact_citation":return["rai_artifact_citation","rai_artifact_citations"];case"json_chunks":return["json_chunks"];case"scanned_doc_citation":return["scanned_doc_citation","scanned_doc_citations","artifact_chunks"];case"scanned_doc_citations":return["scanned_doc_citations","scanned_doc_citation","artifact_chunks"];default:return[t]}})(o),[o]),f=(()=>{switch(o){case"artifact_chunks":case"scanned_doc_citations":return"scanned_doc_citation";case"rai_artifact_citation":return"rai_artifact_citation";default:return o}})(),g=a?.isEcgPayloadActive?t.useMemo(()=>["onDemandCitationFetch",m,f,a?.customCitationId,a?.ecg_agent_name],[m,f,a?.customCitationId,a?.ecg_agent_name]):t.useMemo(()=>["onDemandCitationFetch",m,f,"gpt_citation"===o?a?.id:c],[m,f,c]),h=t.useMemo(()=>i(a?.citations,y,c),[a?.citations,y,c]),p=Boolean(s&&m&&f&&u&&d&&!Number.isNaN(c)&&!h),C=r,b=!0===a?.isStreamEnd,A=e.useQuery({queryKey:g,queryFn:async()=>{C&&C.trim()||console.warn("[useOnDemandCitationFetch] no accessToken passed in props");const t=await n.fetchOnDemandCitation(m,f,c,a?.content??"",C,u,l??"",d,_??"",a?.isEcgPayloadActive??!1,"boolean"==typeof a?.isReqPayloadActive&&a.isReqPayloadActive,a?.ecg_agent_name??"",a?.customCitationId??"",a?.plan_id??"",a?.ui_chat_history??void 0,a?.mmvf_list??void 0,Array.isArray(a?.files)?a.files:[],"string"==typeof a?.metadata&&a.metadata.trim()?a.metadata:"",a?.checkPossibleCitationPayload,a?.ui_request_body);if(t.error||!t.responseData)throw new Error(t.error?.errorMessage||"Failed to fetch on-demand citation");return t.responseData},enabled:p&&b&&Boolean(a?.content),staleTime:1/0,gcTime:1/0,refetchOnMount:!1,refetchOnWindowFocus:!1,retry:!1}),N=t.useMemo(()=>{const t=A.data?.result?.citations??[];return Array.isArray(t)&&0!==t.length?a?.customCitationId?t.find(t=>{const e=t?.title??t?.display_name??"";return"string"==typeof e&&e.includes(a.customCitationId)})??t[0]??null:i(t,y,c)??t[0]??null:null},[a?.customCitationId,c,y,A.data]);return{citation:h??N,isFetching:A.isFetching,isLoading:A.isLoading,isComplete:A.isSuccess,status:A.status,refetch:A.refetch}};
|
|
2
2
|
//# sourceMappingURL=useOnDemandCitationFetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOnDemandCitationFetch.js","sources":["../../../src/hooks/useOnDemandCitationFetch.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { fetchOnDemandCitation } from '../service/onDemandApi';\nimport type {\n OnDemandCitationPayload,\n UseOnDemandCitationFetchParams,\n} from '../types/useOnDemandCitationFetch.types';\n\nexport type {\n OnDemandCitationPayload,\n ShareChatToMode,\n IntermediateStep,\n ShareChat,\n ArtifactData,\n PowerActionMetadata,\n UseOnDemandCitationFetchParams,\n} from '../types/useOnDemandCitationFetch.types';\n\nconst getCitationType = (citation: any) => {\n if (citation == null) {\n console.warn('[getCitationType] received null or undefined citation');\n return '';\n }\n const type =\n citation?.customMetaData?.type ??\n citation?.customMetadata?.type ??\n citation?.type ??\n '';\n if (!type) {\n console.warn('[getCitationType] citation has no resolvable type field', citation);\n }\n return type;\n};\n\nconst getCitationNumber = (citation: any) => {\n if (citation == null) {\n console.warn('[getCitationNumber] received null or undefined citation');\n return '';\n }\n if (citation.citation_number == null) {\n console.warn('[getCitationNumber] citation is missing citation_number field', citation);\n }\n return citation?.citation_number ?? '';\n};\n\nconst getCitationTypeCandidates = (citationType: string) => {\n switch (citationType) {\n case 'artifact_chunks':\n return ['artifact_chunks', 'scanned_doc_citation', 'scanned_doc_citations'];\n case 'rai_artifact_citation':\n return ['rai_artifact_citation', 'rai_artifact_citations'];\n case 'json_chunks':\n return ['json_chunks'];\n case 'scanned_doc_citation':\n return ['scanned_doc_citation', 'scanned_doc_citations', 'artifact_chunks'];\n case 'scanned_doc_citations':\n return ['scanned_doc_citations', 'scanned_doc_citation', 'artifact_chunks'];\n default:\n return [citationType];\n }\n};\n\nconst findCitation = (\n citations: any[] | undefined,\n citationTypes: string[],\n citationNumber: number\n) => {\n if (!Array.isArray(citations)) {\n console.warn('[findCitation] citations is not an array', citations);\n return null;\n }\n if (!Array.isArray(citationTypes) || citationTypes.length === 0) {\n console.warn('[findCitation] citationTypes is empty or falsy', citationTypes);\n return null;\n }\n if (Number.isNaN(citationNumber)) {\n console.warn('[findCitation] citationNumber is NaN');\n return null;\n }\n\n return (\n citations.find((citation: any) => {\n const type = getCitationType(citation);\n return (\n getCitationNumber(citation)?.toString() === citationNumber.toString() &&\n citationTypes.some((citationType) => type?.includes(citationType))\n );\n }) ?? null\n );\n};\n\nexport const useOnDemandCitationFetch = ({\n msg,\n citationType,\n citationNumber,\n enabled = false,\n accessToken,\n baseUrl,\n orgName,\n citationAssistantProcessingName,\n citationAgentName,\n}: UseOnDemandCitationFetchParams) => {\n const requestId = msg?.requestId || msg?.id || '';\n const citationTypesForMatching = useMemo(() => getCitationTypeCandidates(citationType), [citationType]);\n const citationTypeForRequest = (() => {\n switch (citationType) {\n case 'artifact_chunks': return 'scanned_doc_citation';\n case 'rai_artifact_citation': return 'rai_artifact_citation';\n case 'scanned_doc_citations': return 'scanned_doc_citation';\n default: return citationType;\n }\n })();\n\n\t// Each (requestId, citationType, citationNumber) triple gets its own cache entry\n\tconst queryKey =msg?.isEcgPayloadActive ? useMemo(\n\t () => ['onDemandCitationFetch', requestId, citationTypeForRequest, msg?.customCitationId, msg?.ecg_agent_name],\n\t [requestId, citationTypeForRequest, msg?.customCitationId, msg?.ecg_agent_name]) \n\t : useMemo(\n\t () => ['onDemandCitationFetch', requestId, citationTypeForRequest, citationType === 'gpt_citation' ? msg?.id : citationNumber],\n\t [requestId, citationTypeForRequest, citationNumber]\n\t);\n\n // If the citation already exists on the message, no need to fetch\n const existingCitation = useMemo(\n () => findCitation(msg?.citations, citationTypesForMatching, citationNumber),\n [msg?.citations, citationTypesForMatching, citationNumber]\n );\n\n const shouldFetch = Boolean(enabled && requestId && citationTypeForRequest && baseUrl && orgName && !Number.isNaN(citationNumber) && !existingCitation);\n const token = accessToken;\n const isMessageComplete = msg?.isStreamEnd === true;\n\n const query = useQuery<OnDemandCitationPayload>({\n queryKey,\n queryFn: async () => {\n // if(!token) {\n // console.error('[useOnDemandCitationFetch] No auth token available, cannot fetch citation');\n // throw new Error('No auth token available, cannot fetch citation');\n // }\n const response = await fetchOnDemandCitation(\n requestId,\n citationTypeForRequest,\n citationNumber,\n msg?.content ?? '',\n token,\n baseUrl,\n citationAssistantProcessingName ?? '',\n orgName,\n citationAgentName ?? '',\n msg?.isEcgPayloadActive ?? false,\n (typeof msg?.isReqPayloadActive === 'boolean' ? msg.isReqPayloadActive : false),\n msg?.ecg_agent_name ?? '',\n msg?.customCitationId ?? '',\n msg?.plan_id ?? '',\n msg?.ui_chat_history ?? undefined,\n msg?.mmvf_list ?? undefined,\n Array.isArray(msg?.files) ? msg.files : [],\n (typeof msg?.metadata === 'string' && msg.metadata.trim()) ? msg.metadata : '',\n msg?.checkPossibleCitationPayload,\n msg?.ui_request_body\n );\n\n if (response.error || !response.responseData) {\n throw new Error(response.error?.errorMessage || 'Failed to fetch on-demand citation');\n }\n\n return response.responseData;\n },\n enabled: shouldFetch && isMessageComplete && Boolean(msg?.content),\n staleTime: Infinity,\n gcTime: Infinity,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n retry: false,\n });\n const fetchedCitation = useMemo(() => {\n const citations = query.data?.result?.citations ?? [];\n if (!Array.isArray(citations) || citations.length === 0) return null;\n\n if (msg?.customCitationId) {\n return (\n citations.find((c: any) => {\n const title = c?.title ?? c?.display_name ?? '';\n return typeof title === 'string' && title.includes(msg.customCitationId);\n }) ?? citations[0] ?? null\n );\n }\n\n return (\n findCitation(citations, citationTypesForMatching, citationNumber) ??\n citations[0] ??\n null\n );\n}, [msg?.customCitationId, citationNumber, citationTypesForMatching, query.data]);\n const resolvedCitation = existingCitation ?? fetchedCitation;\n\n return {\n citation: resolvedCitation,\n isFetching: query.isFetching,\n isLoading: query.isLoading,\n isComplete: query.isSuccess,\n status: query.status,\n refetch: query.refetch,\n };\n};\n"],"names":["findCitation","citations","citationTypes","citationNumber","Array","isArray","length","Number","isNaN","console","warn","find","citation","type","customMetaData","customMetadata","getCitationType","citation_number","getCitationNumber","toString","some","citationType","includes","msg","enabled","accessToken","baseUrl","orgName","citationAssistantProcessingName","citationAgentName","requestId","id","citationTypesForMatching","useMemo","getCitationTypeCandidates","citationTypeForRequest","queryKey","isEcgPayloadActive","customCitationId","ecg_agent_name","existingCitation","shouldFetch","Boolean","token","isMessageComplete","isStreamEnd","query","useQuery","queryFn","async","response","fetchOnDemandCitation","content","isReqPayloadActive","plan_id","ui_chat_history","mmvf_list","files","metadata","trim","checkPossibleCitationPayload","ui_request_body","error","responseData","Error","errorMessage","staleTime","Infinity","gcTime","refetchOnMount","refetchOnWindowFocus","retry","fetchedCitation","data","result","c","title","display_name","isFetching","isLoading","isComplete","isSuccess","status","refetch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useOnDemandCitationFetch.js","sources":["../../../src/hooks/useOnDemandCitationFetch.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { fetchOnDemandCitation } from '../service/onDemandApi';\nimport type {\n OnDemandCitationPayload,\n UseOnDemandCitationFetchParams,\n} from '../types/useOnDemandCitationFetch.types';\n\nexport type {\n OnDemandCitationPayload,\n ShareChatToMode,\n IntermediateStep,\n ShareChat,\n ArtifactData,\n PowerActionMetadata,\n UseOnDemandCitationFetchParams,\n} from '../types/useOnDemandCitationFetch.types';\n\nconst getCitationType = (citation: any) => {\n if (citation == null) {\n console.warn('[getCitationType] received null or undefined citation');\n return '';\n }\n const type =\n citation?.customMetaData?.type ??\n citation?.customMetadata?.type ??\n citation?.type ??\n '';\n if (!type) {\n console.warn('[getCitationType] citation has no resolvable type field', citation);\n }\n return type;\n};\n\nconst getCitationNumber = (citation: any) => {\n if (citation == null) {\n console.warn('[getCitationNumber] received null or undefined citation');\n return '';\n }\n if (citation.citation_number == null) {\n console.warn('[getCitationNumber] citation is missing citation_number field', citation);\n }\n return citation?.citation_number ?? '';\n};\n\nconst getCitationTypeCandidates = (citationType: string) => {\n switch (citationType) {\n case 'artifact_chunks':\n return ['artifact_chunks', 'scanned_doc_citation', 'scanned_doc_citations'];\n case 'rai_artifact_citation':\n return ['rai_artifact_citation', 'rai_artifact_citations'];\n case 'json_chunks':\n return ['json_chunks'];\n case 'scanned_doc_citation':\n return ['scanned_doc_citation', 'scanned_doc_citations', 'artifact_chunks'];\n case 'scanned_doc_citations':\n return ['scanned_doc_citations', 'scanned_doc_citation', 'artifact_chunks'];\n default:\n return [citationType];\n }\n};\n\nconst findCitation = (\n citations: any[] | undefined,\n citationTypes: string[],\n citationNumber: number\n) => {\n if (!Array.isArray(citations)) {\n console.warn('[findCitation] citations is not an array', citations);\n return null;\n }\n if (!Array.isArray(citationTypes) || citationTypes.length === 0) {\n console.warn('[findCitation] citationTypes is empty or falsy', citationTypes);\n return null;\n }\n if (Number.isNaN(citationNumber)) {\n console.warn('[findCitation] citationNumber is NaN');\n return null;\n }\n\n return (\n citations.find((citation: any) => {\n const type = getCitationType(citation);\n return (\n getCitationNumber(citation)?.toString() === citationNumber.toString() &&\n citationTypes.some((citationType) => type?.includes(citationType))\n );\n }) ?? null\n );\n};\n\nexport const useOnDemandCitationFetch = ({\n msg,\n citationType,\n citationNumber,\n enabled = false,\n accessToken,\n baseUrl,\n orgName,\n citationAssistantProcessingName,\n citationAgentName,\n}: UseOnDemandCitationFetchParams) => {\n const requestId = msg?.requestId || msg?.id || '';\n const citationTypesForMatching = useMemo(() => getCitationTypeCandidates(citationType), [citationType]);\n const citationTypeForRequest = (() => {\n switch (citationType) {\n case 'artifact_chunks': return 'scanned_doc_citation';\n case 'rai_artifact_citation': return 'rai_artifact_citation';\n case 'scanned_doc_citations': return 'scanned_doc_citation';\n default: return citationType;\n }\n })();\n\n\t// Each (requestId, citationType, citationNumber) triple gets its own cache entry\n\tconst queryKey =msg?.isEcgPayloadActive ? useMemo(\n\t () => ['onDemandCitationFetch', requestId, citationTypeForRequest, msg?.customCitationId, msg?.ecg_agent_name],\n\t [requestId, citationTypeForRequest, msg?.customCitationId, msg?.ecg_agent_name]) \n\t : useMemo(\n\t () => ['onDemandCitationFetch', requestId, citationTypeForRequest, citationType === 'gpt_citation' ? msg?.id : citationNumber],\n\t [requestId, citationTypeForRequest, citationNumber]\n\t);\n\n // If the citation already exists on the message, no need to fetch\n const existingCitation = useMemo(\n () => findCitation(msg?.citations, citationTypesForMatching, citationNumber),\n [msg?.citations, citationTypesForMatching, citationNumber]\n );\n\n const shouldFetch = Boolean(enabled && requestId && citationTypeForRequest && baseUrl && orgName && !Number.isNaN(citationNumber) && !existingCitation);\n const token = accessToken;\n const isMessageComplete = msg?.isStreamEnd === true;\n\n const query = useQuery<OnDemandCitationPayload>({\n queryKey,\n queryFn: async () => {\n if (!token || !token.trim()) {\n console.warn('[useOnDemandCitationFetch] no accessToken passed in props');\n }\n const response = await fetchOnDemandCitation(\n requestId,\n citationTypeForRequest,\n citationNumber,\n msg?.content ?? '',\n token,\n baseUrl,\n citationAssistantProcessingName ?? '',\n orgName,\n citationAgentName ?? '',\n msg?.isEcgPayloadActive ?? false,\n (typeof msg?.isReqPayloadActive === 'boolean' ? msg.isReqPayloadActive : false),\n msg?.ecg_agent_name ?? '',\n msg?.customCitationId ?? '',\n msg?.plan_id ?? '',\n msg?.ui_chat_history ?? undefined,\n msg?.mmvf_list ?? undefined,\n Array.isArray(msg?.files) ? msg.files : [],\n (typeof msg?.metadata === 'string' && msg.metadata.trim()) ? msg.metadata : '',\n msg?.checkPossibleCitationPayload,\n msg?.ui_request_body\n );\n\n if (response.error || !response.responseData) {\n throw new Error(response.error?.errorMessage || 'Failed to fetch on-demand citation');\n }\n\n return response.responseData;\n },\n enabled: shouldFetch && isMessageComplete && Boolean(msg?.content),\n staleTime: Infinity,\n gcTime: Infinity,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n retry: false,\n });\n const fetchedCitation = useMemo(() => {\n const citations = query.data?.result?.citations ?? [];\n if (!Array.isArray(citations) || citations.length === 0) return null;\n\n if (msg?.customCitationId) {\n return (\n citations.find((c: any) => {\n const title = c?.title ?? c?.display_name ?? '';\n return typeof title === 'string' && title.includes(msg.customCitationId);\n }) ?? citations[0] ?? null\n );\n }\n\n return (\n findCitation(citations, citationTypesForMatching, citationNumber) ??\n citations[0] ??\n null\n );\n}, [msg?.customCitationId, citationNumber, citationTypesForMatching, query.data]);\n const resolvedCitation = existingCitation ?? fetchedCitation;\n\n return {\n citation: resolvedCitation,\n isFetching: query.isFetching,\n isLoading: query.isLoading,\n isComplete: query.isSuccess,\n status: query.status,\n refetch: query.refetch,\n };\n};\n"],"names":["findCitation","citations","citationTypes","citationNumber","Array","isArray","length","Number","isNaN","console","warn","find","citation","type","customMetaData","customMetadata","getCitationType","citation_number","getCitationNumber","toString","some","citationType","includes","msg","enabled","accessToken","baseUrl","orgName","citationAssistantProcessingName","citationAgentName","requestId","id","citationTypesForMatching","useMemo","getCitationTypeCandidates","citationTypeForRequest","queryKey","isEcgPayloadActive","customCitationId","ecg_agent_name","existingCitation","shouldFetch","Boolean","token","isMessageComplete","isStreamEnd","query","useQuery","queryFn","async","trim","response","fetchOnDemandCitation","content","isReqPayloadActive","plan_id","ui_chat_history","mmvf_list","files","metadata","checkPossibleCitationPayload","ui_request_body","error","responseData","Error","errorMessage","staleTime","Infinity","gcTime","refetchOnMount","refetchOnWindowFocus","retry","fetchedCitation","data","result","c","title","display_name","isFetching","isLoading","isComplete","isSuccess","status","refetch"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("axios"),r=require("./apicache.service.js"),t=require("../types/onDemandApi.types.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=a(e);const o=72e5,n=e=>{if(!e||"object"!=typeof e)return;const r=e;return"string"==typeof r.message?r.message:"string"==typeof r.errorMessage?r.errorMessage:"string"==typeof r.error?r.error:r.error&&"object"==typeof r.error&&"string"==typeof r.error.message?r.error.message:"string"==typeof r.details?r.details:r},i=async e=>{if(s.default.isAxiosError(e)){const r=e;if("ECONNABORTED"===r.code)return{type:t.NetworkErrorType.TIMEOUT,message:"The request took too long to complete. Please try again.",originalError:e};if(r.message.includes("net::ERR_NETWORK_CHANGED")||r.message.includes("net::ERR_INTERNET_DISCONNECTED")||r.message.includes("net::ERR_NAME_NOT_RESOLVED"))return{type:t.NetworkErrorType.INTERNET_DISCONNECTED,message:"Internet connection issue detected. Please check your network.",originalError:e};if(r.message.includes("Network Error")||"ERR_NETWORK"===r.code||r.message.includes("net::ERR_CONNECTION_REFUSED")||r.message.includes("net::ERR_EMPTY_RESPONSE"))return{type:t.NetworkErrorType.SERVER_UNREACHABLE,message:"Unable to connect to server. The service may be down or unreachable.",originalError:e};if(r.response&&r.response.status>=500)return{type:t.NetworkErrorType.SERVER_ERROR,message:`Service Unavailable. Server error (${r.response.status}).`,status:r.response.status,originalError:e};if(r.response&&r.response.status>=400&&r.response.status<500)return{type:t.NetworkErrorType.SERVER_ERROR,message:n(r.response.data)||`Request failed with status code ${r.response.status}`,status:r.response.status,originalError:e}}return{type:t.NetworkErrorType.UNKNOWN_ERROR,message:"An unexpected error occurred. Please try again later.",originalError:e}},c=(e,r=18e4)=>{const t=s.default.create({baseURL:e,timeout:r});return t.interceptors.request.use(async e=>e,async e=>{const r=await i(e);return Promise.reject(r)}),t.interceptors.response.use(e=>e,async e=>{const r=await i(e);return console.error("API Request Failed:",r),Promise.reject(r)}),t},p=(e,r,t)=>`${e}:${r}:${JSON.stringify(t||{})}`,u=c(),l=async(e,r,a)=>{try{const t=a?.baseURL?c(a.baseURL):u,{data:s,config:o}=a||{};let n;switch(e.toLowerCase()){case"get":n=await t.get(r,o);break;case"post":n=await t.post(r,s,o);break;case"put":n=await t.put(r,s,o);break;case"patch":n=await t.patch(r,s,o);break;case"delete":const a={...o,data:s};n=await t.delete(r,a);break;default:throw new Error(`Unsupported method: ${e}`)}return{responseData:n.data,error:null}}catch(e){if(e.type&&Object.values(t.NetworkErrorType).includes(e.type))return{responseData:null,error:e};return{responseData:null,error:await i(e)}}},E=async(e,a,s)=>{const{data:n,params:i,config:c,errorMessage:u,baseURL:E,cacheOption:y,shouldCache:d}=s||{},g=y?.ttl??o,_=y?.key||p(e,a,i);if(!y?.forceRefresh&&!y?.skipCache){const e=await r.apiCache.get(_);if(e)return{responseData:e.data,error:null,cacheMeta:{isFromCache:!0,timestamp:e.timestamp,ttl:e.ttl,cacheKey:_}}}const m={...c,...i&&{params:i}},R=await l(e,a,{data:n,config:m,baseURL:E});return!y?.skipCache&&null!=R.responseData&&(!d||d(R.responseData))&&await r.apiCache.set(_,R.responseData,g),{responseData:R.responseData,error:R.error?{errorMessage:R.error.type===t.NetworkErrorType.INTERNET_DISCONNECTED||R.error.type===t.NetworkErrorType.SLOW_CONNECTION||R.error.type===t.NetworkErrorType.TIMEOUT?R.error.message:R.error.type===t.NetworkErrorType.SERVER_UNREACHABLE?"Unable to connect to server. Please try again later.":u||R.error.message,errorObjData:R.error}:null,cacheMeta:{isFromCache:!1,timestamp:Date.now(),ttl:g,cacheKey:_}}};exports.NetworkErrorType=t.NetworkErrorType,exports.DEFAULT_CACHE_TTL=o,exports.createApiInstance=c,exports.fetchOnDemandCitation=async(e,r,t,a,s,o,n,i,c,p,u,l,y,d,g,_,m,R,N,h)=>{const f="artifact_chunks"===r||"scanned_doc_citation"===r?"artifact_chunks":r,T="gpt_citation"===r?"string"==typeof h?.citationId?h.citationId:"":p?y:`${f}_${t}`,w="post",k="/api/chat/chatResponse";return E(w,k,{baseURL:o,data:{name:n||"citationsprocessing",organizationName:i,prompt:"",useAgent:{agent_name:c||"ProcessCitationsAgent",metadata:u?R:void 0,arguments:{citation_type:r,is_primary_agent_request:!1,...p&&{check_possible_citation_payload:!1},..."boolean"==typeof N&&{check_possible_citation_payload:N},ui_request_body:{llm_formatted_response:a,request_id:e,max_concurrent_citations:10,citation_id:T,...p&&l&&{ecg_agent_name:l},...p&&d&&{plan_id:d},...p&&g&&{ui_chat_history:g},...u&&_&&{mmvf_list:_},...u&&m&&{files:m},...h&&"object"==typeof h&&!Array.isArray(h)&&h}}}},config:{headers:{"Content-Type":"application/json"},withCredentials:!0},errorMessage:"Failed to fetch on-demand citation",cacheOption:{key:`${w}:${k}:onDemandCitation:${e}:${r}:${p?y:t}:${p?l:""}:${"gpt_citation"===r?T:""}`},shouldCache:e=>Array.isArray(e?.result?.citations)&&Boolean(e.result.citations[0])})},exports.generateCacheKey=p,exports.makeApiRequest=l,exports.makeApiRequestWithTTLCache=E;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("axios"),r=require("./apicache.service.js"),t=require("../types/onDemandApi.types.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=a(e);const o=72e5,n=e=>{if(!e||"object"!=typeof e)return;const r=e;return"string"==typeof r.message?r.message:"string"==typeof r.errorMessage?r.errorMessage:"string"==typeof r.error?r.error:r.error&&"object"==typeof r.error&&"string"==typeof r.error.message?r.error.message:"string"==typeof r.details?r.details:r},i=async e=>{if(s.default.isAxiosError(e)){const r=e;if("ECONNABORTED"===r.code)return{type:t.NetworkErrorType.TIMEOUT,message:"The request took too long to complete. Please try again.",originalError:e};if(r.message.includes("net::ERR_NETWORK_CHANGED")||r.message.includes("net::ERR_INTERNET_DISCONNECTED")||r.message.includes("net::ERR_NAME_NOT_RESOLVED"))return{type:t.NetworkErrorType.INTERNET_DISCONNECTED,message:"Internet connection issue detected. Please check your network.",originalError:e};if(r.message.includes("Network Error")||"ERR_NETWORK"===r.code||r.message.includes("net::ERR_CONNECTION_REFUSED")||r.message.includes("net::ERR_EMPTY_RESPONSE"))return{type:t.NetworkErrorType.SERVER_UNREACHABLE,message:"Unable to connect to server. The service may be down or unreachable.",originalError:e};if(r.response&&r.response.status>=500)return{type:t.NetworkErrorType.SERVER_ERROR,message:`Service Unavailable. Server error (${r.response.status}).`,status:r.response.status,originalError:e};if(r.response&&r.response.status>=400&&r.response.status<500)return{type:t.NetworkErrorType.SERVER_ERROR,message:n(r.response.data)||`Request failed with status code ${r.response.status}`,status:r.response.status,originalError:e}}return{type:t.NetworkErrorType.UNKNOWN_ERROR,message:"An unexpected error occurred. Please try again later.",originalError:e}},c=(e,r=18e4)=>{const t=s.default.create({baseURL:e,timeout:r});return t.interceptors.request.use(async e=>e,async e=>{const r=await i(e);return Promise.reject(r)}),t.interceptors.response.use(e=>e,async e=>{const r=await i(e);return console.error("API Request Failed:",r),Promise.reject(r)}),t},p=(e,r,t)=>`${e}:${r}:${JSON.stringify(t||{})}`,u=c(),l=async(e,r,a)=>{try{const t=a?.baseURL?c(a.baseURL):u,{data:s,config:o}=a||{};let n;switch(e.toLowerCase()){case"get":n=await t.get(r,o);break;case"post":n=await t.post(r,s,o);break;case"put":n=await t.put(r,s,o);break;case"patch":n=await t.patch(r,s,o);break;case"delete":const a={...o,data:s};n=await t.delete(r,a);break;default:throw new Error(`Unsupported method: ${e}`)}return{responseData:n.data,error:null}}catch(e){if(e.type&&Object.values(t.NetworkErrorType).includes(e.type))return{responseData:null,error:e};return{responseData:null,error:await i(e)}}},E=async(e,a,s)=>{const{data:n,params:i,config:c,errorMessage:u,baseURL:E,cacheOption:y,shouldCache:d}=s||{},g=y?.ttl??o,_=y?.key||p(e,a,i);if(!y?.forceRefresh&&!y?.skipCache){const e=await r.apiCache.get(_);if(e)return{responseData:e.data,error:null,cacheMeta:{isFromCache:!0,timestamp:e.timestamp,ttl:e.ttl,cacheKey:_}}}const m={...c,...i&&{params:i}},R=await l(e,a,{data:n,config:m,baseURL:E});return!y?.skipCache&&null!=R.responseData&&(!d||d(R.responseData))&&await r.apiCache.set(_,R.responseData,g),{responseData:R.responseData,error:R.error?{errorMessage:R.error.type===t.NetworkErrorType.INTERNET_DISCONNECTED||R.error.type===t.NetworkErrorType.SLOW_CONNECTION||R.error.type===t.NetworkErrorType.TIMEOUT?R.error.message:R.error.type===t.NetworkErrorType.SERVER_UNREACHABLE?"Unable to connect to server. Please try again later.":u||R.error.message,errorObjData:R.error}:null,cacheMeta:{isFromCache:!1,timestamp:Date.now(),ttl:g,cacheKey:_}}};exports.NetworkErrorType=t.NetworkErrorType,exports.DEFAULT_CACHE_TTL=o,exports.createApiInstance=c,exports.fetchOnDemandCitation=async(e,r,t,a,s,o,n,i,c,p,u,l,y,d,g,_,m,R,N,h)=>{const f="artifact_chunks"===r||"scanned_doc_citation"===r?"artifact_chunks":r,T="gpt_citation"===r?"string"==typeof h?.citationId?h.citationId:"":p?y:`${f}_${t}`,w="post",k="/api/chat/chatResponse";return E(w,k,{baseURL:o,data:{name:n||"citationsprocessing",organizationName:i,prompt:"",useAgent:{agent_name:c||"ProcessCitationsAgent",metadata:u?R:void 0,arguments:{citation_type:r,is_primary_agent_request:!1,...p&&{check_possible_citation_payload:!1},..."boolean"==typeof N&&{check_possible_citation_payload:N},ui_request_body:{llm_formatted_response:a,request_id:e,max_concurrent_citations:10,citation_id:T,...p&&l&&{ecg_agent_name:l},...p&&d&&{plan_id:d},...p&&g&&{ui_chat_history:g},...u&&_&&{mmvf_list:_},...u&&m&&{files:m},...h&&"object"==typeof h&&!Array.isArray(h)&&h}}}},config:{headers:{"Content-Type":"application/json",...s&&s.trim()&&{Authorization:`Bearer ${s}`}},withCredentials:!0},errorMessage:"Failed to fetch on-demand citation",cacheOption:{key:`${w}:${k}:onDemandCitation:${e}:${r}:${p?y:t}:${p?l:""}:${"gpt_citation"===r?T:""}`},shouldCache:e=>Array.isArray(e?.result?.citations)&&Boolean(e.result.citations[0])})},exports.generateCacheKey=p,exports.makeApiRequest=l,exports.makeApiRequestWithTTLCache=E;
|
|
2
2
|
//# sourceMappingURL=onDemandApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onDemandApi.js","sources":["../../../src/service/onDemandApi.ts"],"sourcesContent":["\nimport axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { apiCache } from \"./apicache.service\";\nimport { NetworkErrorType } from \"../types/onDemandApi.types\";\nimport type {\n NetworkError,\n CachedAPIResponse,\n CacheOptions,\n OnDemandCitationFetchApiResponse,\n UIMediaValidationFeedbackItem,\n} from \"../types/onDemandApi.types\";\n\nexport { NetworkErrorType } from \"../types/onDemandApi.types\";\nexport type {\n NetworkError,\n ApiError,\n StandardAPIResponse,\n CachedAPIResponse,\n OnDemandCitationFetchResponse,\n OnDemandCitationFetchApiResponse,\n CacheOptions,\n} from \"../types/onDemandApi.types\";\n\nexport const DEFAULT_CACHE_TTL = 1000 * 60 * 60 * 2;\n\n\n// on-demand citation fetch — single-shot request that returns the final citations directly\nexport const fetchOnDemandCitation = async (\n requestId: string,\n citationType: string,\n citationNumber: number,\n llmFormattedResponse: string,\n token: string,\n baseUrl:string,\n citationAssistantProcessingName:string,\n orgName:string,\n citationAgentName:string,\n isEcgPayloadActive:boolean,\n isReqPayloadActive:boolean,\n ecg_agent_name:string,\n customCitationId:string, \n plan_id:string,\n ui_chat_history?: any,\n mmvf_list?:UIMediaValidationFeedbackItem[],\n files?: string[],\n metadata?:string,\n checkPossibleCitationPayload?: boolean,\n uiRequestBody?: Record<string, unknown>\n): Promise<CachedAPIResponse<any>> => {\n\n // if(!token || !token.trim()) {\n // throw new Error('Authorization token is required to fetch on-demand citation');\n // }\n\n const normalizedCitationType = citationType === \"artifact_chunks\" || citationType === \"scanned_doc_citation\" ? \"artifact_chunks\" : citationType;\n const citationId =\n citationType === 'gpt_citation'\n ? (typeof uiRequestBody?.citationId === 'string' ? uiRequestBody.citationId : '')\n : isEcgPayloadActive\n ? customCitationId\n : `${normalizedCitationType}_${citationNumber}`;\n \n const method = 'post';\n const endpoint = '/api/chat/chatResponse';\n\n\n return makeApiRequestWithTTLCache<CachedAPIResponse<any>>(\n method,\n endpoint,\n {\n baseURL: baseUrl,\n data: {\n name: citationAssistantProcessingName || 'citationsprocessing',\n organizationName: orgName,\n prompt: '',\n useAgent: {\n agent_name: citationAgentName || 'ProcessCitationsAgent',\n metadata: isReqPayloadActive ? metadata : undefined,\n arguments: {\n citation_type: citationType,\n is_primary_agent_request: false,\n ...(isEcgPayloadActive && {check_possible_citation_payload : false}),\n ...(typeof checkPossibleCitationPayload === 'boolean' && {check_possible_citation_payload: checkPossibleCitationPayload,}),\n ui_request_body: {\n llm_formatted_response: llmFormattedResponse,\n request_id: requestId,\n max_concurrent_citations: 10,\n citation_id: citationId,\n ...(isEcgPayloadActive && ecg_agent_name && {ecg_agent_name}),\n ...(isEcgPayloadActive && plan_id && {plan_id}),\n ...(isEcgPayloadActive && ui_chat_history && {ui_chat_history}),\n ...(isReqPayloadActive && mmvf_list && {mmvf_list}),\n ...(isReqPayloadActive && files && {files}),\n ...(uiRequestBody && typeof uiRequestBody === 'object' && !Array.isArray(uiRequestBody) && uiRequestBody),\n },\n },\n },\n },\n config: {\n headers: {\n 'Content-Type': 'application/json',\n },\n withCredentials: true,\n },\n errorMessage: 'Failed to fetch on-demand citation',\n cacheOption: {\n key: `${method}:${endpoint}:onDemandCitation:${requestId}:${citationType}:${\n isEcgPayloadActive ? customCitationId : citationNumber\n }:${\n isEcgPayloadActive ? ecg_agent_name : ''\n }:${citationType === \"gpt_citation\" ? citationId : ''}`,\n },\n shouldCache: (responseData) => Array.isArray(responseData?.result?.citations) && Boolean(responseData.result.citations[0]),\n }\n );\n};\n\n// legacy on-demand citation fetch — kept for older polling flows that still read from Redis\nexport const getOnDemandCitation = async (\n requestId: string,\n citationType: string,\n citationNumber: number,\n token:string,\n baseUrl:string\n): Promise<OnDemandCitationFetchApiResponse> => {\n return makeApiRequestWithTTLCache<OnDemandCitationFetchApiResponse>(\n 'get',\n '/api/redis/get-single-citations-data',\n {\n baseURL:baseUrl,\n config: {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n params: { request_id: `CitationAgent_${requestId}`, citation_type: citationType, citation_number: citationNumber },\n errorMessage: 'Failed to fetch on-demand citation',\n cacheOption: { ttl: Infinity },\n shouldCache: (data) => data.status === 'ready',\n }\n );\n};\n\nconst extractErrorMessage = (data: unknown): string | undefined => {\n if (!data || typeof data !== 'object') {\n return undefined;\n }\n // Cast to any to avoid TypeScript errors while checking properties\n const errorData = data as any;\n \n // Check for common error message patterns\n if (typeof errorData.message === 'string') {\n return errorData.message;\n }\n \n if (typeof errorData.errorMessage === 'string') {\n return errorData.errorMessage;\n }\n \n if (typeof errorData.error === 'string') {\n return errorData.error;\n }\n \n if (errorData.error && typeof errorData.error === 'object' && typeof errorData.error.message === 'string') {\n return errorData.error.message;\n }\n \n if (typeof errorData.details === 'string') {\n return errorData.details;\n }\n \n return errorData;\n};\n\n\n\n// Helper function to determine error type\nconst determineNetworkErrorType = async (error: any): Promise<NetworkError> => {\n // Check if there's an internet connection first\n // commented out\n // const isConnected = await checkInternetConnection();\n \n // if (!isConnected) {\n // return {\n // type: NetworkErrorType.INTERNET_DISCONNECTED,\n // message: 'No internet connection. Please check your network.',\n // originalError: error,\n // };\n // }\n\n // Axios specific error handling\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n \n // Check for timeout\n if (axiosError.code === 'ECONNABORTED') {\n return {\n type: NetworkErrorType.TIMEOUT,\n message: 'The request took too long to complete. Please try again.',\n originalError: error,\n };\n }\n \n // Client connectivity issues - internet problems detected via error message\n if (axiosError.message.includes('net::ERR_NETWORK_CHANGED') ||\n axiosError.message.includes('net::ERR_INTERNET_DISCONNECTED') ||\n axiosError.message.includes('net::ERR_NAME_NOT_RESOLVED')) {\n return {\n type: NetworkErrorType.INTERNET_DISCONNECTED,\n message: 'Internet connection issue detected. Please check your network.',\n originalError: error,\n };\n }\n \n // Server connectivity issues - server is likely down\n if (axiosError.message.includes('Network Error') || \n axiosError.code === 'ERR_NETWORK' ||\n axiosError.message.includes('net::ERR_CONNECTION_REFUSED') ||\n axiosError.message.includes('net::ERR_EMPTY_RESPONSE')) {\n return {\n type: NetworkErrorType.SERVER_UNREACHABLE,\n message: 'Unable to connect to server. The service may be down or unreachable.',\n originalError: error,\n };\n }\n \n // Server errors (500 range)\n if (axiosError.response && axiosError.response.status >= 500) {\n return {\n type: NetworkErrorType.SERVER_ERROR,\n message: `Service Unavailable. Server error (${axiosError.response.status}).`,\n status: axiosError.response.status,\n originalError: error,\n };\n }\n \n // Client errors (400 range) - these are expected errors\n if (axiosError.response && axiosError.response.status >= 400 && axiosError.response.status < 500) {\n return {\n type: NetworkErrorType.SERVER_ERROR,\n message: extractErrorMessage(axiosError.response.data) || \n `Request failed with status code ${axiosError.response.status}`,\n status: axiosError.response.status,\n originalError: error,\n };\n }\n }\n \n // Default case - unknown error\n return {\n type: NetworkErrorType.UNKNOWN_ERROR,\n message: 'An unexpected error occurred. Please try again later.',\n originalError: error,\n };\n};\n\nexport const createApiInstance = (baseURL?: string, timeout: number = 180000): AxiosInstance => { // 3 mins timeout\n // Create a custom axios instance with interceptors and timeout\n const apiInstance = axios.create({\n baseURL: baseURL,\n timeout: timeout, // Default to 3 mins timeout\n });\n\n // Set up request interceptor for adding headers, etc.\n apiInstance.interceptors.request.use(\n async (config) => {\n \n return config;\n },\n async (error) => {\n const networkError = await determineNetworkErrorType(error);\n return Promise.reject(networkError);\n }\n );\n\n // Set up response interceptor for handling errors\n apiInstance.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n async (error: any) => {\n const networkError = await determineNetworkErrorType(error);\n \n // Log errors (you might want to send them to a monitoring service)\n console.error('API Request Failed:', networkError);\n \n // You can also dispatch actions to a global state manager (Redux, etc.)\n // store.dispatch(setNetworkError(networkError));\n \n return Promise.reject(networkError);\n }\n );\n\n return apiInstance;\n};\n\nexport const generateCacheKey = (\n method: string,\n url: string,\n params?: any\n) => `${method}:${url}:${JSON.stringify(params || {})}`;\n\nconst defaultApi = createApiInstance();\n\n\nexport const makeApiRequest = async <T>(\n method: string,\n url: string,\n options?: {\n data?: any,\n config?: AxiosRequestConfig,\n baseURL?: string\n }\n): Promise<{ \n responseData: T | null;\n error: NetworkError | null;\n}> => {\n try {\n // Determine which API instance to use\n const apiInstance = options?.baseURL \n ? createApiInstance(options.baseURL)\n : defaultApi;\n \n const { data, config } = options || {};\n \n let response;\n switch (method.toLowerCase()) {\n case 'get':\n response = await apiInstance.get<T>(url, config);\n break;\n case 'post':\n response = await apiInstance.post<T>(url, data, config);\n break;\n case 'put':\n response = await apiInstance.put<T>(url, data, config);\n break;\n case 'patch':\n response = await apiInstance.patch<T>(url, data, config);\n break;\n case 'delete':\n const deleteConfig = {\n ...config,\n data: data\n };\n response = await apiInstance.delete<T>(url, deleteConfig);\n break;\n default:\n throw new Error(`Unsupported method: ${method}`);\n }\n \n return {\n responseData: response.data,\n error: null,\n };\n } catch (error: any) {\n // The error should already be processed by our interceptor\n if (error.type && Object.values(NetworkErrorType).includes(error.type)) {\n return {\n responseData: null,\n error: error as NetworkError,\n };\n }\n \n // Fallback for unhandled errors\n const networkError = await determineNetworkErrorType(error);\n return {\n responseData: null,\n error: networkError,\n };\n }\n};\n\nexport const makeApiRequestWithTTLCache = async <\n ResponseType extends CachedAPIResponse<any>\n>(\n method: string,\n url: string,\n options?: {\n data?: any;\n params?: any;\n config?: AxiosRequestConfig;\n errorMessage?: string;\n baseURL?: string;\n cacheOption?: CacheOptions;\n // return false to skip writing to cache for this response; defaults to caching all successful responses\n shouldCache?: (responseData: NonNullable<ResponseType['responseData']>) => boolean;\n }\n): Promise<ResponseType> => {\n type ExpectedDataType = NonNullable<ResponseType['responseData']>;\n\n const { data, params, config, errorMessage, baseURL, cacheOption, shouldCache } =\n options || {};\n\n const ttl = cacheOption?.ttl ?? DEFAULT_CACHE_TTL;\n const cacheKey =\n cacheOption?.key || generateCacheKey(method, url, params);\n\n // 1. Try cache\n if (!cacheOption?.forceRefresh && !cacheOption?.skipCache) {\n const cached = await apiCache.get<ExpectedDataType>(cacheKey);\n\n if (cached) {\n return {\n responseData: cached.data,\n error: null,\n cacheMeta: {\n isFromCache: true,\n timestamp: cached.timestamp,\n ttl: cached.ttl,\n cacheKey,\n },\n } as ResponseType;\n }\n }\n\n // 2. Prepare config\n const mergedConfig: AxiosRequestConfig = {\n ...config,\n ...(params && { params }),\n };\n\n // 3. Call API\n const result = await makeApiRequest<ExpectedDataType>(method, url, {\n data,\n config: mergedConfig,\n baseURL,\n });\n\n // 4. Store in cache — skipped if cacheOption.skipCache is set, or if shouldCache returns false\n const allowWrite =\n !cacheOption?.skipCache &&\n result.responseData != null &&\n (shouldCache ? shouldCache(result.responseData) : true);\n\n if (allowWrite) {\n await apiCache.set(cacheKey, result.responseData, ttl);\n }\n\n // 5. Return SAME structure as before + cacheMeta\n return {\n responseData: result.responseData,\n error: result.error\n ? {\n errorMessage:\n result.error.type === NetworkErrorType.INTERNET_DISCONNECTED ||\n result.error.type === NetworkErrorType.SLOW_CONNECTION ||\n result.error.type === NetworkErrorType.TIMEOUT\n ? result.error.message\n : result.error.type === NetworkErrorType.SERVER_UNREACHABLE\n ? \"Unable to connect to server. Please try again later.\"\n : errorMessage || result.error.message,\n errorObjData: result.error,\n }\n : null,\n cacheMeta: {\n isFromCache: false,\n timestamp: Date.now(),\n ttl,\n cacheKey,\n },\n } as ResponseType;\n};\n"],"names":["DEFAULT_CACHE_TTL","extractErrorMessage","data","errorData","message","errorMessage","error","details","determineNetworkErrorType","async","axios","isAxiosError","axiosError","code","type","NetworkErrorType","TIMEOUT","originalError","includes","INTERNET_DISCONNECTED","SERVER_UNREACHABLE","response","status","SERVER_ERROR","UNKNOWN_ERROR","createApiInstance","baseURL","timeout","apiInstance","create","interceptors","request","use","config","networkError","Promise","reject","console","generateCacheKey","method","url","params","JSON","stringify","defaultApi","makeApiRequest","options","toLowerCase","get","post","put","patch","deleteConfig","delete","Error","responseData","Object","values","makeApiRequestWithTTLCache","cacheOption","shouldCache","ttl","cacheKey","key","forceRefresh","skipCache","cached","apiCache","cacheMeta","isFromCache","timestamp","mergedConfig","result","set","SLOW_CONNECTION","errorObjData","Date","now","requestId","citationType","citationNumber","llmFormattedResponse","token","baseUrl","citationAssistantProcessingName","orgName","citationAgentName","isEcgPayloadActive","isReqPayloadActive","ecg_agent_name","customCitationId","plan_id","ui_chat_history","mmvf_list","files","metadata","checkPossibleCitationPayload","uiRequestBody","normalizedCitationType","citationId","endpoint","name","organizationName","prompt","useAgent","agent_name","arguments","citation_type","is_primary_agent_request","check_possible_citation_payload","ui_request_body","llm_formatted_response","request_id","max_concurrent_citations","citation_id","Array","isArray","headers","withCredentials","citations","Boolean"],"mappings":"4PAuBa,MAAAA,EAAoB,KAwH3BC,EAAuBC,IAC3B,IAAKA,GAAwB,iBAATA,EACX,OAGT,MAAMC,EAAYD,EAGd,MAA6B,iBAAtBC,EAAUC,QACZD,EAAUC,QAGmB,iBAA3BD,EAAUE,aACZF,EAAUE,aAGY,iBAApBF,EAAUG,MACZH,EAAUG,MAGfH,EAAUG,OAAoC,iBAApBH,EAAUG,OAAyD,iBAA5BH,EAAUG,MAAMF,QAC5ED,EAAUG,MAAMF,QAGQ,iBAAtBD,EAAUI,QACZJ,EAAUI,QAGZJ,GAMHK,EAA4BC,MAAOH,IAcnC,GAAAI,EAAA,QAAMC,aAAaL,GAAQ,CAC7B,MAAMM,EAAaN,EAGf,GAAoB,iBAApBM,EAAWC,KACN,MAAA,CACLC,KAAMC,EAAiBA,iBAAAC,QACvBZ,QAAS,2DACTa,cAAeX,GAKnB,GAAIM,EAAWR,QAAQc,SAAS,6BAC5BN,EAAWR,QAAQc,SAAS,mCAC5BN,EAAWR,QAAQc,SAAS,8BACvB,MAAA,CACLJ,KAAMC,EAAiBA,iBAAAI,sBACvBf,QAAS,iEACTa,cAAeX,GAKnB,GAAIM,EAAWR,QAAQc,SAAS,kBACR,gBAApBN,EAAWC,MACXD,EAAWR,QAAQc,SAAS,gCAC5BN,EAAWR,QAAQc,SAAS,2BACvB,MAAA,CACLJ,KAAMC,EAAiBA,iBAAAK,mBACvBhB,QAAS,uEACTa,cAAeX,GAKnB,GAAIM,EAAWS,UAAYT,EAAWS,SAASC,QAAU,IAChD,MAAA,CACLR,KAAMC,EAAiBA,iBAAAQ,aACvBnB,QAAS,sCAAsCQ,EAAWS,SAASC,WACnEA,OAAQV,EAAWS,SAASC,OAC5BL,cAAeX,GAKf,GAAAM,EAAWS,UAAYT,EAAWS,SAASC,QAAU,KAAOV,EAAWS,SAASC,OAAS,IACpF,MAAA,CACLR,KAAMC,EAAiBA,iBAAAQ,aACvBnB,QAASH,EAAoBW,EAAWS,SAASnB,OACjD,mCAAmCU,EAAWS,SAASC,SACvDA,OAAQV,EAAWS,SAASC,OAC5BL,cAAeX,EAGrB,CAGO,MAAA,CACLQ,KAAMC,EAAiBA,iBAAAS,cACvBpB,QAAS,wDACTa,cAAeX,IAINmB,EAAoB,CAACC,EAAkBC,EAAkB,QAE9D,MAAAC,EAAclB,UAAMmB,OAAO,CAC/BH,UACAC,YAiCK,OA7BPC,EAAYE,aAAaC,QAAQC,IAC/BvB,MAAOwB,GAEEA,EAETxB,MAAOH,IACC,MAAA4B,QAAqB1B,EAA0BF,GAC9C,OAAA6B,QAAQC,OAAOF,KAK1BN,EAAYE,aAAaT,SAASW,IAC/BX,GACQA,EAETZ,MAAOH,IACC,MAAA4B,QAAqB1B,EAA0BF,GAQ9C,OALC+B,QAAA/B,MAAM,sBAAuB4B,GAK9BC,QAAQC,OAAOF,KAInBN,GAGIU,EAAmB,CAC9BC,EACAC,EACAC,IACG,GAAGF,KAAUC,KAAOE,KAAKC,UAAUF,GAAU,CAAA,KAE5CG,EAAanB,IAGNoB,EAAiBpC,MAC5B8B,EACAC,EACAM,KASI,IAEF,MAAMlB,EAAckB,GAASpB,QACzBD,EAAkBqB,EAAQpB,SAC1BkB,GAEE1C,KAAEA,EAAA+B,OAAMA,GAAWa,GAAW,CAAA,EAEhC,IAAAzB,EACI,OAAAkB,EAAOQ,eACb,IAAK,MACH1B,QAAiBO,EAAYoB,IAAOR,EAAKP,GACzC,MACF,IAAK,OACHZ,QAAiBO,EAAYqB,KAAQT,EAAKtC,EAAM+B,GAChD,MACF,IAAK,MACHZ,QAAiBO,EAAYsB,IAAOV,EAAKtC,EAAM+B,GAC/C,MACF,IAAK,QACHZ,QAAiBO,EAAYuB,MAASX,EAAKtC,EAAM+B,GACjD,MACF,IAAK,SACH,MAAMmB,EAAe,IAChBnB,EACH/B,QAEFmB,QAAiBO,EAAYyB,OAAUb,EAAKY,GAC5C,MACF,QACE,MAAM,IAAIE,MAAM,uBAAuBf,KAGpC,MAAA,CACLgB,aAAclC,EAASnB,KACvBI,MAAO,YAEFA,GAEH,GAAAA,EAAMQ,MAAQ0C,OAAOC,OAAO1C,EAAgBA,kBAAEG,SAASZ,EAAMQ,MACxD,MAAA,CACLyC,aAAc,KACdjD,SAMG,MAAA,CACLiD,aAAc,KACdjD,YAHyBE,EAA0BF,GAKvD,GAGWoD,EAA6BjD,MAGxC8B,EACAC,EACAM,KAaM,MAAA5C,KAAEA,EAAMuC,OAAAA,EAAAR,OAAQA,EAAQ5B,aAAAA,EAAAqB,QAAcA,cAASiC,EAAaC,YAAAA,GAChEd,GAAW,GAEPe,EAAMF,GAAaE,KAAO7D,EAC1B8D,EACJH,GAAaI,KAAOzB,EAAiBC,EAAQC,EAAKC,GAGpD,IAAKkB,GAAaK,eAAiBL,GAAaM,UAAW,CACzD,MAAMC,QAAeC,EAAAA,SAASnB,IAAsBc,GAEpD,GAAII,EACK,MAAA,CACLX,aAAcW,EAAOhE,KACrBI,MAAO,KACP8D,UAAW,CACTC,aAAa,EACbC,UAAWJ,EAAOI,UAClBT,IAAKK,EAAOL,IACZC,YAIR,CAGA,MAAMS,EAAmC,IACpCtC,KACCQ,GAAU,CAAEA,WAIZ+B,QAAe3B,EAAiCN,EAAQC,EAAK,CACjEtC,OACA+B,OAAQsC,EACR7C,YAcK,OATJiC,GAAaM,WACS,MAAvBO,EAAOjB,gBACNK,GAAcA,EAAYY,EAAOjB,sBAG5BY,EAAAA,SAASM,IAAIX,EAAUU,EAAOjB,aAAcM,GAI7C,CACLN,aAAciB,EAAOjB,aACrBjD,MAAOkE,EAAOlE,MACV,CACED,aACEmE,EAAOlE,MAAMQ,OAASC,EAAAA,iBAAiBI,uBACvCqD,EAAOlE,MAAMQ,OAASC,EAAiBA,iBAAA2D,iBACvCF,EAAOlE,MAAMQ,OAASC,mBAAiBC,QACnCwD,EAAOlE,MAAMF,QACboE,EAAOlE,MAAMQ,OAASC,EAAAA,iBAAiBK,mBACvC,uDACAf,GAAgBmE,EAAOlE,MAAMF,QACnCuE,aAAcH,EAAOlE,OAEvB,KACJ8D,UAAW,CACTC,aAAa,EACbC,UAAWM,KAAKC,MAChBhB,MACAC,gJA/a+BrD,MACnCqE,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,KAOA,MAAMC,EAA0C,oBAAjBnB,GAAuD,yBAAjBA,EAA0C,kBAAoBA,EAC7HoB,EACa,iBAAjBpB,EAC0C,iBAA9BkB,GAAeE,WAA0BF,EAAcE,WAAa,GAC5EZ,EACEG,EACA,GAAGQ,KAA0BlB,IAE/BzC,EAAS,OACT6D,EAAW,yBAGV,OAAA1C,EACLnB,EACA6D,EACA,CACE1E,QAASyD,EACTjF,KAAM,CACJmG,KAAMjB,GAAmC,sBACzCkB,iBAAkBjB,EAClBkB,OAAQ,GACRC,SAAU,CACRC,WAAYnB,GAAqB,wBACjCS,SAAUP,EAAqBO,OAAW,EAC1CW,UAAW,CACTC,cAAe5B,EACf6B,0BAA0B,KACtBrB,GAAsB,CAACsB,iCAAkC,MACjB,kBAAjCb,GAA8C,CAACa,gCAAiCb,GAC3Fc,gBAAiB,CACfC,uBAAwB9B,EACxB+B,WAAYlC,EACZmC,yBAA0B,GAC1BC,YAAaf,KACTZ,GAAsBE,GAAkB,CAACA,qBACzCF,GAAsBI,GAAW,CAACA,cAClCJ,GAAsBK,GAAmB,CAACA,sBAC1CJ,GAAsBK,GAAa,CAACA,gBACpCL,GAAsBM,GAAS,CAACA,YAChCG,GAA0C,iBAAlBA,IAA+BkB,MAAMC,QAAQnB,IAAkBA,MAKnGhE,OAAQ,CACNoF,QAAS,CACP,eAAgB,oBAElBC,iBAAiB,GAEnBjH,aAAc,qCACdsD,YAAa,CACXI,IAAK,GAAGxB,KAAU6D,sBAA6BtB,KAAaC,KAC1DQ,EAAqBG,EAAmBV,KAExCO,EAAqBE,EAAiB,MACnB,iBAAjBV,EAAkCoB,EAAa,MAErDvC,YAAcL,GAAiB4D,MAAMC,QAAQ7D,GAAciB,QAAQ+C,YAAcC,QAAQjE,EAAaiB,OAAO+C,UAAU"}
|
|
1
|
+
{"version":3,"file":"onDemandApi.js","sources":["../../../src/service/onDemandApi.ts"],"sourcesContent":["\nimport axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { apiCache } from \"./apicache.service\";\nimport { NetworkErrorType } from \"../types/onDemandApi.types\";\nimport type {\n NetworkError,\n CachedAPIResponse,\n CacheOptions,\n OnDemandCitationFetchApiResponse,\n UIMediaValidationFeedbackItem,\n} from \"../types/onDemandApi.types\";\n\nexport { NetworkErrorType } from \"../types/onDemandApi.types\";\nexport type {\n NetworkError,\n ApiError,\n StandardAPIResponse,\n CachedAPIResponse,\n OnDemandCitationFetchResponse,\n OnDemandCitationFetchApiResponse,\n CacheOptions,\n} from \"../types/onDemandApi.types\";\n\nexport const DEFAULT_CACHE_TTL = 1000 * 60 * 60 * 2;\n\n\n// on-demand citation fetch — single-shot request that returns the final citations directly\nexport const fetchOnDemandCitation = async (\n requestId: string,\n citationType: string,\n citationNumber: number,\n llmFormattedResponse: string,\n token: string,\n baseUrl:string,\n citationAssistantProcessingName:string,\n orgName:string,\n citationAgentName:string,\n isEcgPayloadActive:boolean,\n isReqPayloadActive:boolean,\n ecg_agent_name:string,\n customCitationId:string, \n plan_id:string,\n ui_chat_history?: any,\n mmvf_list?:UIMediaValidationFeedbackItem[],\n files?: string[],\n metadata?:string,\n checkPossibleCitationPayload?: boolean,\n uiRequestBody?: Record<string, unknown>\n): Promise<CachedAPIResponse<any>> => {\n\n // if(!token || !token.trim()) {\n // throw new Error('Authorization token is required to fetch on-demand citation');\n // }\n\n const normalizedCitationType = citationType === \"artifact_chunks\" || citationType === \"scanned_doc_citation\" ? \"artifact_chunks\" : citationType;\n const citationId =\n citationType === 'gpt_citation'\n ? (typeof uiRequestBody?.citationId === 'string' ? uiRequestBody.citationId : '')\n : isEcgPayloadActive\n ? customCitationId\n : `${normalizedCitationType}_${citationNumber}`;\n \n const method = 'post';\n const endpoint = '/api/chat/chatResponse';\n\n\n return makeApiRequestWithTTLCache<CachedAPIResponse<any>>(\n method,\n endpoint,\n {\n baseURL: baseUrl,\n data: {\n name: citationAssistantProcessingName || 'citationsprocessing',\n organizationName: orgName,\n prompt: '',\n useAgent: {\n agent_name: citationAgentName || 'ProcessCitationsAgent',\n metadata: isReqPayloadActive ? metadata : undefined,\n arguments: {\n citation_type: citationType,\n is_primary_agent_request: false,\n ...(isEcgPayloadActive && {check_possible_citation_payload : false}),\n ...(typeof checkPossibleCitationPayload === 'boolean' && {check_possible_citation_payload: checkPossibleCitationPayload,}),\n ui_request_body: {\n llm_formatted_response: llmFormattedResponse,\n request_id: requestId,\n max_concurrent_citations: 10,\n citation_id: citationId,\n ...(isEcgPayloadActive && ecg_agent_name && {ecg_agent_name}),\n ...(isEcgPayloadActive && plan_id && {plan_id}),\n ...(isEcgPayloadActive && ui_chat_history && {ui_chat_history}),\n ...(isReqPayloadActive && mmvf_list && {mmvf_list}),\n ...(isReqPayloadActive && files && {files}),\n ...(uiRequestBody && typeof uiRequestBody === 'object' && !Array.isArray(uiRequestBody) && uiRequestBody),\n },\n },\n },\n },\n config: {\n headers: {\n 'Content-Type': 'application/json',\n ...(token && token.trim() && { Authorization: `Bearer ${token}` }),\n },\n withCredentials: true,\n },\n errorMessage: 'Failed to fetch on-demand citation',\n cacheOption: {\n key: `${method}:${endpoint}:onDemandCitation:${requestId}:${citationType}:${\n isEcgPayloadActive ? customCitationId : citationNumber\n }:${\n isEcgPayloadActive ? ecg_agent_name : ''\n }:${citationType === \"gpt_citation\" ? citationId : ''}`,\n },\n shouldCache: (responseData) => Array.isArray(responseData?.result?.citations) && Boolean(responseData.result.citations[0]),\n }\n );\n};\n\n// legacy on-demand citation fetch — kept for older polling flows that still read from Redis\nexport const getOnDemandCitation = async (\n requestId: string,\n citationType: string,\n citationNumber: number,\n token:string,\n baseUrl:string\n): Promise<OnDemandCitationFetchApiResponse> => {\n return makeApiRequestWithTTLCache<OnDemandCitationFetchApiResponse>(\n 'get',\n '/api/redis/get-single-citations-data',\n {\n baseURL:baseUrl,\n config: {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n params: { request_id: `CitationAgent_${requestId}`, citation_type: citationType, citation_number: citationNumber },\n errorMessage: 'Failed to fetch on-demand citation',\n cacheOption: { ttl: Infinity },\n shouldCache: (data) => data.status === 'ready',\n }\n );\n};\n\nconst extractErrorMessage = (data: unknown): string | undefined => {\n if (!data || typeof data !== 'object') {\n return undefined;\n }\n // Cast to any to avoid TypeScript errors while checking properties\n const errorData = data as any;\n \n // Check for common error message patterns\n if (typeof errorData.message === 'string') {\n return errorData.message;\n }\n \n if (typeof errorData.errorMessage === 'string') {\n return errorData.errorMessage;\n }\n \n if (typeof errorData.error === 'string') {\n return errorData.error;\n }\n \n if (errorData.error && typeof errorData.error === 'object' && typeof errorData.error.message === 'string') {\n return errorData.error.message;\n }\n \n if (typeof errorData.details === 'string') {\n return errorData.details;\n }\n \n return errorData;\n};\n\n\n\n// Helper function to determine error type\nconst determineNetworkErrorType = async (error: any): Promise<NetworkError> => {\n // Check if there's an internet connection first\n // commented out\n // const isConnected = await checkInternetConnection();\n \n // if (!isConnected) {\n // return {\n // type: NetworkErrorType.INTERNET_DISCONNECTED,\n // message: 'No internet connection. Please check your network.',\n // originalError: error,\n // };\n // }\n\n // Axios specific error handling\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n \n // Check for timeout\n if (axiosError.code === 'ECONNABORTED') {\n return {\n type: NetworkErrorType.TIMEOUT,\n message: 'The request took too long to complete. Please try again.',\n originalError: error,\n };\n }\n \n // Client connectivity issues - internet problems detected via error message\n if (axiosError.message.includes('net::ERR_NETWORK_CHANGED') ||\n axiosError.message.includes('net::ERR_INTERNET_DISCONNECTED') ||\n axiosError.message.includes('net::ERR_NAME_NOT_RESOLVED')) {\n return {\n type: NetworkErrorType.INTERNET_DISCONNECTED,\n message: 'Internet connection issue detected. Please check your network.',\n originalError: error,\n };\n }\n \n // Server connectivity issues - server is likely down\n if (axiosError.message.includes('Network Error') || \n axiosError.code === 'ERR_NETWORK' ||\n axiosError.message.includes('net::ERR_CONNECTION_REFUSED') ||\n axiosError.message.includes('net::ERR_EMPTY_RESPONSE')) {\n return {\n type: NetworkErrorType.SERVER_UNREACHABLE,\n message: 'Unable to connect to server. The service may be down or unreachable.',\n originalError: error,\n };\n }\n \n // Server errors (500 range)\n if (axiosError.response && axiosError.response.status >= 500) {\n return {\n type: NetworkErrorType.SERVER_ERROR,\n message: `Service Unavailable. Server error (${axiosError.response.status}).`,\n status: axiosError.response.status,\n originalError: error,\n };\n }\n \n // Client errors (400 range) - these are expected errors\n if (axiosError.response && axiosError.response.status >= 400 && axiosError.response.status < 500) {\n return {\n type: NetworkErrorType.SERVER_ERROR,\n message: extractErrorMessage(axiosError.response.data) || \n `Request failed with status code ${axiosError.response.status}`,\n status: axiosError.response.status,\n originalError: error,\n };\n }\n }\n \n // Default case - unknown error\n return {\n type: NetworkErrorType.UNKNOWN_ERROR,\n message: 'An unexpected error occurred. Please try again later.',\n originalError: error,\n };\n};\n\nexport const createApiInstance = (baseURL?: string, timeout: number = 180000): AxiosInstance => { // 3 mins timeout\n // Create a custom axios instance with interceptors and timeout\n const apiInstance = axios.create({\n baseURL: baseURL,\n timeout: timeout, // Default to 3 mins timeout\n });\n\n // Set up request interceptor for adding headers, etc.\n apiInstance.interceptors.request.use(\n async (config) => {\n \n return config;\n },\n async (error) => {\n const networkError = await determineNetworkErrorType(error);\n return Promise.reject(networkError);\n }\n );\n\n // Set up response interceptor for handling errors\n apiInstance.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n async (error: any) => {\n const networkError = await determineNetworkErrorType(error);\n \n // Log errors (you might want to send them to a monitoring service)\n console.error('API Request Failed:', networkError);\n \n // You can also dispatch actions to a global state manager (Redux, etc.)\n // store.dispatch(setNetworkError(networkError));\n \n return Promise.reject(networkError);\n }\n );\n\n return apiInstance;\n};\n\nexport const generateCacheKey = (\n method: string,\n url: string,\n params?: any\n) => `${method}:${url}:${JSON.stringify(params || {})}`;\n\nconst defaultApi = createApiInstance();\n\n\nexport const makeApiRequest = async <T>(\n method: string,\n url: string,\n options?: {\n data?: any,\n config?: AxiosRequestConfig,\n baseURL?: string\n }\n): Promise<{ \n responseData: T | null;\n error: NetworkError | null;\n}> => {\n try {\n // Determine which API instance to use\n const apiInstance = options?.baseURL \n ? createApiInstance(options.baseURL)\n : defaultApi;\n \n const { data, config } = options || {};\n \n let response;\n switch (method.toLowerCase()) {\n case 'get':\n response = await apiInstance.get<T>(url, config);\n break;\n case 'post':\n response = await apiInstance.post<T>(url, data, config);\n break;\n case 'put':\n response = await apiInstance.put<T>(url, data, config);\n break;\n case 'patch':\n response = await apiInstance.patch<T>(url, data, config);\n break;\n case 'delete':\n const deleteConfig = {\n ...config,\n data: data\n };\n response = await apiInstance.delete<T>(url, deleteConfig);\n break;\n default:\n throw new Error(`Unsupported method: ${method}`);\n }\n \n return {\n responseData: response.data,\n error: null,\n };\n } catch (error: any) {\n // The error should already be processed by our interceptor\n if (error.type && Object.values(NetworkErrorType).includes(error.type)) {\n return {\n responseData: null,\n error: error as NetworkError,\n };\n }\n \n // Fallback for unhandled errors\n const networkError = await determineNetworkErrorType(error);\n return {\n responseData: null,\n error: networkError,\n };\n }\n};\n\nexport const makeApiRequestWithTTLCache = async <\n ResponseType extends CachedAPIResponse<any>\n>(\n method: string,\n url: string,\n options?: {\n data?: any;\n params?: any;\n config?: AxiosRequestConfig;\n errorMessage?: string;\n baseURL?: string;\n cacheOption?: CacheOptions;\n // return false to skip writing to cache for this response; defaults to caching all successful responses\n shouldCache?: (responseData: NonNullable<ResponseType['responseData']>) => boolean;\n }\n): Promise<ResponseType> => {\n type ExpectedDataType = NonNullable<ResponseType['responseData']>;\n\n const { data, params, config, errorMessage, baseURL, cacheOption, shouldCache } =\n options || {};\n\n const ttl = cacheOption?.ttl ?? DEFAULT_CACHE_TTL;\n const cacheKey =\n cacheOption?.key || generateCacheKey(method, url, params);\n\n // 1. Try cache\n if (!cacheOption?.forceRefresh && !cacheOption?.skipCache) {\n const cached = await apiCache.get<ExpectedDataType>(cacheKey);\n\n if (cached) {\n return {\n responseData: cached.data,\n error: null,\n cacheMeta: {\n isFromCache: true,\n timestamp: cached.timestamp,\n ttl: cached.ttl,\n cacheKey,\n },\n } as ResponseType;\n }\n }\n\n // 2. Prepare config\n const mergedConfig: AxiosRequestConfig = {\n ...config,\n ...(params && { params }),\n };\n\n // 3. Call API\n const result = await makeApiRequest<ExpectedDataType>(method, url, {\n data,\n config: mergedConfig,\n baseURL,\n });\n\n // 4. Store in cache — skipped if cacheOption.skipCache is set, or if shouldCache returns false\n const allowWrite =\n !cacheOption?.skipCache &&\n result.responseData != null &&\n (shouldCache ? shouldCache(result.responseData) : true);\n\n if (allowWrite) {\n await apiCache.set(cacheKey, result.responseData, ttl);\n }\n\n // 5. Return SAME structure as before + cacheMeta\n return {\n responseData: result.responseData,\n error: result.error\n ? {\n errorMessage:\n result.error.type === NetworkErrorType.INTERNET_DISCONNECTED ||\n result.error.type === NetworkErrorType.SLOW_CONNECTION ||\n result.error.type === NetworkErrorType.TIMEOUT\n ? result.error.message\n : result.error.type === NetworkErrorType.SERVER_UNREACHABLE\n ? \"Unable to connect to server. Please try again later.\"\n : errorMessage || result.error.message,\n errorObjData: result.error,\n }\n : null,\n cacheMeta: {\n isFromCache: false,\n timestamp: Date.now(),\n ttl,\n cacheKey,\n },\n } as ResponseType;\n};\n"],"names":["DEFAULT_CACHE_TTL","extractErrorMessage","data","errorData","message","errorMessage","error","details","determineNetworkErrorType","async","axios","isAxiosError","axiosError","code","type","NetworkErrorType","TIMEOUT","originalError","includes","INTERNET_DISCONNECTED","SERVER_UNREACHABLE","response","status","SERVER_ERROR","UNKNOWN_ERROR","createApiInstance","baseURL","timeout","apiInstance","create","interceptors","request","use","config","networkError","Promise","reject","console","generateCacheKey","method","url","params","JSON","stringify","defaultApi","makeApiRequest","options","toLowerCase","get","post","put","patch","deleteConfig","delete","Error","responseData","Object","values","makeApiRequestWithTTLCache","cacheOption","shouldCache","ttl","cacheKey","key","forceRefresh","skipCache","cached","apiCache","cacheMeta","isFromCache","timestamp","mergedConfig","result","set","SLOW_CONNECTION","errorObjData","Date","now","requestId","citationType","citationNumber","llmFormattedResponse","token","baseUrl","citationAssistantProcessingName","orgName","citationAgentName","isEcgPayloadActive","isReqPayloadActive","ecg_agent_name","customCitationId","plan_id","ui_chat_history","mmvf_list","files","metadata","checkPossibleCitationPayload","uiRequestBody","normalizedCitationType","citationId","endpoint","name","organizationName","prompt","useAgent","agent_name","arguments","citation_type","is_primary_agent_request","check_possible_citation_payload","ui_request_body","llm_formatted_response","request_id","max_concurrent_citations","citation_id","Array","isArray","headers","trim","Authorization","withCredentials","citations","Boolean"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e}from"react/jsx-runtime";import{Worker as r,Viewer as n}from"@react-pdf-viewer/core";import{pdfStyles as
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import{Worker as r,Viewer as n}from"@react-pdf-viewer/core";import{pdfStyles as o}from"./PdfStyle.js";import{useEffect as t}from"react";const d="https://unpkg.com/pdfjs-dist@3.11.174/build/pdf.worker.min.js",a=({error:r,onError:n})=>(t(()=>{n?.(r)},[r,n]),e("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",color:"#ef4444"},children:e("span",{children:"Error loading PDF document. The link may have expired."})})),i=({pdfUrl:t,plugins:i,onLoad:l,customStyles:s,onPageChange:c,defaultScale:f,renderPage:p,setRenderRange:m,onError:g})=>e("div",{style:{...o.pdfConatiner,...s?.pdfContainer},children:e(r,{workerUrl:d,children:e(n,{fileUrl:t,defaultScale:f,plugins:i,onDocumentLoad:l,onPageChange:c,renderPage:p,setRenderRange:m,renderError:r=>e(a,{error:r,onError:g})})})});export{i as default,d as pdfWorker};
|
|
2
2
|
//# sourceMappingURL=PdfContainer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfContainer.js","sources":["../../../src/features/PdfViewer/PdfContainer.tsx"],"sourcesContent":["import { Worker, Viewer, SpecialZoomLevel, PageChangeEvent, DocumentLoadEvent, RenderPage, SetRenderRange } from \"@react-pdf-viewer/core\";\nimport { pdfStyles } from \"./PdfStyle\";\nimport { CustomStylesType } from \"./PdfViewer\";\nexport const pdfWorker: string = \"https://unpkg.com/pdfjs-dist@3.11.174/build/pdf.worker.min.js\";\n\ntype Props = {\n pdfUrl: string;\n plugins: any[];\n onLoad: (e: DocumentLoadEvent) => void;\n customStyles?: CustomStylesType;\n onPageChange : (e : PageChangeEvent) => void;\n defaultScale?: SpecialZoomLevel | number | undefined;\n renderPage?: RenderPage;\n setRenderRange?: SetRenderRange;\n};\n\nconst PdfContainer = ({ pdfUrl, plugins, onLoad, customStyles,onPageChange, defaultScale, renderPage, setRenderRange }: Props) => {\n return (\n <div style={{ ...pdfStyles.pdfConatiner, ...customStyles?.pdfContainer }}>\n <Worker workerUrl={pdfWorker}>\n <Viewer\n fileUrl={pdfUrl}\n defaultScale={defaultScale}\n plugins={plugins}\n onDocumentLoad={onLoad}\n onPageChange={onPageChange}\n renderPage={renderPage}\n setRenderRange={setRenderRange}\n />\n </Worker>\n </div>\n );\n};\n\nexport default PdfContainer;\n"],"names":["pdfWorker","PdfContainer","pdfUrl","plugins","onLoad","customStyles","onPageChange","defaultScale","renderPage","setRenderRange","
|
|
1
|
+
{"version":3,"file":"PdfContainer.js","sources":["../../../src/features/PdfViewer/PdfContainer.tsx"],"sourcesContent":["import { Worker, Viewer, SpecialZoomLevel, PageChangeEvent, DocumentLoadEvent, RenderPage, SetRenderRange, type LoadError } from \"@react-pdf-viewer/core\";\nimport { pdfStyles } from \"./PdfStyle\";\nimport { CustomStylesType } from \"./PdfViewer\";\nimport { useEffect } from \"react\";\nexport const pdfWorker: string = \"https://unpkg.com/pdfjs-dist@3.11.174/build/pdf.worker.min.js\";\n\ntype Props = {\n pdfUrl: string;\n plugins: any[];\n onLoad: (e: DocumentLoadEvent) => void;\n customStyles?: CustomStylesType;\n onPageChange : (e : PageChangeEvent) => void;\n defaultScale?: SpecialZoomLevel | number | undefined;\n renderPage?: RenderPage;\n setRenderRange?: SetRenderRange;\n onError?: (error: LoadError) => void;\n};\n\nconst PdfErrorHandler = ({ error, onError }: { error: LoadError; onError?: (error: LoadError) => void }) => {\n useEffect(() => {\n onError?.(error);\n }, [error, onError]);\n\n\n return (\n <div style={{ display: \"flex\", justifyContent: \"center\", alignItems: 'center', height: \"100%\", color: \"#ef4444\"}}>\n <span>Error loading PDF document. The link may have expired.</span>\n </div>\n );\n};\n\nconst PdfContainer = ({ pdfUrl, plugins, onLoad, customStyles,onPageChange, defaultScale, renderPage, setRenderRange, onError }: Props) => {\n return (\n <div style={{ ...pdfStyles.pdfConatiner, ...customStyles?.pdfContainer }}>\n <Worker workerUrl={pdfWorker}>\n <Viewer\n fileUrl={pdfUrl}\n defaultScale={defaultScale}\n plugins={plugins}\n onDocumentLoad={onLoad}\n onPageChange={onPageChange}\n renderPage={renderPage}\n setRenderRange={setRenderRange}\n renderError={(error)=> <PdfErrorHandler error={error} onError={onError} />}\n />\n </Worker>\n </div>\n );\n};\n\nexport default PdfContainer;\n"],"names":["pdfWorker","PdfErrorHandler","error","onError","useEffect","style","display","justifyContent","alignItems","height","color","children","jsx","PdfContainer","pdfUrl","plugins","onLoad","customStyles","onPageChange","defaultScale","renderPage","setRenderRange","pdfStyles","pdfConatiner","pdfContainer","Worker","workerUrl","Viewer","fileUrl","onDocumentLoad","renderError"],"mappings":"gLAIO,MAAMA,EAAoB,gEAc3BC,EAAkB,EAAGC,QAAOC,cAChCC,EAAU,KACRD,IAAUD,IACT,CAACA,EAAOC,MAIR,MAAI,CAAAE,MAAO,CAAEC,QAAS,OAAQC,eAAgB,SAAUC,WAAY,SAAUC,OAAQ,OAAQC,MAAO,WACpGC,SAACC,EAAA,OAAA,CAAKD,uEAKNE,EAAe,EAAGC,SAAQC,UAASC,SAAQC,eAAaC,eAAcC,eAAcC,aAAYC,iBAAgBlB,aAEjHS,EAAA,MAAA,CAAIP,MAAO,IAAKiB,EAAUC,gBAAiBN,GAAcO,cACxDb,SAACC,EAAAa,EAAA,CAAOC,UAAW1B,EACjBW,SAAAC,EAACe,EAAA,CACCC,QAASd,EACTK,eACAJ,UACAc,eAAgBb,EAChBE,eACAE,aACAC,iBACAS,YAAc5B,GAAUU,EAAAX,EAAA,CAAgBC,QAAcC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t,Fragment as o}from"react/jsx-runtime";import{SpecialZoomLevel as
|
|
1
|
+
import{jsx as e,jsxs as t,Fragment as o}from"react/jsx-runtime";import{SpecialZoomLevel as r}from"@react-pdf-viewer/core";import n from"./PdfContainer.js";import i from"./PdfToolbar.js";import{pdfStyles as a}from"./PdfStyle.js";import{PdfHighlightControls as s}from"./usePdfHighlight.js";import{rotationManager as c}from"./rotationManager.js";import"@react-pdf-viewer/zoom/lib/styles/index.css";import"@react-pdf-viewer/page-navigation/lib/styles/index.css";import"@react-pdf-viewer/core/lib/styles/index.css";import"@react-pdf-viewer/search/lib/styles/index.css";import l,{useRef as u,useState as d,useMemo as g,useEffect as h}from"react";import m from"../ScannedDocCitation/ScannedDocCitation.js";import"./PdfViewer.css.js";const p=({pdfUrl:p,highlightText:f,highlightPages:v,highlightCordinatePages:w,highlightColor:y="yellow",activeHighlightColor:P="#f7dc51",jumpToPageValue:T=0,pdfName:x,onClose:C,customStyles:b,customClasses:S,customIcons:A,useCoordinates:R,fallbackPages:I,activeCitationIndex:_,onActiveCitationChange:q,headerAction:L,isZoomEnabled:j=!0,showHighlightsAction:F=!0,defaultScale:H=r.ActualSize,useRange:N=!1,rangeOfPages:B=null,showFullScreenAction:E=!0,showRotateButton:M=!1,segments:V=[{title:"Document 2",start_page:52,end_page:52,page_count:1}],segmentTooltipText:k,onCurrentPageChange:z,navigationRequest:D,onNavigationSettled:W,disablePdfAnnotations:O=!1,disablePdfTextLayer:U=!1,renderPage:$,setRenderRange:Z,onError:J})=>{const K=u(null),G=(e=>{switch(e){case"ActualSize":return r.ActualSize;case"PageFit":return r.PageFit;case"PageWidth":return r.PageWidth;default:return e??r.PageWidth}})(H),[Q,X]=d(0),[Y,ee]=d(0),[te,oe]=d(0),re=u(null),ne=u(null),ie=u(0),ae=u(null),se=g(()=>{if(!p)return"";try{return new URL(p,window.location.origin).pathname.split("/").pop()||"default"}catch{return"default"}},[p]);h(()=>{se&&c.setPdfIdentifier(se)},[se]);h(()=>c.onRotationChange((e,t)=>{e===Q+1&&oe(t)}),[Q]),h(()=>{const e=new MutationObserver(()=>{const e=K.current?.querySelectorAll('[data-testid^="core__page-layer-"]'),t=new Set;e?.forEach(e=>{const o=e.getAttribute("data-testid")?.match(/core__page-layer-(\d+)/);if(o&&o.length>=2){const r=parseInt(o[1],10)+1;t.has(r)||(c.registerPageElement(r,e),t.add(r))}})});return K.current&&(e.observe(K.current,{childList:!0,subtree:!0,attributes:!1}),ae.current=e),()=>{e.disconnect(),ae.current=null}},[]),h(()=>()=>{c.clearAll(),ae.current&&ae.current.disconnect()},[]),h(()=>{const e=Q+1;oe(c.getRotation(e))},[Q]);const ce=g(()=>O||U?r=>{const n=U?e("div",{"aria-hidden":"true",style:{display:"none"},children:r.textLayer.children}):r.textLayer.children,i={...r,annotationLayer:{...r.annotationLayer,children:O?null:r.annotationLayer.children},textLayer:{...r.textLayer,children:n}};return $?$(i):t(o,{children:[r.canvasLayer.children,n,!O&&r.annotationLayer.children]})}:$,[O,U,$]),le=g(()=>{if(R)return new Set(w.map(e=>e.pageIndex));{const e=new Set;return Object.values(v).forEach(t=>{t>0&&e.add(t-1)}),e}},[w,v,R]),ue=(de=f)&&0!==de.length?de.filter(e=>!de.some(t=>t!==e&&t.includes(e))):de;var de;const{highlightIndex:ge,setHighlightIndex:he,cursorIndex:me,setCursorIndex:pe,orderedKeys:fe,totalHighlights:ve,getValidPosition:we,tryJump:ye,jumpToPage:Pe,zoomTo:Te,plugins:xe,controls:Ce,hideNonTargetHighlights:be,deduplicateHighlights:Se,scrollToCoord:Ae}=s(ue,R?{}:v,K,le,R,R?w:[],y,P),Re=we(me),Ie=g(()=>{const e=Q+1;return V.find(t=>e>=t.start_page&&e<=t.end_page)},[Q,V]);h(()=>{void 0!==_&&_!==me&&pe(_)},[_]);const _e={...Ce,goToNext:()=>{me>=ve-1||(Ce.goToNext(),q&&q(me+1))},goToPrevious:()=>{me<=0||(Ce.goToPrevious(),q&&q(me-1))}},qe=l.useCallback((e,t)=>{ie.current+=1;const o=ie.current;null!=ne.current&&window.clearTimeout(ne.current);let r=null,n=0,i=0;const a=()=>{if(ie.current!==o)return;i+=1;const s=K.current?.querySelector(".rpv-core__inner-pages"),c=K.current?.querySelector(`[data-testid="core__page-layer-${t-1}"]`);if(!s||!c)return i>=40?(ne.current=null,void W?.({pageNumber:t,requestId:e.requestId})):void(ne.current=window.setTimeout(a,50));r===s.scrollTop?n+=1:(r=s.scrollTop,n=0);const l=s.getBoundingClientRect(),u=c.getBoundingClientRect(),d=Boolean(l&&u&&u.bottom>l.top&&u.top<l.bottom);if(n>=2&&d||i>=40)return ne.current=null,void W?.({pageNumber:t,requestId:e.requestId});ne.current=window.setTimeout(a,50)};ne.current=window.setTimeout(a,50)},[W]);if(h(()=>()=>{ie.current+=1,null!=ne.current&&window.clearTimeout(ne.current)},[]),h(()=>{if(!D||Y<=0)return;const e=Math.min(Math.max(Math.trunc(D.pageNumber),1),Y),t=`${D.requestId??e}:${e}`;re.current!==t&&(re.current=t,X(e-1),Pe(e-1),qe(D,e))},[Pe,D,Y,qe]),!p)return e(m,{pages:I,activeCitationIndex:_,onActiveCitationChange:q,headerAction:L});return t("div",{ref:K,className:["citation-pdf-viewer",S?.pdfViewerWrapper].filter(Boolean).join(" "),"data-disable-pdf-annotations":O?"true":void 0,"data-pdf-page-fit":G===r.PageFit?"true":void 0,style:{height:"100%",minHeight:0,minWidth:0,overflow:"hidden",display:"flex",flexDirection:"column",...a.pdfViewer,display:"flex",flexDirection:"column",height:"100%",width:"100%",backgroundColor:"#FAFAFA",...b?.pdfViewer,backgroundColor:"#F1F5F9"},children:[e(i,{highlightIndex:ge,totalHighlights:ve,controls:_e,currentPosition:Re,pdfName:x,onClose:C,pdfUrl:p,viewerRef:K,customStyles:b,customClasses:S,customIcons:A,headerAction:L,isZoomEnabled:j,showHighlightsAction:F,showFullScreenAction:E,currentSegment:Ie,segmentTooltipText:k,currentPage:Q+1,totalPages:Y,onPageNavigate:e=>{const t=Math.min(Math.max(e,1),Y||e);X(t-1),Pe(t-1)},onRotatePage:()=>{const e=Q+1;c.rotatePageBy90(e),oe(c.getRotation(e))},currentPageRotation:te,showRotateButton:M}),e(n,{defaultScale:G,pdfUrl:p,plugins:xe,customStyles:b,onError:J,onLoad:e=>{ee(e.doc.numPages);const t=!R&&!N&&T<=0;if(T>0&&!N){const e=T-1,t=fe[e],o=v[t],r=w[e];pe(e),console.log(r,"cordinateTargetHighlight"),R&&r.pageIndex>0&&Pe(r.pageIndex),o>0&&(setTimeout(()=>{be(le),Se(o-1)},1e3),R||Pe(o-1))}else if(N&&B&&2===B.length){(async()=>{const[e,t]=B;for(let o=e;o<=t;o++){const e=o-1;Pe(e),await new Promise(e=>setTimeout(e,1e3)),be(le);const t=Se(e);if(t&&t>0)break}})()}else if(!R&&v){const e=fe.find(e=>v[e]>0);if(void 0!==e){const t=v[e]-1;Pe(t),setTimeout(()=>{be(le),Se(t)},1e3)}}requestAnimationFrame(()=>{t&&ye(),!R&&T>0&&!N&&(()=>{if(!K.current)return;const e=T-1,t=fe[e],o=v[t],r=o>0?o-1:0,n={};fe.forEach((e,t)=>{const o=v[e];o>0&&(n[o]||(n[o]=[]),n[o].push(t))});const i=(n[o]||[]).indexOf(e);let a=0;const s=()=>{if(a++,a>40)return;const e=K.current?.querySelector(".rpv-core__inner-pages");if(!e)return void setTimeout(s,100);const t=K.current?.querySelector(`[data-testid="core__page-layer-${r}"]`);if(!t)return void setTimeout(s,100);const o=e.getBoundingClientRect(),n=t.getBoundingClientRect();if(!(n.top<o.bottom&&n.bottom>o.top))return void setTimeout(s,100);const c=t.querySelectorAll(".rpv-search__highlight")[i];if(!c)return void setTimeout(s,100);const l=c.getBoundingClientRect(),u=e.scrollTop+(l.top-o.top)-e.clientHeight/2+l.height/2;e.scrollTo({top:u,behavior:"smooth"})};setTimeout(s,500)})()})},onPageChange:e=>{const t=e.currentPage;X(t),z?.(t+1),le.has(t)?(Se(t),be(le)):be(le)},renderPage:ce,setRenderRange:Z})]})};export{p as default};
|
|
2
2
|
//# sourceMappingURL=PdfViewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfViewer.js","sources":["../../../src/features/PdfViewer/PdfViewer.tsx"],"sourcesContent":["import { DocumentLoadEvent, PageChangeEvent, RenderPage, SetRenderRange, SpecialZoomLevel } from \"@react-pdf-viewer/core\";\nimport PdfContainer from \"./PdfContainer\";\nimport PdfToolbar from \"./PdfToolbar\";\nimport { pdfStyles } from \"./PdfStyle\";\nimport { PdfHighlightControls } from \"./usePdfHighlight\";\nimport { rotationManager } from \"./rotationManager\";\nimport \"@react-pdf-viewer/zoom/lib/styles/index.css\";\nimport \"@react-pdf-viewer/page-navigation/lib/styles/index.css\";\nimport \"@react-pdf-viewer/core/lib/styles/index.css\";\nimport \"@react-pdf-viewer/search/lib/styles/index.css\";\nimport React, { useMemo, useRef, useEffect, useState } from \"react\";\nimport ScannedDocCitation, { CitationPage } from \"../ScannedDocCitation/ScannedDocCitation\";\nimport \"./PdfViewer.css\";\n\nexport type CustomIconsType = {\n pdfIcon?: React.ReactNode;\n fullScreenIcon?: React.ReactNode;\n downloadIcon?: React.ReactNode;\n closeIcon?: React.ReactNode;\n};\n\nexport type CustomStylesType = {\n pdfViewer?: React.CSSProperties;\n header?: React.CSSProperties;\n pdfIconWrapper?: React.CSSProperties;\n pdfName?: React.CSSProperties;\n pdfContainer?: React.CSSProperties;\n emptyState?: React.CSSProperties;\n};\n\nexport type CustomClassesType = {\n header?: string;\n pdfName?: string;\n actionButton?: string;\n pdfViewerWrapper?: string;\n};\n\nexport type PdfSegment = {\n title: string;\n start_page: number;\n end_page: number;\n page_count: number;\n};\n\ntype PdfScaleOption =\n | \"ActualSize\"\n | \"PageFit\"\n | \"PageWidth\"\n | number;\nexport interface PdfNavigationRequest {\n pageNumber: number;\n /** Change this value to navigate to the same page more than once. */\n requestId?: string | number;\n}\n\nexport interface PdfNavigationSettledEvent extends PdfNavigationRequest {\n pageNumber: number;\n}\n\nexport interface PdfViewerProps {\n pdfUrl?: string;\n highlightText: string[];\n highlightPages?: any;\n highlightCordinatePages: HighlightArea[];\n highlightColor?: string;\n activeHighlightColor?: string;\n jumpToPageValue?: number;\n pdfName?: string;\n onClose?: () => void;\n item?: any;\n customStyles?: CustomStylesType;\n customClasses?: CustomClassesType;\n customIcons?: CustomIconsType;\n useCoordinates: boolean;\n fallbackPages?: CitationPage[];\n activeCitationIndex?: number;\n onActiveCitationChange?: (index: number) => void;\n headerAction?: {\n icon?: React.ReactNode;\n onClick?: () => void;\n tooltip?: string;\n };\n isZoomEnabled?: boolean;\n showHighlightsAction?: boolean;\n defaultScale?: PdfScaleOption;\n useRange?: boolean; //\n rangeOfPages?: number[] | null;\n showFullScreenAction?: boolean;\n showRotateButton?: boolean;\n segments?: PdfSegment[];\n segmentTooltipText?: string;\n onCurrentPageChange?: (pageNumber: number) => void;\n navigationRequest?: PdfNavigationRequest | null;\n onNavigationSettled?: (event: PdfNavigationSettledEvent) => void;\n disablePdfAnnotations?: boolean;\n disablePdfTextLayer?: boolean;\n renderPage?: RenderPage;\n setRenderRange?: SetRenderRange;\n}\n\nconst getResolvedScale = (\n scale?: PdfScaleOption\n): SpecialZoomLevel | number => {\n switch (scale) {\n case \"ActualSize\":\n return SpecialZoomLevel.ActualSize;\n\n case \"PageFit\":\n return SpecialZoomLevel.PageFit;\n\n case \"PageWidth\":\n return SpecialZoomLevel.PageWidth;\n\n default:\n return scale ?? SpecialZoomLevel.PageWidth;\n }\n};\n\nexport type HighlightArea = {\n pageIndex: number;\n left: number;\n top: number;\n width: number;\n height: number;\n pageNumber?: number;\n};\n\nconst PdfViewer = ({\n pdfUrl,\n highlightText,\n highlightPages,\n highlightCordinatePages,\n highlightColor = \"yellow\",\n activeHighlightColor = \"#f7dc51\",\n jumpToPageValue = 0,\n pdfName,\n onClose,\n customStyles,\n customClasses,\n customIcons,\n useCoordinates,\n fallbackPages,\n activeCitationIndex,\n onActiveCitationChange,\n headerAction,\n isZoomEnabled = true,\n showHighlightsAction = true,\n defaultScale = SpecialZoomLevel.ActualSize,\n useRange = false,\n rangeOfPages = null,\n showFullScreenAction=true,\n showRotateButton = false,\n segments = [\n {\n title: \"Document 2\",\n start_page: 52,\n end_page: 52,\n page_count: 1,\n },\n ],\n segmentTooltipText,\n onCurrentPageChange,\n navigationRequest,\n onNavigationSettled,\n disablePdfAnnotations = false,\n disablePdfTextLayer = false,\n renderPage,\n setRenderRange,\n}: PdfViewerProps) => {\n\n const viewerRef = useRef<HTMLDivElement | null>(null);\n const resolvedDefaultScale = getResolvedScale(defaultScale);\n const [currentPage, setCurrentPage] = useState(0);\n const [totalPages, setTotalPages] = useState(0);\n const [currentPageRotation, setCurrentPageRotation] = useState(0);\n const lastNavigationRequestRef = useRef<string | null>(null);\n const navigationSettleTimerRef = useRef<number | null>(null);\n const navigationSettleSequenceRef = useRef(0);\n const mutationObserverRef = useRef<MutationObserver | null>(null);\n\n // Generate PDF identifier for localStorage from URL\n const pdfIdentifier = useMemo(() => {\n if (!pdfUrl) return '';\n // Use last part of URL or hash it\n try {\n const url = new URL(pdfUrl, window.location.origin);\n return url.pathname.split('/').pop() || 'default';\n } catch {\n return 'default';\n }\n }, [pdfUrl]);\n\n // Set up rotation manager with PDF identifier\n useEffect(() => {\n if (pdfIdentifier) {\n rotationManager.setPdfIdentifier(pdfIdentifier);\n }\n }, [pdfIdentifier]);\n\n // Handler for rotating current page (no state update)\n const handleRotatePage = () => {\n const pageNumber = currentPage + 1;\n rotationManager.rotatePageBy90(pageNumber);\n // Manually update state to reflect rotation in UI\n setCurrentPageRotation(rotationManager.getRotation(pageNumber));\n };\n\n // Subscribe to rotation changes to sync UI state\n useEffect(() => {\n const unsubscribe = rotationManager.onRotationChange((pageNum, angle) => {\n // Only update state if current page rotated\n if (pageNum === currentPage + 1) {\n setCurrentPageRotation(angle);\n }\n });\n\n return unsubscribe;\n }, [currentPage]);\n\n // Register page elements with rotation manager\n useEffect(() => {\n const observer = new MutationObserver(() => {\n // Find all newly rendered page elements\n const pageElements = viewerRef.current?.querySelectorAll(\n '[data-testid^=\"core__page-layer-\"]'\n );\n\n const registeredPages = new Set<number>();\n\n pageElements?.forEach((pageElement) => {\n const match = (pageElement as HTMLElement)\n .getAttribute('data-testid')\n ?.match(/core__page-layer-(\\d+)/);\n if (match && match.length >= 2) {\n const pageIndex = parseInt(match[1], 10);\n const pageNumber = pageIndex + 1;\n\n // Only register once per page\n if (!registeredPages.has(pageNumber)) {\n rotationManager.registerPageElement(pageNumber, pageElement as HTMLElement);\n registeredPages.add(pageNumber);\n }\n }\n });\n });\n\n if (viewerRef.current) {\n observer.observe(viewerRef.current, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n mutationObserverRef.current = observer;\n }\n\n return () => {\n observer.disconnect();\n mutationObserverRef.current = null;\n };\n }, []);\n\n // Clean up when unmounting\n useEffect(() => {\n return () => {\n rotationManager.clearAll();\n if (mutationObserverRef.current) {\n mutationObserverRef.current.disconnect();\n }\n };\n }, []);\n\n // Update current page rotation when page changes\n useEffect(() => {\n const pageNumber = currentPage + 1;\n setCurrentPageRotation(rotationManager.getRotation(pageNumber));\n }, [currentPage]);\n const resolvedRenderPage = useMemo<RenderPage | undefined>(() => {\n if (!disablePdfAnnotations && !disablePdfTextLayer) return renderPage;\n\n return (props) => {\n const resolvedTextLayerChildren = disablePdfTextLayer ? (\n <div aria-hidden=\"true\" style={{ display: \"none\" }}>\n {props.textLayer.children}\n </div>\n ) : props.textLayer.children;\n const resolvedProps = {\n ...props,\n annotationLayer: {\n ...props.annotationLayer,\n children: disablePdfAnnotations ? null : props.annotationLayer.children,\n },\n textLayer: {\n ...props.textLayer,\n children: resolvedTextLayerChildren,\n },\n };\n\n const renderedPage = renderPage\n ? renderPage(resolvedProps)\n : (\n <>\n {props.canvasLayer.children}\n {resolvedTextLayerChildren}\n {!disablePdfAnnotations && props.annotationLayer.children}\n </>\n );\n\n return renderedPage;\n };\n }, [disablePdfAnnotations, disablePdfTextLayer, renderPage]);\n\n const cleanHighlightTexts = (texts: string[]): string[] => {\n if (!texts || texts.length === 0) return texts;\n return texts.filter((text) => {\n return !texts.some(\n (otherText) => otherText !== text && otherText.includes(text)\n );\n });\n };\n\n const highlightPageSet = useMemo(() => {\n if (useCoordinates) {\n return new Set(highlightCordinatePages.map((h: any) => h.pageIndex));\n } else {\n const set = new Set<number>();\n Object.values(highlightPages).forEach((p: any) => {\n if (p > 0) set.add(p - 1);\n });\n return set;\n }\n }, [highlightCordinatePages, highlightPages, useCoordinates]);\n\n const removeRedundantHighlightTexts = cleanHighlightTexts(highlightText);\n\n const {\n highlightIndex,\n setHighlightIndex,\n cursorIndex,\n setCursorIndex,\n orderedKeys,\n totalHighlights,\n getValidPosition,\n tryJump,\n jumpToPage,\n zoomTo,\n plugins,\n controls,\n hideNonTargetHighlights,\n deduplicateHighlights,\n scrollToCoord,\n } = PdfHighlightControls(\n removeRedundantHighlightTexts,\n !useCoordinates ? highlightPages : {},\n viewerRef,\n highlightPageSet,\n useCoordinates,\n useCoordinates ? highlightCordinatePages : [],\n highlightColor,\n activeHighlightColor\n );\n\n const currentPosition = getValidPosition(cursorIndex);\n const currentSegment = useMemo(() => {\n const pageNumber = currentPage + 1;\n return segments.find(\n (segment) =>\n pageNumber >= segment.start_page && pageNumber <= segment.end_page\n );\n }, [currentPage, segments]);\n\n // sync external activeCitationIndex → cursorIndex\n useEffect(() => {\n if (activeCitationIndex === undefined) return;\n if (activeCitationIndex === cursorIndex) return;\n setCursorIndex(activeCitationIndex);\n }, [activeCitationIndex]);\n\n // wrap controls to fire onActiveCitationChange\n const handleGoToNext = () => {\n if (cursorIndex >= totalHighlights - 1) return;\n controls.goToNext();\n if (onActiveCitationChange) onActiveCitationChange(cursorIndex + 1);\n };\n\n const handleGoToPrevious = () => {\n if (cursorIndex <= 0) return;\n controls.goToPrevious();\n if (onActiveCitationChange) onActiveCitationChange(cursorIndex - 1);\n };\n\n const modifiedControls = {\n ...controls,\n goToNext: handleGoToNext,\n goToPrevious: handleGoToPrevious,\n };\n\n const handlePageNavigate = (pageNumber: number) => {\n const nextPage = Math.min(Math.max(pageNumber, 1), totalPages || pageNumber);\n setCurrentPage(nextPage - 1);\n jumpToPage(nextPage - 1);\n };\n\n const waitForNavigationToSettle = React.useCallback((\n request: PdfNavigationRequest,\n pageNumber: number\n ) => {\n navigationSettleSequenceRef.current += 1;\n const settleSequence = navigationSettleSequenceRef.current;\n if (navigationSettleTimerRef.current != null) {\n window.clearTimeout(navigationSettleTimerRef.current);\n }\n\n let previousScrollTop: number | null = null;\n let stableChecks = 0;\n let attempts = 0;\n\n const checkScrollPosition = () => {\n if (navigationSettleSequenceRef.current !== settleSequence) return;\n\n attempts += 1;\n\n const scrollContainer = viewerRef.current?.querySelector(\n '.rpv-core__inner-pages'\n ) as HTMLElement | null;\n const targetPage = viewerRef.current?.querySelector(\n `[data-testid=\"core__page-layer-${pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n // Virtualized page layers are not guaranteed to be mounted on the first\n // check after jumpToPage. Keep polling so navigation completion is not\n // lost while React PDF Viewer is creating the target page DOM.\n if (!scrollContainer || !targetPage) {\n if (attempts >= 40) {\n navigationSettleTimerRef.current = null;\n onNavigationSettled?.({\n pageNumber,\n requestId: request.requestId,\n });\n return;\n }\n\n navigationSettleTimerRef.current = window.setTimeout(checkScrollPosition, 50);\n return;\n }\n\n if (previousScrollTop === scrollContainer.scrollTop) {\n stableChecks += 1;\n } else {\n previousScrollTop = scrollContainer.scrollTop;\n stableChecks = 0;\n }\n\n const scrollRect = scrollContainer.getBoundingClientRect();\n const pageRect = targetPage.getBoundingClientRect();\n const isTargetVisible = Boolean(\n scrollRect &&\n pageRect &&\n pageRect.bottom > scrollRect.top &&\n pageRect.top < scrollRect.bottom\n );\n const hasSettled = stableChecks >= 2 && isTargetVisible;\n const reachedTimeout = attempts >= 40;\n\n if (hasSettled || reachedTimeout) {\n navigationSettleTimerRef.current = null;\n onNavigationSettled?.({\n pageNumber,\n requestId: request.requestId,\n });\n return;\n }\n\n navigationSettleTimerRef.current = window.setTimeout(checkScrollPosition, 50);\n };\n\n navigationSettleTimerRef.current = window.setTimeout(checkScrollPosition, 50);\n }, [onNavigationSettled]);\n\n useEffect(() => () => {\n navigationSettleSequenceRef.current += 1;\n if (navigationSettleTimerRef.current != null) {\n window.clearTimeout(navigationSettleTimerRef.current);\n }\n }, []);\n\n useEffect(() => {\n if (!navigationRequest || totalPages <= 0) return;\n\n const nextPage = Math.min(\n Math.max(Math.trunc(navigationRequest.pageNumber), 1),\n totalPages\n );\n const requestKey = `${navigationRequest.requestId ?? nextPage}:${nextPage}`;\n if (lastNavigationRequestRef.current === requestKey) return;\n\n lastNavigationRequestRef.current = requestKey;\n setCurrentPage(nextPage - 1);\n jumpToPage(nextPage - 1);\n waitForNavigationToSettle(navigationRequest, nextPage);\n }, [jumpToPage, navigationRequest, totalPages, waitForNavigationToSettle]);\n\n if (!pdfUrl) {\n return (\n <ScannedDocCitation\n pages={fallbackPages}\n activeCitationIndex={activeCitationIndex}\n onActiveCitationChange={onActiveCitationChange}\n headerAction={headerAction}\n />\n );\n }\n\n const defaultViewerStyles: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n backgroundColor: \"#FAFAFA\",\n };\n\n const scrollToHighlight = () => {\n if (!viewerRef.current) return;\n\n const index = jumpToPageValue - 1;\n const key = orderedKeys[index];\n const page = highlightPages[key];\n const targetPage = page > 0 ? page - 1 : 0;\n\n const pageVisitMap: Record<number, number[]> = {};\n orderedKeys.forEach((k, i) => {\n const p = highlightPages[k];\n if (p > 0) {\n if (!pageVisitMap[p]) pageVisitMap[p] = [];\n pageVisitMap[p].push(i);\n }\n });\n const visits = pageVisitMap[page] || [];\n const occurrence = visits.indexOf(index);\n\n let attempts = 0;\n const maxAttempts = 40;\n\n const doScrollToHighlight = () => {\n attempts++;\n if (attempts > maxAttempts) return;\n\n const scrollContainer = viewerRef.current?.querySelector(\n \".rpv-core__inner-pages\"\n ) as HTMLElement;\n if (!scrollContainer) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const pageElement = viewerRef.current?.querySelector(\n `[data-testid=\"core__page-layer-${targetPage}\"]`\n );\n if (!pageElement) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const scrollContainerRect = scrollContainer.getBoundingClientRect();\n const pageRect = pageElement.getBoundingClientRect();\n const isPageVisible =\n pageRect.top < scrollContainerRect.bottom &&\n pageRect.bottom > scrollContainerRect.top;\n\n if (!isPageVisible) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const allHighlights = pageElement.querySelectorAll(\".rpv-search__highlight\");\n const target = allHighlights[occurrence] as HTMLElement;\n\n if (!target) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const highlightRect = target.getBoundingClientRect();\n const scrollTop =\n scrollContainer.scrollTop +\n (highlightRect.top - scrollContainerRect.top) -\n scrollContainer.clientHeight / 2 +\n highlightRect.height / 2;\n\n scrollContainer.scrollTo({ top: scrollTop, behavior: \"smooth\" });\n };\n\n setTimeout(doScrollToHighlight, 500);\n };\n\n return (\n <div\n ref={viewerRef}\n className={[\"citation-pdf-viewer\", customClasses?.pdfViewerWrapper]\n .filter(Boolean)\n .join(\" \")}\n data-disable-pdf-annotations={\n disablePdfAnnotations ? \"true\" : undefined\n }\n data-pdf-page-fit={\n resolvedDefaultScale === SpecialZoomLevel.PageFit ? \"true\" : undefined\n }\n style={{\n height: \"100%\",\n minHeight: 0,\n minWidth: 0,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n ...pdfStyles.pdfViewer,\n ...defaultViewerStyles,\n ...customStyles?.pdfViewer,\n backgroundColor: \"#F1F5F9\",\n }}\n >\n <PdfToolbar\n highlightIndex={highlightIndex}\n totalHighlights={totalHighlights}\n controls={modifiedControls}\n currentPosition={currentPosition}\n pdfName={pdfName}\n onClose={onClose}\n pdfUrl={pdfUrl}\n viewerRef={viewerRef}\n customStyles={customStyles}\n customClasses={customClasses}\n customIcons={customIcons}\n headerAction={headerAction}\n isZoomEnabled={isZoomEnabled}\n showHighlightsAction={showHighlightsAction}\n showFullScreenAction={showFullScreenAction} \n currentSegment={currentSegment}\n segmentTooltipText={segmentTooltipText}\n currentPage={currentPage + 1}\n totalPages={totalPages}\n onPageNavigate={handlePageNavigate}\n onRotatePage={handleRotatePage}\n currentPageRotation={currentPageRotation}\n showRotateButton={showRotateButton}\n />\n <PdfContainer\n defaultScale={resolvedDefaultScale}\n pdfUrl={pdfUrl}\n plugins={plugins}\n customStyles={customStyles}\n onLoad={(e: DocumentLoadEvent) => {\n setTotalPages(e.doc.numPages);\n\n const shouldAutoJumpToFirstMatch =\n !useCoordinates && !useRange && jumpToPageValue <= 0;\n\n if (jumpToPageValue > 0 && !useRange) {\n const index = jumpToPageValue - 1;\n const key = orderedKeys[index];\n const page = highlightPages[key];\n const cordinateTargetHighlight = highlightCordinatePages[index];\n setCursorIndex(index);\n\n console.log(cordinateTargetHighlight, \"cordinateTargetHighlight\");\n if (useCoordinates && cordinateTargetHighlight.pageIndex > 0)\n jumpToPage(cordinateTargetHighlight.pageIndex);\n\n if (page > 0) {\n setTimeout(() => {\n hideNonTargetHighlights(highlightPageSet);\n deduplicateHighlights(page - 1);\n }, 1000);\n if (!useCoordinates) {\n jumpToPage(page - 1);\n }\n }\n } else if (useRange && rangeOfPages && rangeOfPages.length === 2) {\n \n // Async function to handle sequential jumping and waiting\n const scanRangeSequence = async () => {\n const [startPage, endPage] = rangeOfPages;\n \n for (let p = startPage; p <= endPage; p++) {\n const targetPageIndex = p - 1;\n \n jumpToPage(targetPageIndex);\n \n // Pause execution for 1 second to let the DOM render the highlights\n await new Promise((resolve) => setTimeout(resolve, 1000));\n \n hideNonTargetHighlights(highlightPageSet);\n const matchSize = deduplicateHighlights(targetPageIndex);\n \n // If the returned size is greater than 0, a match was found. Stop the loop.\n if (matchSize && matchSize > 0) {\n break; \n }\n }\n };\n\n scanRangeSequence();\n\n } else if (!useCoordinates && highlightPages) {\n const firstKey = orderedKeys.find(k => highlightPages[k] > 0);\n if (firstKey !== undefined) {\n const firstPage = highlightPages[firstKey] - 1;\n jumpToPage(firstPage);\n setTimeout(() => {\n hideNonTargetHighlights(highlightPageSet);\n deduplicateHighlights(firstPage);\n }, 1000);\n }\n }\n\n requestAnimationFrame(() => {\n if (shouldAutoJumpToFirstMatch) {\n tryJump();\n }\n if (!useCoordinates && jumpToPageValue > 0 && !useRange) {\n scrollToHighlight();\n }\n });\n }}\n onPageChange={(e: PageChangeEvent) => {\n const currentPage = e.currentPage;\n setCurrentPage(currentPage);\n onCurrentPageChange?.(currentPage + 1);\n if (!highlightPageSet.has(currentPage)) {\n hideNonTargetHighlights(highlightPageSet);\n return;\n }\n deduplicateHighlights(currentPage);\n hideNonTargetHighlights(highlightPageSet);\n }}\n renderPage={resolvedRenderPage}\n setRenderRange={setRenderRange}\n />\n </div>\n );\n};\n\nexport default PdfViewer;\n"],"names":["PdfViewer","pdfUrl","highlightText","highlightPages","highlightCordinatePages","highlightColor","activeHighlightColor","jumpToPageValue","pdfName","onClose","customStyles","customClasses","customIcons","useCoordinates","fallbackPages","activeCitationIndex","onActiveCitationChange","headerAction","isZoomEnabled","showHighlightsAction","defaultScale","SpecialZoomLevel","ActualSize","useRange","rangeOfPages","showFullScreenAction","showRotateButton","segments","title","start_page","end_page","page_count","segmentTooltipText","onCurrentPageChange","navigationRequest","onNavigationSettled","disablePdfAnnotations","disablePdfTextLayer","renderPage","setRenderRange","viewerRef","useRef","resolvedDefaultScale","scale","PageFit","PageWidth","getResolvedScale","currentPage","setCurrentPage","useState","totalPages","setTotalPages","currentPageRotation","setCurrentPageRotation","lastNavigationRequestRef","navigationSettleTimerRef","navigationSettleSequenceRef","mutationObserverRef","pdfIdentifier","useMemo","URL","window","location","origin","pathname","split","pop","useEffect","rotationManager","setPdfIdentifier","onRotationChange","pageNum","angle","observer","MutationObserver","pageElements","current","querySelectorAll","registeredPages","Set","forEach","pageElement","match","getAttribute","length","pageNumber","parseInt","has","registerPageElement","add","observe","childList","subtree","attributes","disconnect","clearAll","getRotation","resolvedRenderPage","props","resolvedTextLayerChildren","jsx","style","display","children","textLayer","resolvedProps","annotationLayer","jsxs","Fragment","canvasLayer","highlightPageSet","map","h","pageIndex","set","Object","values","p","removeRedundantHighlightTexts","texts","filter","text","some","otherText","includes","highlightIndex","setHighlightIndex","cursorIndex","setCursorIndex","orderedKeys","totalHighlights","getValidPosition","tryJump","jumpToPage","zoomTo","plugins","controls","hideNonTargetHighlights","deduplicateHighlights","scrollToCoord","PdfHighlightControls","currentPosition","currentSegment","find","segment","modifiedControls","goToNext","goToPrevious","waitForNavigationToSettle","React","useCallback","request","settleSequence","clearTimeout","previousScrollTop","stableChecks","attempts","checkScrollPosition","scrollContainer","querySelector","targetPage","requestId","setTimeout","scrollTop","scrollRect","getBoundingClientRect","pageRect","isTargetVisible","Boolean","bottom","top","nextPage","Math","min","max","trunc","requestKey","ScannedDocCitation","pages","ref","className","pdfViewerWrapper","join","height","minHeight","minWidth","overflow","flexDirection","pdfStyles","pdfViewer","width","backgroundColor","PdfToolbar","onPageNavigate","onRotatePage","rotatePageBy90","PdfContainer","onLoad","e","doc","numPages","shouldAutoJumpToFirstMatch","index","key","page","cordinateTargetHighlight","console","log","async","startPage","endPage","targetPageIndex","Promise","resolve","matchSize","scanRangeSequence","firstKey","k","firstPage","requestAnimationFrame","pageVisitMap","i","push","occurrence","indexOf","doScrollToHighlight","scrollContainerRect","target","highlightRect","clientHeight","scrollTo","behavior","scrollToHighlight","onPageChange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PdfViewer.js","sources":["../../../src/features/PdfViewer/PdfViewer.tsx"],"sourcesContent":["import { DocumentLoadEvent, PageChangeEvent, RenderPage, SetRenderRange, SpecialZoomLevel, type LoadError } from \"@react-pdf-viewer/core\";\nimport PdfContainer from \"./PdfContainer\";\nimport PdfToolbar from \"./PdfToolbar\";\nimport { pdfStyles } from \"./PdfStyle\";\nimport { PdfHighlightControls } from \"./usePdfHighlight\";\nimport { rotationManager } from \"./rotationManager\";\nimport \"@react-pdf-viewer/zoom/lib/styles/index.css\";\nimport \"@react-pdf-viewer/page-navigation/lib/styles/index.css\";\nimport \"@react-pdf-viewer/core/lib/styles/index.css\";\nimport \"@react-pdf-viewer/search/lib/styles/index.css\";\nimport React, { useMemo, useRef, useEffect, useState } from \"react\";\nimport ScannedDocCitation, { CitationPage } from \"../ScannedDocCitation/ScannedDocCitation\";\nimport \"./PdfViewer.css\";\n\nexport type CustomIconsType = {\n pdfIcon?: React.ReactNode;\n fullScreenIcon?: React.ReactNode;\n downloadIcon?: React.ReactNode;\n closeIcon?: React.ReactNode;\n};\n\nexport type CustomStylesType = {\n pdfViewer?: React.CSSProperties;\n header?: React.CSSProperties;\n pdfIconWrapper?: React.CSSProperties;\n pdfName?: React.CSSProperties;\n pdfContainer?: React.CSSProperties;\n emptyState?: React.CSSProperties;\n};\n\nexport type CustomClassesType = {\n header?: string;\n pdfName?: string;\n actionButton?: string;\n pdfViewerWrapper?: string;\n};\n\nexport type PdfSegment = {\n title: string;\n start_page: number;\n end_page: number;\n page_count: number;\n};\n\ntype PdfScaleOption =\n | \"ActualSize\"\n | \"PageFit\"\n | \"PageWidth\"\n | number;\nexport interface PdfNavigationRequest {\n pageNumber: number;\n /** Change this value to navigate to the same page more than once. */\n requestId?: string | number;\n}\n\nexport interface PdfNavigationSettledEvent extends PdfNavigationRequest {\n pageNumber: number;\n}\n\nexport interface PdfViewerProps {\n pdfUrl?: string;\n highlightText: string[];\n highlightPages?: any;\n highlightCordinatePages: HighlightArea[];\n highlightColor?: string;\n activeHighlightColor?: string;\n jumpToPageValue?: number;\n pdfName?: string;\n onClose?: () => void;\n item?: any;\n customStyles?: CustomStylesType;\n customClasses?: CustomClassesType;\n customIcons?: CustomIconsType;\n useCoordinates: boolean;\n fallbackPages?: CitationPage[];\n activeCitationIndex?: number;\n onActiveCitationChange?: (index: number) => void;\n headerAction?: {\n icon?: React.ReactNode;\n onClick?: () => void;\n tooltip?: string;\n };\n isZoomEnabled?: boolean;\n showHighlightsAction?: boolean;\n defaultScale?: PdfScaleOption;\n useRange?: boolean; //\n rangeOfPages?: number[] | null;\n showFullScreenAction?: boolean;\n showRotateButton?: boolean;\n segments?: PdfSegment[];\n segmentTooltipText?: string;\n onCurrentPageChange?: (pageNumber: number) => void;\n navigationRequest?: PdfNavigationRequest | null;\n onNavigationSettled?: (event: PdfNavigationSettledEvent) => void;\n disablePdfAnnotations?: boolean;\n disablePdfTextLayer?: boolean;\n renderPage?: RenderPage;\n setRenderRange?: SetRenderRange;\n onError?: (error: LoadError) => void;\n}\n\nconst getResolvedScale = (\n scale?: PdfScaleOption\n): SpecialZoomLevel | number => {\n switch (scale) {\n case \"ActualSize\":\n return SpecialZoomLevel.ActualSize;\n\n case \"PageFit\":\n return SpecialZoomLevel.PageFit;\n\n case \"PageWidth\":\n return SpecialZoomLevel.PageWidth;\n\n default:\n return scale ?? SpecialZoomLevel.PageWidth;\n }\n};\n\nexport type HighlightArea = {\n pageIndex: number;\n left: number;\n top: number;\n width: number;\n height: number;\n pageNumber?: number;\n};\n\nconst PdfViewer = ({\n pdfUrl,\n highlightText,\n highlightPages,\n highlightCordinatePages,\n highlightColor = \"yellow\",\n activeHighlightColor = \"#f7dc51\",\n jumpToPageValue = 0,\n pdfName,\n onClose,\n customStyles,\n customClasses,\n customIcons,\n useCoordinates,\n fallbackPages,\n activeCitationIndex,\n onActiveCitationChange,\n headerAction,\n isZoomEnabled = true,\n showHighlightsAction = true,\n defaultScale = SpecialZoomLevel.ActualSize,\n useRange = false,\n rangeOfPages = null,\n showFullScreenAction=true,\n showRotateButton = false,\n segments = [\n {\n title: \"Document 2\",\n start_page: 52,\n end_page: 52,\n page_count: 1,\n },\n ],\n segmentTooltipText,\n onCurrentPageChange,\n navigationRequest,\n onNavigationSettled,\n disablePdfAnnotations = false,\n disablePdfTextLayer = false,\n renderPage,\n setRenderRange,\n onError\n}: PdfViewerProps) => {\n\n const viewerRef = useRef<HTMLDivElement | null>(null);\n const resolvedDefaultScale = getResolvedScale(defaultScale);\n const [currentPage, setCurrentPage] = useState(0);\n const [totalPages, setTotalPages] = useState(0);\n const [currentPageRotation, setCurrentPageRotation] = useState(0);\n const lastNavigationRequestRef = useRef<string | null>(null);\n const navigationSettleTimerRef = useRef<number | null>(null);\n const navigationSettleSequenceRef = useRef(0);\n const mutationObserverRef = useRef<MutationObserver | null>(null);\n\n // Generate PDF identifier for localStorage from URL\n const pdfIdentifier = useMemo(() => {\n if (!pdfUrl) return '';\n // Use last part of URL or hash it\n try {\n const url = new URL(pdfUrl, window.location.origin);\n return url.pathname.split('/').pop() || 'default';\n } catch {\n return 'default';\n }\n }, [pdfUrl]);\n\n // Set up rotation manager with PDF identifier\n useEffect(() => {\n if (pdfIdentifier) {\n rotationManager.setPdfIdentifier(pdfIdentifier);\n }\n }, [pdfIdentifier]);\n\n // Handler for rotating current page (no state update)\n const handleRotatePage = () => {\n const pageNumber = currentPage + 1;\n rotationManager.rotatePageBy90(pageNumber);\n // Manually update state to reflect rotation in UI\n setCurrentPageRotation(rotationManager.getRotation(pageNumber));\n };\n\n // Subscribe to rotation changes to sync UI state\n useEffect(() => {\n const unsubscribe = rotationManager.onRotationChange((pageNum, angle) => {\n // Only update state if current page rotated\n if (pageNum === currentPage + 1) {\n setCurrentPageRotation(angle);\n }\n });\n\n return unsubscribe;\n }, [currentPage]);\n\n // Register page elements with rotation manager\n useEffect(() => {\n const observer = new MutationObserver(() => {\n // Find all newly rendered page elements\n const pageElements = viewerRef.current?.querySelectorAll(\n '[data-testid^=\"core__page-layer-\"]'\n );\n\n const registeredPages = new Set<number>();\n\n pageElements?.forEach((pageElement) => {\n const match = (pageElement as HTMLElement)\n .getAttribute('data-testid')\n ?.match(/core__page-layer-(\\d+)/);\n if (match && match.length >= 2) {\n const pageIndex = parseInt(match[1], 10);\n const pageNumber = pageIndex + 1;\n\n // Only register once per page\n if (!registeredPages.has(pageNumber)) {\n rotationManager.registerPageElement(pageNumber, pageElement as HTMLElement);\n registeredPages.add(pageNumber);\n }\n }\n });\n });\n\n if (viewerRef.current) {\n observer.observe(viewerRef.current, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n mutationObserverRef.current = observer;\n }\n\n return () => {\n observer.disconnect();\n mutationObserverRef.current = null;\n };\n }, []);\n\n // Clean up when unmounting\n useEffect(() => {\n return () => {\n rotationManager.clearAll();\n if (mutationObserverRef.current) {\n mutationObserverRef.current.disconnect();\n }\n };\n }, []);\n\n // Update current page rotation when page changes\n useEffect(() => {\n const pageNumber = currentPage + 1;\n setCurrentPageRotation(rotationManager.getRotation(pageNumber));\n }, [currentPage]);\n const resolvedRenderPage = useMemo<RenderPage | undefined>(() => {\n if (!disablePdfAnnotations && !disablePdfTextLayer) return renderPage;\n\n return (props) => {\n const resolvedTextLayerChildren = disablePdfTextLayer ? (\n <div aria-hidden=\"true\" style={{ display: \"none\" }}>\n {props.textLayer.children}\n </div>\n ) : props.textLayer.children;\n const resolvedProps = {\n ...props,\n annotationLayer: {\n ...props.annotationLayer,\n children: disablePdfAnnotations ? null : props.annotationLayer.children,\n },\n textLayer: {\n ...props.textLayer,\n children: resolvedTextLayerChildren,\n },\n };\n\n const renderedPage = renderPage\n ? renderPage(resolvedProps)\n : (\n <>\n {props.canvasLayer.children}\n {resolvedTextLayerChildren}\n {!disablePdfAnnotations && props.annotationLayer.children}\n </>\n );\n\n return renderedPage;\n };\n }, [disablePdfAnnotations, disablePdfTextLayer, renderPage]);\n\n const cleanHighlightTexts = (texts: string[]): string[] => {\n if (!texts || texts.length === 0) return texts;\n return texts.filter((text) => {\n return !texts.some(\n (otherText) => otherText !== text && otherText.includes(text)\n );\n });\n };\n\n const highlightPageSet = useMemo(() => {\n if (useCoordinates) {\n return new Set(highlightCordinatePages.map((h: any) => h.pageIndex));\n } else {\n const set = new Set<number>();\n Object.values(highlightPages).forEach((p: any) => {\n if (p > 0) set.add(p - 1);\n });\n return set;\n }\n }, [highlightCordinatePages, highlightPages, useCoordinates]);\n\n const removeRedundantHighlightTexts = cleanHighlightTexts(highlightText);\n\n const {\n highlightIndex,\n setHighlightIndex,\n cursorIndex,\n setCursorIndex,\n orderedKeys,\n totalHighlights,\n getValidPosition,\n tryJump,\n jumpToPage,\n zoomTo,\n plugins,\n controls,\n hideNonTargetHighlights,\n deduplicateHighlights,\n scrollToCoord,\n } = PdfHighlightControls(\n removeRedundantHighlightTexts,\n !useCoordinates ? highlightPages : {},\n viewerRef,\n highlightPageSet,\n useCoordinates,\n useCoordinates ? highlightCordinatePages : [],\n highlightColor,\n activeHighlightColor\n );\n\n const currentPosition = getValidPosition(cursorIndex);\n const currentSegment = useMemo(() => {\n const pageNumber = currentPage + 1;\n return segments.find(\n (segment) =>\n pageNumber >= segment.start_page && pageNumber <= segment.end_page\n );\n }, [currentPage, segments]);\n\n // sync external activeCitationIndex → cursorIndex\n useEffect(() => {\n if (activeCitationIndex === undefined) return;\n if (activeCitationIndex === cursorIndex) return;\n setCursorIndex(activeCitationIndex);\n }, [activeCitationIndex]);\n\n // wrap controls to fire onActiveCitationChange\n const handleGoToNext = () => {\n if (cursorIndex >= totalHighlights - 1) return;\n controls.goToNext();\n if (onActiveCitationChange) onActiveCitationChange(cursorIndex + 1);\n };\n\n const handleGoToPrevious = () => {\n if (cursorIndex <= 0) return;\n controls.goToPrevious();\n if (onActiveCitationChange) onActiveCitationChange(cursorIndex - 1);\n };\n\n const modifiedControls = {\n ...controls,\n goToNext: handleGoToNext,\n goToPrevious: handleGoToPrevious,\n };\n\n const handlePageNavigate = (pageNumber: number) => {\n const nextPage = Math.min(Math.max(pageNumber, 1), totalPages || pageNumber);\n setCurrentPage(nextPage - 1);\n jumpToPage(nextPage - 1);\n };\n\n const waitForNavigationToSettle = React.useCallback((\n request: PdfNavigationRequest,\n pageNumber: number\n ) => {\n navigationSettleSequenceRef.current += 1;\n const settleSequence = navigationSettleSequenceRef.current;\n if (navigationSettleTimerRef.current != null) {\n window.clearTimeout(navigationSettleTimerRef.current);\n }\n\n let previousScrollTop: number | null = null;\n let stableChecks = 0;\n let attempts = 0;\n\n const checkScrollPosition = () => {\n if (navigationSettleSequenceRef.current !== settleSequence) return;\n\n attempts += 1;\n\n const scrollContainer = viewerRef.current?.querySelector(\n '.rpv-core__inner-pages'\n ) as HTMLElement | null;\n const targetPage = viewerRef.current?.querySelector(\n `[data-testid=\"core__page-layer-${pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n // Virtualized page layers are not guaranteed to be mounted on the first\n // check after jumpToPage. Keep polling so navigation completion is not\n // lost while React PDF Viewer is creating the target page DOM.\n if (!scrollContainer || !targetPage) {\n if (attempts >= 40) {\n navigationSettleTimerRef.current = null;\n onNavigationSettled?.({\n pageNumber,\n requestId: request.requestId,\n });\n return;\n }\n\n navigationSettleTimerRef.current = window.setTimeout(checkScrollPosition, 50);\n return;\n }\n\n if (previousScrollTop === scrollContainer.scrollTop) {\n stableChecks += 1;\n } else {\n previousScrollTop = scrollContainer.scrollTop;\n stableChecks = 0;\n }\n\n const scrollRect = scrollContainer.getBoundingClientRect();\n const pageRect = targetPage.getBoundingClientRect();\n const isTargetVisible = Boolean(\n scrollRect &&\n pageRect &&\n pageRect.bottom > scrollRect.top &&\n pageRect.top < scrollRect.bottom\n );\n const hasSettled = stableChecks >= 2 && isTargetVisible;\n const reachedTimeout = attempts >= 40;\n\n if (hasSettled || reachedTimeout) {\n navigationSettleTimerRef.current = null;\n onNavigationSettled?.({\n pageNumber,\n requestId: request.requestId,\n });\n return;\n }\n\n navigationSettleTimerRef.current = window.setTimeout(checkScrollPosition, 50);\n };\n\n navigationSettleTimerRef.current = window.setTimeout(checkScrollPosition, 50);\n }, [onNavigationSettled]);\n\n useEffect(() => () => {\n navigationSettleSequenceRef.current += 1;\n if (navigationSettleTimerRef.current != null) {\n window.clearTimeout(navigationSettleTimerRef.current);\n }\n }, []);\n\n useEffect(() => {\n if (!navigationRequest || totalPages <= 0) return;\n\n const nextPage = Math.min(\n Math.max(Math.trunc(navigationRequest.pageNumber), 1),\n totalPages\n );\n const requestKey = `${navigationRequest.requestId ?? nextPage}:${nextPage}`;\n if (lastNavigationRequestRef.current === requestKey) return;\n\n lastNavigationRequestRef.current = requestKey;\n setCurrentPage(nextPage - 1);\n jumpToPage(nextPage - 1);\n waitForNavigationToSettle(navigationRequest, nextPage);\n }, [jumpToPage, navigationRequest, totalPages, waitForNavigationToSettle]);\n\n if (!pdfUrl) {\n return (\n <ScannedDocCitation\n pages={fallbackPages}\n activeCitationIndex={activeCitationIndex}\n onActiveCitationChange={onActiveCitationChange}\n headerAction={headerAction}\n />\n );\n }\n\n const defaultViewerStyles: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n backgroundColor: \"#FAFAFA\",\n };\n\n const scrollToHighlight = () => {\n if (!viewerRef.current) return;\n\n const index = jumpToPageValue - 1;\n const key = orderedKeys[index];\n const page = highlightPages[key];\n const targetPage = page > 0 ? page - 1 : 0;\n\n const pageVisitMap: Record<number, number[]> = {};\n orderedKeys.forEach((k, i) => {\n const p = highlightPages[k];\n if (p > 0) {\n if (!pageVisitMap[p]) pageVisitMap[p] = [];\n pageVisitMap[p].push(i);\n }\n });\n const visits = pageVisitMap[page] || [];\n const occurrence = visits.indexOf(index);\n\n let attempts = 0;\n const maxAttempts = 40;\n\n const doScrollToHighlight = () => {\n attempts++;\n if (attempts > maxAttempts) return;\n\n const scrollContainer = viewerRef.current?.querySelector(\n \".rpv-core__inner-pages\"\n ) as HTMLElement;\n if (!scrollContainer) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const pageElement = viewerRef.current?.querySelector(\n `[data-testid=\"core__page-layer-${targetPage}\"]`\n );\n if (!pageElement) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const scrollContainerRect = scrollContainer.getBoundingClientRect();\n const pageRect = pageElement.getBoundingClientRect();\n const isPageVisible =\n pageRect.top < scrollContainerRect.bottom &&\n pageRect.bottom > scrollContainerRect.top;\n\n if (!isPageVisible) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const allHighlights = pageElement.querySelectorAll(\".rpv-search__highlight\");\n const target = allHighlights[occurrence] as HTMLElement;\n\n if (!target) {\n setTimeout(doScrollToHighlight, 100);\n return;\n }\n\n const highlightRect = target.getBoundingClientRect();\n const scrollTop =\n scrollContainer.scrollTop +\n (highlightRect.top - scrollContainerRect.top) -\n scrollContainer.clientHeight / 2 +\n highlightRect.height / 2;\n\n scrollContainer.scrollTo({ top: scrollTop, behavior: \"smooth\" });\n };\n\n setTimeout(doScrollToHighlight, 500);\n };\n\n return (\n <div\n ref={viewerRef}\n className={[\"citation-pdf-viewer\", customClasses?.pdfViewerWrapper]\n .filter(Boolean)\n .join(\" \")}\n data-disable-pdf-annotations={\n disablePdfAnnotations ? \"true\" : undefined\n }\n data-pdf-page-fit={\n resolvedDefaultScale === SpecialZoomLevel.PageFit ? \"true\" : undefined\n }\n style={{\n height: \"100%\",\n minHeight: 0,\n minWidth: 0,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n ...pdfStyles.pdfViewer,\n ...defaultViewerStyles,\n ...customStyles?.pdfViewer,\n backgroundColor: \"#F1F5F9\",\n }}\n >\n <PdfToolbar\n highlightIndex={highlightIndex}\n totalHighlights={totalHighlights}\n controls={modifiedControls}\n currentPosition={currentPosition}\n pdfName={pdfName}\n onClose={onClose}\n pdfUrl={pdfUrl}\n viewerRef={viewerRef}\n customStyles={customStyles}\n customClasses={customClasses}\n customIcons={customIcons}\n headerAction={headerAction}\n isZoomEnabled={isZoomEnabled}\n showHighlightsAction={showHighlightsAction}\n showFullScreenAction={showFullScreenAction} \n currentSegment={currentSegment}\n segmentTooltipText={segmentTooltipText}\n currentPage={currentPage + 1}\n totalPages={totalPages}\n onPageNavigate={handlePageNavigate}\n onRotatePage={handleRotatePage}\n currentPageRotation={currentPageRotation}\n showRotateButton={showRotateButton}\n />\n <PdfContainer\n defaultScale={resolvedDefaultScale}\n pdfUrl={pdfUrl}\n plugins={plugins}\n customStyles={customStyles}\n onError={onError}\n onLoad={(e: DocumentLoadEvent) => {\n setTotalPages(e.doc.numPages);\n\n const shouldAutoJumpToFirstMatch =\n !useCoordinates && !useRange && jumpToPageValue <= 0;\n\n if (jumpToPageValue > 0 && !useRange) {\n const index = jumpToPageValue - 1;\n const key = orderedKeys[index];\n const page = highlightPages[key];\n const cordinateTargetHighlight = highlightCordinatePages[index];\n setCursorIndex(index);\n\n console.log(cordinateTargetHighlight, \"cordinateTargetHighlight\");\n if (useCoordinates && cordinateTargetHighlight.pageIndex > 0)\n jumpToPage(cordinateTargetHighlight.pageIndex);\n\n if (page > 0) {\n setTimeout(() => {\n hideNonTargetHighlights(highlightPageSet);\n deduplicateHighlights(page - 1);\n }, 1000);\n if (!useCoordinates) {\n jumpToPage(page - 1);\n }\n }\n } else if (useRange && rangeOfPages && rangeOfPages.length === 2) {\n \n // Async function to handle sequential jumping and waiting\n const scanRangeSequence = async () => {\n const [startPage, endPage] = rangeOfPages;\n \n for (let p = startPage; p <= endPage; p++) {\n const targetPageIndex = p - 1;\n \n jumpToPage(targetPageIndex);\n \n // Pause execution for 1 second to let the DOM render the highlights\n await new Promise((resolve) => setTimeout(resolve, 1000));\n \n hideNonTargetHighlights(highlightPageSet);\n const matchSize = deduplicateHighlights(targetPageIndex);\n \n // If the returned size is greater than 0, a match was found. Stop the loop.\n if (matchSize && matchSize > 0) {\n break; \n }\n }\n };\n\n scanRangeSequence();\n\n } else if (!useCoordinates && highlightPages) {\n const firstKey = orderedKeys.find(k => highlightPages[k] > 0);\n if (firstKey !== undefined) {\n const firstPage = highlightPages[firstKey] - 1;\n jumpToPage(firstPage);\n setTimeout(() => {\n hideNonTargetHighlights(highlightPageSet);\n deduplicateHighlights(firstPage);\n }, 1000);\n }\n }\n\n requestAnimationFrame(() => {\n if (shouldAutoJumpToFirstMatch) {\n tryJump();\n }\n if (!useCoordinates && jumpToPageValue > 0 && !useRange) {\n scrollToHighlight();\n }\n });\n }}\n onPageChange={(e: PageChangeEvent) => {\n const currentPage = e.currentPage;\n setCurrentPage(currentPage);\n onCurrentPageChange?.(currentPage + 1);\n if (!highlightPageSet.has(currentPage)) {\n hideNonTargetHighlights(highlightPageSet);\n return;\n }\n deduplicateHighlights(currentPage);\n hideNonTargetHighlights(highlightPageSet);\n }}\n renderPage={resolvedRenderPage}\n setRenderRange={setRenderRange}\n />\n </div>\n );\n};\n\nexport default PdfViewer;\n"],"names":["PdfViewer","pdfUrl","highlightText","highlightPages","highlightCordinatePages","highlightColor","activeHighlightColor","jumpToPageValue","pdfName","onClose","customStyles","customClasses","customIcons","useCoordinates","fallbackPages","activeCitationIndex","onActiveCitationChange","headerAction","isZoomEnabled","showHighlightsAction","defaultScale","SpecialZoomLevel","ActualSize","useRange","rangeOfPages","showFullScreenAction","showRotateButton","segments","title","start_page","end_page","page_count","segmentTooltipText","onCurrentPageChange","navigationRequest","onNavigationSettled","disablePdfAnnotations","disablePdfTextLayer","renderPage","setRenderRange","onError","viewerRef","useRef","resolvedDefaultScale","scale","PageFit","PageWidth","getResolvedScale","currentPage","setCurrentPage","useState","totalPages","setTotalPages","currentPageRotation","setCurrentPageRotation","lastNavigationRequestRef","navigationSettleTimerRef","navigationSettleSequenceRef","mutationObserverRef","pdfIdentifier","useMemo","URL","window","location","origin","pathname","split","pop","useEffect","rotationManager","setPdfIdentifier","onRotationChange","pageNum","angle","observer","MutationObserver","pageElements","current","querySelectorAll","registeredPages","Set","forEach","pageElement","match","getAttribute","length","pageNumber","parseInt","has","registerPageElement","add","observe","childList","subtree","attributes","disconnect","clearAll","getRotation","resolvedRenderPage","props","resolvedTextLayerChildren","jsx","style","display","children","textLayer","resolvedProps","annotationLayer","jsxs","Fragment","canvasLayer","highlightPageSet","map","h","pageIndex","set","Object","values","p","removeRedundantHighlightTexts","texts","filter","text","some","otherText","includes","highlightIndex","setHighlightIndex","cursorIndex","setCursorIndex","orderedKeys","totalHighlights","getValidPosition","tryJump","jumpToPage","zoomTo","plugins","controls","hideNonTargetHighlights","deduplicateHighlights","scrollToCoord","PdfHighlightControls","currentPosition","currentSegment","find","segment","modifiedControls","goToNext","goToPrevious","waitForNavigationToSettle","React","useCallback","request","settleSequence","clearTimeout","previousScrollTop","stableChecks","attempts","checkScrollPosition","scrollContainer","querySelector","targetPage","requestId","setTimeout","scrollTop","scrollRect","getBoundingClientRect","pageRect","isTargetVisible","Boolean","bottom","top","nextPage","Math","min","max","trunc","requestKey","ScannedDocCitation","pages","ref","className","pdfViewerWrapper","join","height","minHeight","minWidth","overflow","flexDirection","pdfStyles","pdfViewer","width","backgroundColor","PdfToolbar","onPageNavigate","onRotatePage","rotatePageBy90","PdfContainer","onLoad","e","doc","numPages","shouldAutoJumpToFirstMatch","index","key","page","cordinateTargetHighlight","console","log","async","startPage","endPage","targetPageIndex","Promise","resolve","matchSize","scanRangeSequence","firstKey","k","firstPage","requestAnimationFrame","pageVisitMap","i","push","occurrence","indexOf","doScrollToHighlight","scrollContainerRect","target","highlightRect","clientHeight","scrollTo","behavior","scrollToHighlight","onPageChange"],"mappings":"stBAqGA,MA2BMA,EAAY,EAChBC,SACAC,gBACAC,iBACAC,0BACAC,iBAAiB,SACjBC,uBAAuB,UACvBC,kBAAkB,EAClBC,UACAC,UACAC,eACAC,gBACAC,cACAC,iBACAC,gBACAC,sBACAC,yBACAC,eACAC,iBAAgB,EAChBC,wBAAuB,EACvBC,eAAeC,EAAiBC,WAChCC,YAAW,EACXC,eAAe,KACfC,wBAAqB,EACrBC,oBAAmB,EACnBC,WAAW,CACT,CACEC,MAAO,aACPC,WAAY,GACZC,SAAU,GACVC,WAAY,IAGhBC,qBACAC,sBACAC,oBACAC,sBACAC,yBAAwB,EACxBC,uBAAsB,EACtBC,aACAC,iBACAC,cAGM,MAAAC,EAAYC,EAA8B,MAC1CC,EAxEiB,CACvBC,IAEA,OAAQA,GACN,IAAK,aACH,OAAOvB,EAAiBC,WAE1B,IAAK,UACH,OAAOD,EAAiBwB,QAE1B,IAAK,YACH,OAAOxB,EAAiByB,UAE1B,QACE,OAAOF,GAASvB,EAAiByB,YA0DRC,CAAiB3B,IACvC4B,EAAaC,GAAkBC,EAAS,IACxCC,EAAYC,IAAiBF,EAAS,IACtCG,GAAqBC,IAA0BJ,EAAS,GACzDK,GAA2Bb,EAAsB,MACjDc,GAA2Bd,EAAsB,MACjDe,GAA8Bf,EAAO,GACrCgB,GAAsBhB,EAAgC,MAGtDiB,GAAgBC,EAAQ,KACxB,IAAC3D,EAAe,MAAA,GAEhB,IAEF,OADY,IAAI4D,IAAI5D,EAAQ6D,OAAOC,SAASC,QACjCC,SAASC,MAAM,KAAKC,OAAS,SAAA,CAClC,MACC,MAAA,SACT,GACC,CAAClE,IAGJmE,EAAU,KACJT,IACFU,EAAgBC,iBAAiBX,KAElC,CAACA,KAWJS,EAAU,IACYC,EAAgBE,iBAAiB,CAACC,EAASC,KAEzDD,IAAYxB,EAAc,GAC5BM,GAAuBmB,KAK1B,CAACzB,IAGJoB,EAAU,KACF,MAAAM,EAAW,IAAIC,iBAAiB,KAE9B,MAAAC,EAAenC,EAAUoC,SAASC,iBACtC,sCAGIC,MAAsBC,IAEdJ,GAAAK,QAASC,IACrB,MAAMC,EAASD,EACZE,aAAa,gBACZD,MAAM,0BACN,GAAAA,GAASA,EAAME,QAAU,EAAG,CAC9B,MACMC,EADYC,SAASJ,EAAM,GAAI,IACN,EAG1BJ,EAAgBS,IAAIF,KACPjB,EAAAoB,oBAAoBH,EAAYJ,GAChDH,EAAgBW,IAAIJ,GAExB,MAaJ,OATI7C,EAAUoC,UACHH,EAAAiB,QAAQlD,EAAUoC,QAAS,CAClCe,WAAW,EACXC,SAAS,EACTC,YAAY,IAEdpC,GAAoBmB,QAAUH,GAGzB,KACLA,EAASqB,aACTrC,GAAoBmB,QAAU,OAE/B,IAGHT,EAAU,IACD,KACLC,EAAgB2B,WACZtC,GAAoBmB,SACtBnB,GAAoBmB,QAAQkB,cAG/B,IAGH3B,EAAU,KACR,MAAMkB,EAAatC,EAAc,EACVM,GAAAe,EAAgB4B,YAAYX,KAClD,CAACtC,IACE,MAAAkD,GAAqBtC,EAAgC,IACpDxB,GAA0BC,EAEvB8D,IACN,MAAMC,EAA4B/D,EAChCgE,EAAC,MAAI,CAAA,cAAY,OAAOC,MAAO,CAAEC,QAAS,QACvCC,SAAML,EAAAM,UAAUD,WAEjBL,EAAMM,UAAUD,SACdE,EAAgB,IACjBP,EACHQ,gBAAiB,IACZR,EAAMQ,gBACTH,SAAUpE,EAAwB,KAAO+D,EAAMQ,gBAAgBH,UAEjEC,UAAW,IACNN,EAAMM,UACTD,SAAUJ,IAcP,OAVc9D,EACjBA,EAAWoE,GAGRE,EAAAC,EAAA,CAAAL,SAAA,CAAAL,EAAMW,YAAYN,SAClBJ,GACChE,GAAyB+D,EAAMQ,gBAAgBH,aA1BElE,EAgC1D,CAACF,EAAuBC,EAAqBC,IAW1CyE,GAAmBnD,EAAQ,KAC/B,GAAI/C,EACK,OAAA,IAAImE,IAAI5E,EAAwB4G,IAAKC,GAAWA,EAAEC,YACpD,CACC,MAAAC,MAAUnC,IAIT,OAHPoC,OAAOC,OAAOlH,GAAgB8E,QAASqC,IACjCA,EAAI,GAAOH,EAAAzB,IAAI4B,EAAI,KAElBH,CACT,GACC,CAAC/G,EAAyBD,EAAgBU,IAEvC0G,IArBuBC,GAqB6BtH,IApBzB,IAAjBsH,GAAMnC,OACbmC,GAAMC,OAAQC,IACXF,GAAMG,KACXC,GAAcA,IAAcF,GAAQE,EAAUC,SAASH,KAHnBF,GADf,IAACA,GAuBvB,MAAAM,eACJA,GAAAC,kBACAA,GAAAC,YACAA,GAAAC,eACAA,GAAAC,YACAA,GAAAC,gBACAA,GAAAC,iBACAA,GAAAC,QACAA,GAAAC,WACAA,GAAAC,OACAA,GAAAC,QACAA,GAAAC,SACAA,GAAAC,wBACAA,GAAAC,sBACAA,GAAAC,cACAA,IACEC,EACFtB,GACC1G,EAAkC,CAAC,EAAlBV,EAClBsC,EACAsE,GACAlG,EACAA,EAAiBT,EAA0B,GAC3CC,EACAC,GAGIwI,GAAkBV,GAAiBJ,IACnCe,GAAiBnF,EAAQ,KAC7B,MAAM0B,EAAatC,EAAc,EACjC,OAAOrB,EAASqH,KACbC,GACC3D,GAAc2D,EAAQpH,YAAcyD,GAAc2D,EAAQnH,WAE7D,CAACkB,EAAarB,IAGjByC,EAAU,UAC+B,IAAnCrD,GACAA,IAAwBiH,IAC5BC,GAAelH,IACd,CAACA,IAGJ,MAYMmI,GAAmB,IACpBT,GACHU,SAdqB,KACjBnB,IAAeG,GAAkB,IACrCM,GAASU,WACLnI,GAA+CA,EAAAgH,GAAc,KAYjEoB,aATyB,KACrBpB,IAAe,IACnBS,GAASW,eACLpI,GAA+CA,EAAAgH,GAAc,MAe7DqB,GAA4BC,EAAMC,YAAY,CAClDC,EACAlE,KAEA7B,GAA4BoB,SAAW,EACvC,MAAM4E,EAAiBhG,GAA4BoB,QACX,MAApCrB,GAAyBqB,SACpBf,OAAA4F,aAAalG,GAAyBqB,SAG/C,IAAI8E,EAAmC,KACnCC,EAAe,EACfC,EAAW,EAEf,MAAMC,EAAsB,KACtB,GAAArG,GAA4BoB,UAAY4E,EAAgB,OAEhDI,GAAA,EAEN,MAAAE,EAAkBtH,EAAUoC,SAASmF,cACzC,0BAEIC,EAAaxH,EAAUoC,SAASmF,cACpC,kCAAkC1E,EAAa,OAM7C,IAACyE,IAAoBE,EACvB,OAAIJ,GAAY,IACdrG,GAAyBqB,QAAU,UACb1C,IAAA,CACpBmD,aACA4E,UAAWV,EAAQU,kBAKvB1G,GAAyBqB,QAAUf,OAAOqG,WAAWL,EAAqB,KAIxEH,IAAsBI,EAAgBK,UACxBR,GAAA,GAEhBD,EAAoBI,EAAgBK,UACrBR,EAAA,GAGX,MAAAS,EAAaN,EAAgBO,wBAC7BC,EAAWN,EAAWK,wBACtBE,EAAkBC,QACtBJ,GACAE,GACAA,EAASG,OAASL,EAAWM,KAC7BJ,EAASI,IAAMN,EAAWK,QAK5B,GAHmBd,GAAgB,GAAKY,GACjBX,GAAY,GAQjC,OALArG,GAAyBqB,QAAU,UACb1C,IAAA,CACpBmD,aACA4E,UAAWV,EAAQU,YAKvB1G,GAAyBqB,QAAUf,OAAOqG,WAAWL,EAAqB,KAG5EtG,GAAyBqB,QAAUf,OAAOqG,WAAWL,EAAqB,KACzE,CAAC3H,IAyBJ,GAvBAiC,EAAU,IAAM,KACdX,GAA4BoB,SAAW,EACC,MAApCrB,GAAyBqB,SACpBf,OAAA4F,aAAalG,GAAyBqB,UAE9C,IAEHT,EAAU,KACJ,IAAClC,GAAqBiB,GAAc,EAAG,OAE3C,MAAMyH,EAAWC,KAAKC,IACpBD,KAAKE,IAAIF,KAAKG,MAAM9I,EAAkBoD,YAAa,GACnDnC,GAEI8H,EAAa,GAAG/I,EAAkBgI,WAAaU,KAAYA,IAC7DrH,GAAyBsB,UAAYoG,IAEzC1H,GAAyBsB,QAAUoG,EACnChI,EAAe2H,EAAW,GAC1BtC,GAAWsC,EAAW,GACtBvB,GAA0BnH,EAAmB0I,KAC5C,CAACtC,GAAYpG,EAAmBiB,EAAYkG,MAE1CpJ,EAED,OAAAoG,EAAC6E,EAAA,CACCC,MAAOrK,EACPC,sBACAC,yBACAC,iBAwFJ,OAAA2F,EAAC,MAAA,CACCwE,IAAK3I,EACL4I,UAAW,CAAC,sBAAuB1K,GAAe2K,kBAC/C7D,OAAOgD,SACPc,KAAK,KACR,+BACEnJ,EAAwB,YAAS,EAEnC,oBACEO,IAAyBtB,EAAiBwB,QAAU,YAAS,EAE/DyD,MAAO,CACLkF,OAAQ,OACRC,UAAW,EACXC,SAAU,EACVC,SAAU,SACVpF,QAAS,OACTqF,cAAe,YACZC,EAAUC,UApGjBvF,QAAS,OACTqF,cAAe,SACfJ,OAAQ,OACRO,MAAO,OACPC,gBAAiB,aAkGVtL,GAAcoL,UACjBE,gBAAiB,WAGnBxF,SAAA,CAAAH,EAAC4F,EAAA,CACCnE,kBACAK,mBACAM,SAAUS,GACVJ,mBACAtI,UACAC,UACAR,SACAwC,YACA/B,eACAC,gBACAC,cACAK,eACAC,gBACAC,uBACAM,uBACAsH,kBACA/G,qBACAgB,YAAaA,EAAc,EAC3BG,aACA+I,eAnPsB5G,IACpB,MAAAsF,EAAWC,KAAKC,IAAID,KAAKE,IAAIzF,EAAY,GAAInC,GAAcmC,GACjErC,EAAe2H,EAAW,GAC1BtC,GAAWsC,EAAW,IAiPlBuB,aAxbmB,KACvB,MAAM7G,EAAatC,EAAc,EACjCqB,EAAgB+H,eAAe9G,GAERhC,GAAAe,EAAgB4B,YAAYX,KAqb/CjC,uBACA3B,qBAEF2E,EAACgG,EAAA,CACCjL,aAAcuB,EACd1C,SACAuI,WACA9H,eACA8B,UACA8J,OAASC,IACOnJ,GAAAmJ,EAAEC,IAAIC,UAEpB,MAAMC,GACH7L,IAAmBU,GAAYhB,GAAmB,EAEjD,GAAAA,EAAkB,IAAMgB,EAAU,CACpC,MAAMoL,EAAQpM,EAAkB,EAC1BqM,EAAM1E,GAAYyE,GAClBE,EAAO1M,EAAeyM,GACtBE,EAA2B1M,EAAwBuM,GACzD1E,GAAe0E,GAEPI,QAAAC,IAAIF,EAA0B,4BAClCjM,GAAkBiM,EAAyB5F,UAAY,GACzDoB,GAAWwE,EAAyB5F,WAElC2F,EAAO,IACT1C,WAAW,KACTzB,GAAwB3B,IACxB4B,GAAsBkE,EAAO,IAC5B,KACEhM,GACHyH,GAAWuE,EAAO,GAGb,MAAA,GAAAtL,GAAYC,GAAwC,IAAxBA,EAAa6D,OAAc,CAGtC4H,WAClB,MAACC,EAAWC,GAAW3L,EAE7B,IAAA,IAAS8F,EAAI4F,EAAW5F,GAAK6F,EAAS7F,IAAK,CACzC,MAAM8F,EAAkB9F,EAAI,EAE5BgB,GAAW8E,SAGL,IAAIC,QAASC,GAAYnD,WAAWmD,EAAS,MAEnD5E,GAAwB3B,IAClB,MAAAwG,EAAY5E,GAAsByE,GAGpC,GAAAG,GAAaA,EAAY,EAC3B,KAEJ,GAGgBC,EAAA,MAEpB,IAAY3M,GAAkBV,EAAgB,CAC5C,MAAMsN,EAAWvF,GAAYc,QAAU7I,EAAeuN,GAAK,GAC3D,QAA4B,IAAxBD,EAAwB,CACpB,MAAAE,EAAYxN,EAAesN,GAAY,EAC7CnF,GAAWqF,GACXxD,WAAW,KACTzB,GAAwB3B,IACxB4B,GAAsBgF,IACrB,IACL,CACF,CAEAC,sBAAsB,KAChBlB,GACMrE,MAELxH,GAAkBN,EAAkB,IAAMgB,GAtM/B,MACpB,IAACkB,EAAUoC,QAAS,OAExB,MAAM8H,EAAQpM,EAAkB,EAC1BqM,EAAM1E,GAAYyE,GAClBE,EAAO1M,EAAeyM,GACtB3C,EAAa4C,EAAO,EAAIA,EAAO,EAAI,EAEnCgB,EAAyC,CAAA,EACnC3F,GAAAjD,QAAQ,CAACyI,EAAGI,KAChB,MAAAxG,EAAInH,EAAeuN,GACrBpG,EAAI,IACDuG,EAAavG,KAAiBuG,EAAAvG,GAAK,IAC3BuG,EAAAvG,GAAGyG,KAAKD,MAGzB,MACME,GADSH,EAAahB,IAAS,IACXoB,QAAQtB,GAElC,IAAI9C,EAAW,EACf,MAEMqE,EAAsB,KAE1B,GADArE,IACIA,EAJc,GAIU,OAEtB,MAAAE,EAAkBtH,EAAUoC,SAASmF,cACzC,0BAEF,IAAKD,EAEH,YADAI,WAAW+D,EAAqB,KAI5B,MAAAhJ,EAAczC,EAAUoC,SAASmF,cACrC,kCAAkCC,OAEpC,IAAK/E,EAEH,YADAiF,WAAW+D,EAAqB,KAI5B,MAAAC,EAAsBpE,EAAgBO,wBACtCC,EAAWrF,EAAYoF,wBAK7B,KAHEC,EAASI,IAAMwD,EAAoBzD,QACnCH,EAASG,OAASyD,EAAoBxD,KAItC,YADAR,WAAW+D,EAAqB,KAI5B,MACAE,EADgBlJ,EAAYJ,iBAAiB,0BACtBkJ,GAE7B,IAAKI,EAEH,YADAjE,WAAW+D,EAAqB,KAI5B,MAAAG,EAAgBD,EAAO9D,wBACvBF,EACJL,EAAgBK,WACfiE,EAAc1D,IAAMwD,EAAoBxD,KACzCZ,EAAgBuE,aAAe,EAC/BD,EAAc7C,OAAS,EAEzBzB,EAAgBwE,SAAS,CAAE5D,IAAKP,EAAWoE,SAAU,YAGvDrE,WAAW+D,EAAqB,MAgIJO,MAIxBC,aAAenC,IACb,MAAMvJ,EAAcuJ,EAAEvJ,YACtBC,EAAeD,GACff,IAAsBe,EAAc,GAC/B+D,GAAiBvB,IAAIxC,IAI1B2F,GAAsB3F,GACtB0F,GAAwB3B,KAJtB2B,GAAwB3B,KAM5BzE,WAAY4D,GACZ3D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsxs as r,jsx as i}from"react/jsx-runtime";import e from"@mui/material/Box";import o from"@mui/material/Stack";import t from"@mui/material/Typography";function a({icon:a,description:n}){return r(o,{direction:"row",alignItems:"flex-start",spacing:.625,sx:{px:.75,py:.625,border:"1px solid #86EFAC",borderRadius:2,bgcolor:"#FFFFFF",color:"#16A34A"},children:[i(e,{"aria-hidden":"true",sx:{display:"flex",flexShrink:0,mt:"1px",fontSize:14},children:a}),i(t,{sx:{minWidth:0,color:"inherit",fontSize:11,lineHeight:1.5,overflowWrap:"anywhere"},children:n})]})}export{a as default};
|
|
2
|
+
//# sourceMappingURL=ApprovalDescriptionBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalDescriptionBanner.js","sources":["../../../src/features/SegmentReviewComponents/ApprovalDescriptionBanner.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nexport interface ApprovalDescriptionBannerProps {\n icon: ReactNode;\n description: string;\n}\n\n/**\n * Green confirmation banner shown above the revert action, e.g.\n * \"A reviewer confirmed this document's page range.\"\n */\nexport default function ApprovalDescriptionBanner({\n icon,\n description,\n}: ApprovalDescriptionBannerProps) {\n return (\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n spacing={0.625}\n sx={{\n px: 0.75,\n py: 0.625,\n border: '1px solid #86EFAC',\n borderRadius: 2,\n bgcolor: '#FFFFFF',\n color: '#16A34A',\n }}\n >\n <Box\n aria-hidden=\"true\"\n sx={{ display: 'flex', flexShrink: 0, mt: '1px', fontSize: 14 }}\n >\n {icon}\n </Box>\n <Typography\n sx={{\n minWidth: 0,\n color: 'inherit',\n fontSize: 11,\n lineHeight: 1.5,\n overflowWrap: 'anywhere',\n }}\n >\n {description}\n </Typography>\n </Stack>\n );\n}"],"names":["ApprovalDescriptionBanner","icon","description","jsxs","Stack","direction","alignItems","spacing","sx","px","py","border","borderRadius","bgcolor","color","children","jsx","Box","display","flexShrink","mt","fontSize","Typography","minWidth","lineHeight","overflowWrap"],"mappings":"8JAcA,SAAwBA,GAA0BC,KAChDA,EAAAC,YACAA,IAGE,OAAAC,EAACC,EAAA,CACCC,UAAU,MACVC,WAAW,aACXC,QAAS,KACTC,GAAI,CACFC,GAAI,IACJC,GAAI,KACJC,OAAQ,oBACRC,aAAc,EACdC,QAAS,UACTC,MAAO,WAGTC,SAAA,CAAAC,EAACC,EAAA,CACC,cAAY,OACZT,GAAI,CAAEU,QAAS,OAAQC,WAAY,EAAGC,GAAI,MAAOC,SAAU,IAE1DN,SAAAd,IAEHe,EAACM,EAAA,CACCd,GAAI,CACFe,SAAU,EACVT,MAAO,UACPO,SAAU,GACVG,WAAY,IACZC,aAAc,YAGfV,SAAAb,MAIT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as e,jsx as r}from"react/jsx-runtime";import{useState as i}from"react";import o from"@mui/material/Box";import t from"@mui/material/Button";import n from"@mui/material/ButtonBase";import
|
|
1
|
+
import{jsxs as e,jsx as r}from"react/jsx-runtime";import{useState as i}from"react";import o from"@mui/material/Box";import t from"@mui/material/Button";import n from"@mui/material/ButtonBase";import a from"@mui/material/Divider";import l from"@mui/material/Stack";import d from"@mui/material/Tooltip";import c from"@mui/material/Typography";import{ChevronLeft as s}from"lucide-react";const m=({startPage:e,endPage:r})=>`Pages ${e}-${r}`,h=({segment:i})=>e(o,{sx:{px:.75,py:.625,minWidth:0},children:[r(c,{sx:{color:"text.secondary",fontSize:11,lineHeight:1.3,overflowWrap:"anywhere"},children:i.title}),r(c,{sx:{color:"text.primary",fontSize:12,fontWeight:400,lineHeight:1.3},children:m(i)})]});function f({icon:m,title:f,pageRange:p,description:b,onRevert:u,onRevertComplete:v,onRevertError:y,revertData:C,confirmDisabled:S=!1,showDocumentHeader:R=!0,onSaveAsLearning:w,onSaveAsLearningError:W,saveAsLearningDisabled:z=!1}){const[k,H]=i(!1),[F,A]=i(!1),B=C.previousSegments.length>0,E=async()=>{if(!F&&!S){A(!0);try{const e=await u();v?.(e)}catch(e){y?.(e)}finally{A(!1)}}};return e(l,{spacing:.875,sx:{minWidth:0},children:[R&&e(o,{sx:{minWidth:0},children:[r(c,{sx:{color:"text.primary",fontSize:14,fontWeight:500,lineHeight:1.4,overflowWrap:"anywhere"},children:f}),r(c,{sx:{color:"text.secondary",fontSize:12,lineHeight:1.4},children:p})]}),r(a,{sx:{borderStyle:"dashed",borderColor:"#CBD5E1"}}),k?e(l,{spacing:.75,children:[e(n,{onClick:()=>H(!1),"aria-label":"Back from revert confirmation",sx:{width:"fit-content",borderRadius:.5,color:"text.primary",fontSize:13,fontWeight:500,lineHeight:1.3,textAlign:"left"},children:[r(o,{component:"span","aria-hidden":"true",sx:{mr:.625,alignItems:"center",display:"flex"},children:r(s,{size:16})}),"Revert"]}),e(o,B?{sx:{p:.75,borderRadius:1,bgcolor:"#F8FAFC"},children:[r(c,{sx:{mb:.375,color:"text.secondary",fontSize:12},children:"Current"}),r(o,{sx:{mb:.75,border:"1px solid #E2E8F0",borderRadius:1,bgcolor:"background.paper"},children:r(h,{segment:C.currentSegment})}),r(c,{sx:{mb:.375,color:"text.secondary",fontSize:12},children:"After Revert"}),r(o,{sx:{border:"1px solid #E2E8F0",borderRadius:1,bgcolor:"background.paper",overflow:"hidden"},children:C.previousSegments.map((i,t)=>e(o,{children:[t>0&&r(a,{sx:{borderColor:"#E2E8F0"}}),r(h,{segment:i})]},`${i.title}-${i.startPage}-${i.endPage}-${t}`))}),e(l,{direction:"row",spacing:1,sx:{mt:.875},children:[r(t,{variant:"outlined",fullWidth:!0,disabled:F,onClick:()=>H(!1),sx:g,children:"Cancel"}),r(d,{title:S?"Revert data is not present, cannot revert this":"",disableHoverListener:!S,arrow:!0,children:r("span",{style:{flex:1},children:r(t,{variant:"contained",fullWidth:!0,disabled:F||S,onClick:()=>{E()},sx:x,children:F?"Reverting…":"Confirm"})})})]})]}:{sx:{p:.875,borderRadius:1,bgcolor:"#F8FAFC"},children:[r(c,{sx:{color:"text.secondary",fontSize:12,fontWeight:500},children:"Revert approval?"}),r(c,{sx:{mt:.75,color:"text.secondary",fontSize:13,lineHeight:1.45},children:"This document will be moved back to pending review and will need to be confirmed again."}),e(l,{direction:"row",spacing:1,sx:{mt:1},children:[r(t,{variant:"outlined",fullWidth:!0,disabled:F,onClick:()=>H(!1),sx:g,children:"Cancel"}),r(d,{title:S?"Revert data is not present, cannot revert this":"",disableHoverListener:!S,arrow:!0,children:r("span",{style:{flex:1},children:r(t,{variant:"contained",fullWidth:!0,disabled:F||S,onClick:()=>{E()},sx:x,children:F?"Reverting…":"Confirm"})})})]})]})]}):r(t,{variant:"outlined",fullWidth:!0,onClick:()=>H(!0),sx:{minHeight:36,borderColor:"#9B8AFB",color:"#5925DC",borderRadius:2,fontSize:13,fontWeight:600,textTransform:"none","&:hover":{borderColor:"secondary.dark",bgcolor:"rgba(79, 70, 229, 0.04)"}},children:"Revert"})]})}const g={minHeight:34,borderColor:"#94A3B8",color:"#64748B",borderRadius:"8px",fontSize:12,fontWeight:500,textTransform:"none"},x={minHeight:34,borderRadius:"8px",bgcolor:"#4F46E5",fontSize:12,fontWeight:500,textTransform:"none",boxShadow:"none","&:hover":{bgcolor:"#4338CA",boxShadow:"none"}};export{f as default};
|
|
2
2
|
//# sourceMappingURL=RevertCard.js.map
|