- saving progress;

This commit is contained in:
Vitalii Kiiko
2024-12-03 11:47:53 +01:00
parent 92ac388a5b
commit 2816d388a5
9 changed files with 159 additions and 34 deletions

1
.env
View File

@@ -5,3 +5,4 @@ REACT_APP_LOGO_FILENAME=gepafin-logo.svg
REACT_APP_FAVICON_FILENAME=gepafin-favicon.ico REACT_APP_FAVICON_FILENAME=gepafin-favicon.ico
REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs
REACT_APP_EVALUATION_FLOW_ID=1 REACT_APP_EVALUATION_FLOW_ID=1
REACT_APP_LOCAL_DEVELOPMENT=1

View File

@@ -8,7 +8,8 @@
"@date-fns/tz": "1.1.2", "@date-fns/tz": "1.1.2",
"@emailjs/browser": "^4.4.1", "@emailjs/browser": "^4.4.1",
"@emotion/styled": "11.13.0", "@emotion/styled": "11.13.0",
"@number-flow/react": "0.2.0", "@number-flow/react": "0.4.2",
"@sentry/browser": "^8.42.0",
"@tanstack/react-table": "^8.20.5", "@tanstack/react-table": "^8.20.5",
"@wordpress/i18n": "5.8.0", "@wordpress/i18n": "5.8.0",
"@wordpress/react-i18n": "4.8.0", "@wordpress/react-i18n": "4.8.0",

View File

@@ -0,0 +1,41 @@
import React, { Component } from 'react';
import * as Sentry from '@sentry/browser';
const LOCAL_DEVELOPMENT = process.env.REACT_APP_LOCAL_DEVELOPMENT;
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = {
builderError: false
};
}
static getDerivedStateFromError(error) {
try {
if (LOCAL_DEVELOPMENT !== '1') {
Sentry.init({
dsn: "https://e7b2134f7d816f663bb83e51b106a694@o4508381921738752.ingest.de.sentry.io/4508381935501392",
environment: process.env.NODE_ENV || "development"
});
Sentry.captureException(error);
}
} catch (err) {
console.log('err')
console.log(err);
}
return { builderError: true };
}
render() {
if (this.state.builderError) {
return <div>Error</div>;
}
return this.props.children;
}
}
export default ErrorBoundary;

View File

@@ -3,6 +3,7 @@ import { Navigate, Outlet } from 'react-router-dom';
// tools // tools
import AuthenticationService from '../../service/authentication-service'; import AuthenticationService from '../../service/authentication-service';
import ErrorBoundary from '../ErrorBoundary';
const ProtectedRoute = () => { const ProtectedRoute = () => {
@@ -22,7 +23,7 @@ const ProtectedRoute = () => {
return (<Navigate to={'/'} replace/>); return (<Navigate to={'/'} replace/>);
}*/ }*/
return <Outlet/>; return <ErrorBoundary><Outlet/></ErrorBoundary>;
} }
export default ProtectedRoute; export default ProtectedRoute;

View File

