diff --git a/app/src/app/[lng]/data/[step]/page.tsx b/app/src/app/[lng]/data/[step]/page.tsx index 5a4275d08..96003afbf 100644 --- a/app/src/app/[lng]/data/[step]/page.tsx +++ b/app/src/app/[lng]/data/[step]/page.tsx @@ -73,6 +73,8 @@ import type { } from "./types"; import { v4 as uuidv4 } from "uuid"; +import { InventoryValueAttributes } from "@/models/InventoryValue"; +import { DataSource } from "@/models/DataSource"; function getMailURI(locode?: string, sector?: string, year?: number): string { const emails = @@ -384,6 +386,7 @@ export default function AddDataSteps({ }); } finally { setConnectingDataSourceId(null); + onSearchDataSourcesClicked(); } }; @@ -490,6 +493,75 @@ export default function AddDataSteps({ ); } + const [buttonText, setButtonText] = useState(t("data-connected")); + const [hoverStates, setHoverStates] = useState<{ [key: string]: boolean }>( + {}, + ); + + const [disconnectThirdPartyData, { isLoading: isDisconnectLoading }] = + api.useDisconnectThirdPartyDataMutation(); + + const onDisconnectThirdPartyData = async ( + source: DataSourceWithRelations, + ) => { + if (isSourceConnected(source)) { + source.inventoryValues!.forEach( + async (inventoryValue: InventoryValueAttributes) => { + await disconnectThirdPartyData({ + inventoryId: inventoryValue.inventoryId, + subCategoryId: inventoryValue.subCategoryId, + }).then((res: any) => { + // Todo show alert + onSearchDataSourcesClicked(); + }); + }, + ); + } else { + console.log("Something went wrong"); + } + }; + + const onButtonHover = (source: DataSourceWithRelations) => { + setHoverStates((prev) => ({ ...prev, [source.datasourceId]: true })); + setButtonText(t("disconnect-data")); + }; + + const onMouseLeave = (source: DataSourceWithRelations) => { + setHoverStates((prev) => ({ ...prev, [source.datasourceId]: false })); + setButtonText(t("data-connected")); + }; + + const DEFAULT_CONNECTED_BUTTON_PROPS = { + variant: "solidPrimary", + text: t("data-connected"), + }; + + const DEFAULT_DISCONNECTED_BUTTON_PROPS = { + variant: "outline", + text: t("connect-data"), + }; + + const getButtonProps = ( + source: DataSourceWithRelations, + isHovered: boolean, + ) => { + if (isSourceConnected(source)) { + return { + variant: isHovered ? "danger" : DEFAULT_CONNECTED_BUTTON_PROPS.variant, + text: isHovered + ? t("disconnect-data") + : DEFAULT_CONNECTED_BUTTON_PROPS.text, + icon: , + }; + } else { + return { + variant: DEFAULT_DISCONNECTED_BUTTON_PROPS.variant, + text: DEFAULT_DISCONNECTED_BUTTON_PROPS.text, + // Add more properties as needed + }; + } + }; + return (
- ) : ( - - )} - - ))} + {t("see-more-details")} + + {isSourceConnected(source) && + source.inventoryValues?.length ? ( + + ) : ( + + )} + + ); + })} )} {dataSources && dataSources.length > 6 && ( diff --git a/app/src/i18n/locales/de/data.json b/app/src/i18n/locales/de/data.json index 85d1f6554..65a22ef19 100644 --- a/app/src/i18n/locales/de/data.json +++ b/app/src/i18n/locales/de/data.json @@ -117,5 +117,6 @@ "review-data-label": "Daten überprüfen und hinzufügen", "files-uploaded": "Dateien hochgeladen", "add-custom": "Benutzerdefiniert", - "save-missing-scope-info": "Speichern oder fehlende Informationen ausfüllen, bevor Sie fortfahren." + "save-missing-scope-info": "Speichern oder fehlende Informationen ausfüllen, bevor Sie fortfahren.", + "disconnect-data": "Datenquelle trennen" } diff --git a/app/src/i18n/locales/en/data.json b/app/src/i18n/locales/en/data.json index 86f6d4ac6..699dedbba 100644 --- a/app/src/i18n/locales/en/data.json +++ b/app/src/i18n/locales/en/data.json @@ -168,5 +168,6 @@ "city": "City", "inside-dataset": "What's inside this dataset", "transform-data-heading": "How do we transform this data?", - "transform-data-description": "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat." + "transform-data-description": "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", + "disconnect-data": "Disconnect Data" } diff --git a/app/src/i18n/locales/es/data.json b/app/src/i18n/locales/es/data.json index 6716ea4bd..4e694a38c 100644 --- a/app/src/i18n/locales/es/data.json +++ b/app/src/i18n/locales/es/data.json @@ -113,5 +113,6 @@ "review-data-label": "Revisar y añadir datos", "files-uploaded": "Archivos subidos", "add-custom": "Agregar personalizado", - "save-missing-scope-info": "Guarde o complete la información faltante antes de continuar." + "save-missing-scope-info": "Guarde o complete la información faltante antes de continuar.", + "disconnect-data": "Desconectar fuente de datos" } diff --git a/app/src/services/api.ts b/app/src/services/api.ts index 663dea206..31cd21a25 100644 --- a/app/src/services/api.ts +++ b/app/src/services/api.ts @@ -355,6 +355,15 @@ export const api = createApi({ transformResponse: (response: { data: EmissionsFactorResponse }) => response.data, }), + disconnectThirdPartyData: builder.mutation({ + query: ({ inventoryId, subCategoryId }) => ({ + method: "DELETE", + url: `inventory/${inventoryId}/value/${subCategoryId}`, + }), + invalidatesTags: ["InventoryValue", "InventoryProgress"], + transformResponse: (response: { data: EmissionsFactorResponse }) => + response.data, + }), // User invitation to city inviteUser: builder.mutation< UserInviteResponse, @@ -423,6 +432,7 @@ export const { useAddUserFileMutation, useGetUserFilesQuery, useDeleteUserFileMutation, + useDisconnectThirdPartyDataMutation, useInviteUserMutation, useCheckUserMutation, } = api;