@kartverket/backstage-plugin-risk-scorecard 6.0.0 → 6.0.2
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/components/threatActorsAndVulnerabilities/CoverageStatusBox.esm.js +12 -6
- package/dist/components/threatActorsAndVulnerabilities/CoverageStatusBox.esm.js.map +1 -1
- package/dist/components/threatActorsAndVulnerabilities/CoverageStatusBox.module.css.esm.js +2 -2
- package/dist/contexts/RiScContext.esm.js +0 -35
- package/dist/contexts/RiScContext.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -31,6 +31,12 @@ function useCoverageStatusText(notCoveredList, coverageType) {
|
|
|
31
31
|
const kindPlural = coverageType === CoverageType.Vulnerability ? t("dictionary.vulnerabilities") : t("dictionary.threatActors");
|
|
32
32
|
const kindsPlural = coverageType === CoverageType.Vulnerability ? t("dictionary.theVulnerabilities") : t("dictionary.theThreatActors");
|
|
33
33
|
const kind = coverageType === CoverageType.Vulnerability ? t("dictionary.theVulnerability") : t("dictionary.theThreatActor");
|
|
34
|
+
const translationPrefix = coverageType === CoverageType.Vulnerability ? "vulnerabilities" : "threatActors";
|
|
35
|
+
const translated = notCoveredList.map(
|
|
36
|
+
(item) => t(
|
|
37
|
+
`${translationPrefix}.${item}`
|
|
38
|
+
)
|
|
39
|
+
);
|
|
34
40
|
if (numOfNotCovered === 0) {
|
|
35
41
|
return t("threatActorsAndVulnerabilities.allCovered", {
|
|
36
42
|
kind: kindPlural.toLowerCase()
|
|
@@ -39,21 +45,21 @@ function useCoverageStatusText(notCoveredList, coverageType) {
|
|
|
39
45
|
if (numOfNotCovered === 1) {
|
|
40
46
|
return t("threatActorsAndVulnerabilities.oneNotCovered", {
|
|
41
47
|
kind,
|
|
42
|
-
notCovered:
|
|
48
|
+
notCovered: translated[0]
|
|
43
49
|
});
|
|
44
50
|
}
|
|
45
51
|
if (numOfNotCovered === 2) {
|
|
46
52
|
return t("threatActorsAndVulnerabilities.twoNotCovered", {
|
|
47
53
|
kind: kindsPlural,
|
|
48
|
-
notCovered1:
|
|
49
|
-
notCovered2:
|
|
54
|
+
notCovered1: translated[0],
|
|
55
|
+
notCovered2: translated[1]
|
|
50
56
|
});
|
|
51
57
|
}
|
|
52
58
|
return t("threatActorsAndVulnerabilities.multipleNotCovered", {
|
|
53
59
|
kind: kindPlural.toLowerCase(),
|
|
54
|
-
notCovered1:
|
|
55
|
-
notCovered2:
|
|
56
|
-
notCovered3:
|
|
60
|
+
notCovered1: translated[0],
|
|
61
|
+
notCovered2: translated[1],
|
|
62
|
+
notCovered3: translated[2]
|
|
57
63
|
});
|
|
58
64
|
}
|
|
59
65
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoverageStatusBox.esm.js","sources":["../../../src/components/threatActorsAndVulnerabilities/CoverageStatusBox.tsx"],"sourcesContent":["import styles from './CoverageStatusBox.module.css';\nimport { Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { CoverageType } from '../../utils/threatActorsAndVulnerabilities.ts';\nimport { StatusIcon, StatusIconTypes } from '../common/StatusIcon.tsx';\n\ntype CoverageStatusBoxProps = {\n notCovered: string[];\n coverageType: CoverageType;\n};\nfunction getIconType(count: number): StatusIconTypes {\n if (count === 0) return StatusIconTypes.Green;\n if (count <= 2) return StatusIconTypes.Yellow;\n return StatusIconTypes.Red;\n}\n\nexport function CoverageStatusBox(props: CoverageStatusBoxProps) {\n const iconType = getIconType(props.notCovered.length);\n\n return (\n <div className={styles.boxStyle}>\n <StatusIcon type={iconType} size=\"medium\" />\n <Text\n dangerouslySetInnerHTML={{\n __html: useCoverageStatusText(props.notCovered, props.coverageType),\n }}\n />\n </div>\n );\n}\n\nfunction useCoverageStatusText(\n notCoveredList: string[],\n coverageType: CoverageType,\n) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const numOfNotCovered = notCoveredList.length;\n\n const kindPlural =\n coverageType === CoverageType.Vulnerability\n ? t('dictionary.vulnerabilities')\n : t('dictionary.threatActors');\n\n const kindsPlural =\n coverageType === CoverageType.Vulnerability\n ? t('dictionary.theVulnerabilities')\n : t('dictionary.theThreatActors');\n\n const kind =\n coverageType === CoverageType.Vulnerability\n ? t('dictionary.theVulnerability')\n : t('dictionary.theThreatActor');\n\n if (numOfNotCovered === 0) {\n return t('threatActorsAndVulnerabilities.allCovered', {\n kind: kindPlural.toLowerCase(),\n });\n }\n\n if (numOfNotCovered === 1) {\n return t('threatActorsAndVulnerabilities.oneNotCovered', {\n kind: kind,\n notCovered:
|
|
1
|
+
{"version":3,"file":"CoverageStatusBox.esm.js","sources":["../../../src/components/threatActorsAndVulnerabilities/CoverageStatusBox.tsx"],"sourcesContent":["import styles from './CoverageStatusBox.module.css';\nimport { Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { CoverageType } from '../../utils/threatActorsAndVulnerabilities.ts';\nimport { StatusIcon, StatusIconTypes } from '../common/StatusIcon.tsx';\nimport {\n ThreatActorsOptions,\n VulnerabilitiesOptions,\n} from '../../utils/constants.ts';\n\ntype CoverageStatusBoxProps = {\n notCovered: string[];\n coverageType: CoverageType;\n};\nfunction getIconType(count: number): StatusIconTypes {\n if (count === 0) return StatusIconTypes.Green;\n if (count <= 2) return StatusIconTypes.Yellow;\n return StatusIconTypes.Red;\n}\n\nexport function CoverageStatusBox(props: CoverageStatusBoxProps) {\n const iconType = getIconType(props.notCovered.length);\n\n return (\n <div className={styles.boxStyle}>\n <StatusIcon type={iconType} size=\"medium\" />\n <Text\n dangerouslySetInnerHTML={{\n __html: useCoverageStatusText(props.notCovered, props.coverageType),\n }}\n />\n </div>\n );\n}\n\nfunction useCoverageStatusText(\n notCoveredList: string[],\n coverageType: CoverageType,\n) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const numOfNotCovered = notCoveredList.length;\n\n const kindPlural =\n coverageType === CoverageType.Vulnerability\n ? t('dictionary.vulnerabilities')\n : t('dictionary.threatActors');\n\n const kindsPlural =\n coverageType === CoverageType.Vulnerability\n ? t('dictionary.theVulnerabilities')\n : t('dictionary.theThreatActors');\n\n const kind =\n coverageType === CoverageType.Vulnerability\n ? t('dictionary.theVulnerability')\n : t('dictionary.theThreatActor');\n\n const translationPrefix =\n coverageType === CoverageType.Vulnerability\n ? 'vulnerabilities'\n : 'threatActors';\n\n const translated = notCoveredList.map(item =>\n t(\n `${translationPrefix}.${item}` as\n | `threatActors.${ThreatActorsOptions}`\n | `vulnerabilities.${VulnerabilitiesOptions}`,\n ),\n );\n\n if (numOfNotCovered === 0) {\n return t('threatActorsAndVulnerabilities.allCovered', {\n kind: kindPlural.toLowerCase(),\n });\n }\n\n if (numOfNotCovered === 1) {\n return t('threatActorsAndVulnerabilities.oneNotCovered', {\n kind: kind,\n notCovered: translated[0],\n });\n }\n\n if (numOfNotCovered === 2) {\n return t('threatActorsAndVulnerabilities.twoNotCovered', {\n kind: kindsPlural,\n notCovered1: translated[0],\n notCovered2: translated[1],\n });\n }\n return t('threatActorsAndVulnerabilities.multipleNotCovered', {\n kind: kindPlural.toLowerCase(),\n notCovered1: translated[0],\n notCovered2: translated[1],\n notCovered3: translated[2],\n });\n}\n"],"names":[],"mappings":";;;;;;;;AAeA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,IAAI,KAAA,KAAU,CAAA,EAAG,OAAO,eAAA,CAAgB,KAAA;AACxC,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,eAAA,CAAgB,MAAA;AACvC,EAAA,OAAO,eAAA,CAAgB,GAAA;AACzB;AAEO,SAAS,kBAAkB,KAAA,EAA+B;AAC/D,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAEpD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,QAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK,QAAA,EAAS,CAAA;AAAA,oBAC1C,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,uBAAA,EAAyB;AAAA,UACvB,MAAA,EAAQ,qBAAA,CAAsB,KAAA,CAAM,UAAA,EAAY,MAAM,YAAY;AAAA;AACpE;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,qBAAA,CACP,gBACA,YAAA,EACA;AACA,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,kBAAkB,cAAA,CAAe,MAAA;AAEvC,EAAA,MAAM,UAAA,GACJ,iBAAiB,YAAA,CAAa,aAAA,GAC1B,EAAE,4BAA4B,CAAA,GAC9B,EAAE,yBAAyB,CAAA;AAEjC,EAAA,MAAM,WAAA,GACJ,iBAAiB,YAAA,CAAa,aAAA,GAC1B,EAAE,+BAA+B,CAAA,GACjC,EAAE,4BAA4B,CAAA;AAEpC,EAAA,MAAM,IAAA,GACJ,iBAAiB,YAAA,CAAa,aAAA,GAC1B,EAAE,6BAA6B,CAAA,GAC/B,EAAE,2BAA2B,CAAA;AAEnC,EAAA,MAAM,iBAAA,GACJ,YAAA,KAAiB,YAAA,CAAa,aAAA,GAC1B,iBAAA,GACA,cAAA;AAEN,EAAA,MAAM,aAAa,cAAA,CAAe,GAAA;AAAA,IAAI,CAAA,IAAA,KACpC,CAAA;AAAA,MACE,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA;AAG9B,GACF;AAEA,EAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,2CAAA,EAA6C;AAAA,MACpD,IAAA,EAAM,WAAW,WAAA;AAAY,KAC9B,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,8CAAA,EAAgD;AAAA,MACvD,IAAA;AAAA,MACA,UAAA,EAAY,WAAW,CAAC;AAAA,KACzB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,8CAAA,EAAgD;AAAA,MACvD,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,MACzB,WAAA,EAAa,WAAW,CAAC;AAAA,KAC1B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,EAAE,mDAAA,EAAqD;AAAA,IAC5D,IAAA,EAAM,WAAW,WAAA,EAAY;AAAA,IAC7B,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,IACzB,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,IACzB,WAAA,EAAa,WAAW,CAAC;AAAA,GAC1B,CAAA;AACH;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".
|
|
4
|
-
var styles = {"boxStyle":"
|
|
3
|
+
var css_248z = ".CoverageStatusBox_boxStyle__650f6eee39 {\n display: flex;\n align-items: center;\n gap: 8px;\n background-color: #fcebcd;\n padding: 8px 16px;\n border-radius: 4px;\n}\n\n[data-theme-mode='dark'] .CoverageStatusBox_boxStyle__650f6eee39 {\n background-color: var(--ros-gray-500);\n}\n";
|
|
4
|
+
var styles = {"boxStyle":"CoverageStatusBox_boxStyle__650f6eee39"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { styles as default };
|
|
@@ -412,30 +412,6 @@ function RiScProvider({ children }) {
|
|
|
412
412
|
);
|
|
413
413
|
}
|
|
414
414
|
}
|
|
415
|
-
const refetchRiScs = useCallback(() => {
|
|
416
|
-
fetchRiScs(
|
|
417
|
-
(res) => {
|
|
418
|
-
const fetchedRiScs = res.filter((risk) => risk.status === ContentStatus.Success).map(mapRiScDtoToRiScWithMetadata);
|
|
419
|
-
setRiScs(fetchedRiScs);
|
|
420
|
-
setSelectedRiSc(
|
|
421
|
-
(prev) => prev ? fetchedRiScs.find((r) => r.id === prev.id) ?? prev : prev
|
|
422
|
-
);
|
|
423
|
-
},
|
|
424
|
-
(_, loginRejected) => {
|
|
425
|
-
dispatch({
|
|
426
|
-
type: "SET_RESPONSE",
|
|
427
|
-
response: {
|
|
428
|
-
status: ProcessingStatus.ErrorWhenFetchingRiScs,
|
|
429
|
-
statusMessage: withLoginRejected(
|
|
430
|
-
t("errorMessages.ErrorWhenFetchingRiScs"),
|
|
431
|
-
loginRejected,
|
|
432
|
-
t
|
|
433
|
-
)
|
|
434
|
-
}
|
|
435
|
-
});
|
|
436
|
-
}
|
|
437
|
-
);
|
|
438
|
-
}, [fetchRiScs, dispatch, t]);
|
|
439
415
|
function approveRiSc() {
|
|
440
416
|
if (selectedRiSc && riScs) {
|
|
441
417
|
dispatch({
|
|
@@ -482,17 +458,6 @@ function RiScProvider({ children }) {
|
|
|
482
458
|
);
|
|
483
459
|
}
|
|
484
460
|
}
|
|
485
|
-
useEffect(() => {
|
|
486
|
-
const s = selectedRiSc?.status;
|
|
487
|
-
const shouldPoll = s === RiScStatus.SentForApproval || s === RiScStatus.DeletionSentForApproval;
|
|
488
|
-
if (!shouldPoll) {
|
|
489
|
-
return void 0;
|
|
490
|
-
}
|
|
491
|
-
const id = window.setInterval(() => {
|
|
492
|
-
refetchRiScs();
|
|
493
|
-
}, 5e3);
|
|
494
|
-
return () => window.clearInterval(id);
|
|
495
|
-
}, [selectedRiSc?.status, refetchRiScs]);
|
|
496
461
|
const value = {
|
|
497
462
|
riScs,
|
|
498
463
|
selectRiSc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed = res.length > 0 && successfulRiScs.length === 0;\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n const refetchRiScs = useCallback(() => {\n fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(mapRiScDtoToRiScWithMetadata);\n\n setRiScs(fetchedRiScs);\n\n setSelectedRiSc(prev =>\n prev ? (fetchedRiScs.find(r => r.id === prev.id) ?? prev) : prev,\n );\n },\n (_, loginRejected) => {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }, [fetchRiScs, dispatch, t]);\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n useEffect(() => {\n const s = selectedRiSc?.status;\n\n const shouldPoll =\n s === RiScStatus.SentForApproval ||\n s === RiScStatus.DeletionSentForApproval;\n\n if (!shouldPoll) {\n return undefined;\n }\n\n const id = window.setInterval(() => {\n refetchRiScs();\n }, 5000);\n\n return () => window.clearInterval(id);\n }, [selectedRiSc?.status, refetchRiScs]);\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed = res.length > 0 && successfulRiScs.length === 0;\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
|