@@ -35,12 +35,14 @@ const AddCompany = () => {
handleSubmit, handleSubmit,
formState: { errors }, formState: { errors },
setValue, setValue,
watch watch,
getValues
} = useForm({ } = useForm({
defaultValues: {}, defaultValues: {},
mode: 'onChange' mode: 'onChange'
}); });
const isPiva = watch('vatNumber'); const isPiva = watch('vatNumber');
//const isPiva = watch('vatNumber');
const setEmptyValues = () => { const setEmptyValues = () => {
const formData = { const formData = {
@@ -138,6 +140,11 @@ const AddCompany = () => {
storeSet.main.unsetAsyncRequest(); storeSet.main.unsetAsyncRequest();
} }
const shouldDisableFiscalCode = () => {
const formData = getValues();
return !formData.type || formData.type && formData.type === 'giuridica';
}
useEffect(() => { useEffect(() => {
setInputPiva(isPiva); setInputPiva(isPiva);
}, [isPiva]); }, [isPiva]);
@@ -145,7 +152,7 @@ const AddCompany = () => {
useEffect(() => { useEffect(() => {
checkVatNumber(debouncedPivaValue); checkVatNumber(debouncedPivaValue);
}, [debouncedPivaValue]) }, [debouncedPivaValue])
console.log('APP_EVALUATION_FLOW_ID', APP_EVALUATION_FLOW_ID)
return ( return (
<div className="appPage"> <div className="appPage">
<div className="appPage__pageHeader"> <div className="appPage__pageHeader">
@@ -176,6 +183,23 @@ const AddCompany = () => {
/> />
</div> </div>
{APP_EVALUATION_FLOW_ID === '2'
? <div className="appForm__cols">
<FormField
type="radio"
fieldName="type"
label={__('Type', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
defaultValue="giuridica"
options={[
{ name: 'giuridica', label: 'Giuridica' },
{ name: 'fisica', label: 'Fisica' },
]}
/>
</div> : null}
<div className="appForm__cols"> <div className="appForm__cols">
<FormField <FormField
type="textinput" type="textinput"
@@ -186,15 +210,25 @@ const AddCompany = () => {
config={{ required: __('È obbligatorio', 'gepafin') }} config={{ required: __('È obbligatorio', 'gepafin') }}
/> />
<FormField {APP_EVALUATION_FLOW_ID === '1'
type="textinput" ? <FormField
disabled={APP_EVALUATION_FLOW_ID === '1'} type="textinput"
fieldName="codiceFiscale" disabled
label={__('Codice fiscale', 'gepafin')} fieldName="codiceFiscale"
control={control} label={__('Codice fiscale', 'gepafin')}
errors={errors} control={control}
config={{ required: __('È obbligatorio', 'gepafin') }} errors={errors}
/> config={{ required: __('È obbligatorio', 'gepafin') }}
/>
: <FormField
type="textinput"
disabled={shouldDisableFiscalCode()}
fieldName="codiceFiscale"
label={__('Codice fiscale', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>}
</div> </div>
<div className="appForm__cols"> <div className="appForm__cols">

View File

@@ -5,6 +5,7 @@ import { useNavigate } from 'react-router-dom';
// components // components
import MyLatestSubmissionsTable from '../DashboardBeneficiario/components/MyLatestSubmissionsTable'; import MyLatestSubmissionsTable from '../DashboardBeneficiario/components/MyLatestSubmissionsTable';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import ErrorBoundary from '../../components/ErrorBoundary';
const Applications = () => { const Applications = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@@ -22,7 +23,7 @@ const Applications = () => {
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>
<div className="appPageSection"> <div className="appPageSection">
<MyLatestSubmissionsTable/> <ErrorBoundary><MyLatestSubmissionsTable/></ErrorBoundary>
</div> </div>
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>

View File

@@ -8,6 +8,7 @@ import { useStore } from '../../store';
// components // components
import AllBandiAccordion from './components/AllBandiAccordion'; import AllBandiAccordion from './components/AllBandiAccordion';
import ErrorBoundary from '../../components/ErrorBoundary';
const BandiBeneficiario = () => { const BandiBeneficiario = () => {
const chosenCompanyId = useStore().main.chosenCompanyId(); const chosenCompanyId = useStore().main.chosenCompanyId();
@@ -34,7 +35,7 @@ const BandiBeneficiario = () => {
</> : null} </> : null}
<div className="appPageSection"> <div className="appPageSection">
<AllBandiAccordion/> <ErrorBoundary><AllBandiAccordion/></ErrorBoundary>
</div> </div>
</div> </div>
) )

View File

@@ -14,6 +14,7 @@ import DashboardService from '../../service/dashboard-service';
import LatestBandiTable from './components/LatestBandiTable'; import LatestBandiTable from './components/LatestBandiTable';
import MyLatestSubmissionsTable from './components/MyLatestSubmissionsTable'; import MyLatestSubmissionsTable from './components/MyLatestSubmissionsTable';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import ErrorBoundary from '../../components/ErrorBoundary';
const DashboardBeneficiario = () => { const DashboardBeneficiario = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@@ -85,7 +86,7 @@ const DashboardBeneficiario = () => {
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('Domande in lavorazione', 'gepafin')}</h2> <h2>{__('Domande in lavorazione', 'gepafin')}</h2>
<MyLatestSubmissionsTable/> <ErrorBoundary><MyLatestSubmissionsTable/></ErrorBoundary>
</div> </div>
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>
@@ -105,7 +106,7 @@ const DashboardBeneficiario = () => {
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('Bandi disponibili', 'gepafin')}</h2> <h2>{__('Bandi disponibili', 'gepafin')}</h2>
<LatestBandiTable/> <ErrorBoundary><LatestBandiTable/></ErrorBoundary>
</div> </div>
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>

View File

@@ -1,9 +1,36 @@
import { storeGet } from '../store'; import { storeGet } from '../store';
import * as Sentry from "@sentry/browser";
const LOCAL_DEVELOPMENT = process.env.REACT_APP_LOCAL_DEVELOPMENT;
export class NetworkService { export class NetworkService {
static TOKEN_KEY static TOKEN_KEY
static REFRESH_TOKEN_KEY static REFRESH_TOKEN_KEY
static logApiError = (endpoint, status = 0, resp) => {
try {
if ([500].includes(status)) {
if (LOCAL_DEVELOPMENT !== '1') {
Sentry.init({
dsn: "https://e7b2134f7d816f663bb83e51b106a694@o4508381921738752.ingest.de.sentry.io/4508381935501392",
environment: process.env.NODE_ENV || "development"
});
const error = new Error(`Status ${status}`);
Sentry.captureException(`Error in endpoint: ${endpoint}`, {
level: 'error',
extra: {
originalError: error,
details: resp
}
});
}
}
} catch (err) {
console.log(err);
}
}
static postEmptyResponse = (url, body, callback, errorCallback) => { static postEmptyResponse = (url, body, callback, errorCallback) => {
fetch(url, { fetch(url, {
method: 'POST', method: 'POST',
@@ -77,10 +104,12 @@ export class NetworkService {
return { response: await response.json(), status: status } return { response: await response.json(), status: status }
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response)
else this.logApiError(url, data.status, data.response);
} else {
callback(data.response) callback(data.response)
}
}) })
.catch(err => errorCallback(err)); .catch(err => errorCallback(err));
}; };
@@ -118,10 +147,12 @@ export class NetworkService {
return { response: await response.json(), status: status } return { response: await response.json(), status: status }
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response)
else this.logApiError(url, data.status, data.response);
} else {
callback(data.response) callback(data.response)
}
}) })
.catch(err => errorCallback(err)); .catch(err => errorCallback(err));
}; };
@@ -159,10 +190,12 @@ export class NetworkService {
return { response: await response.blob(), status: status } return { response: await response.blob(), status: status }
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response)
else this.logApiError(url, data.status, data.response);
} else {
callback(data.response) callback(data.response)
}
}) })
.catch(err => errorCallback(err)); .catch(err => errorCallback(err));
}; };
@@ -198,10 +231,12 @@ export class NetworkService {
return { response: await response.json(), status: status } return { response: await response.json(), status: status }
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response)
else this.logApiError(url, data.status, data.response);
} else {
callback(data.response) callback(data.response)
}
}) })
.catch(err => errorCallback(err)); .catch(err => errorCallback(err));
}; };
@@ -261,10 +296,12 @@ export class NetworkService {
return { response: await response.json(), status: status } return { response: await response.json(), status: status }
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response)
else this.logApiError(url, data.status, data.response);
} else {
callback(data.response) callback(data.response)
}
}) })
.catch(err => errorCallback(err)); .catch(err => errorCallback(err));
}; };
@@ -381,12 +418,15 @@ export class NetworkService {
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) { if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response);
this.logApiError(url, data.status, data.response);
} else { } else {
callback(data.response) callback(data.response)
} }
}) })
.catch(err => errorCallback(err)); .catch(err => {
errorCallback(err)
});
}; };
@@ -422,10 +462,12 @@ export class NetworkService {
return { response: await response.blob(), status: status } return { response: await response.blob(), status: status }
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response)
else this.logApiError(url, data.status, data.response);
} else {
callback(data.response) callback(data.response)
}
}) })
.catch(err => errorCallback(err)); .catch(err => errorCallback(err));
}; };
@@ -504,10 +546,12 @@ export class NetworkService {
return { response: await response.json(), status: status } return { response: await response.json(), status: status }
}) })
.then(data => { .then(data => {
if (data.status >= 400 && data.status <= 599) if (data.status >= 400 && data.status <= 599) {
errorCallback(data.response) errorCallback(data.response)
else this.logApiError(url, data.status, data.response);
} else {
callback(data.response) callback(data.response)
}
}) })
.catch(err => errorCallback(err)); .catch(err => errorCallback(err));