spinner for payments, API actions
This commit is contained in:
parent
fa0af100bc
commit
6e54585c9c
@ -6,6 +6,8 @@ import moment from 'moment';
|
||||
import * as actionTypes from '../constants/actionTypes';
|
||||
import * as currentState from '../reducers/initialState';
|
||||
|
||||
import { getCompanyInfo } from './companyActions';
|
||||
|
||||
if(process.browser)
|
||||
{
|
||||
FormData.prototype.appendObject = function(obj, namespace)
|
||||
@ -37,15 +39,20 @@ export const sendLoginFormEmail = ({ email, password, dispatch }) =>
|
||||
const cookies = new Cookies();
|
||||
cookies.set('jwt', response.data.token, new Date(moment().add(7, 'day').toDate()));
|
||||
|
||||
console.log("try to actionTypes.COMPANY", actionTypes.COMPANY);
|
||||
console.log("response.data.company", response.data.company);
|
||||
getCompanyInfo({ dispatch })
|
||||
.then(() =>
|
||||
{
|
||||
dispatch({ type: actionTypes.AUTH, data: { logged: true } });
|
||||
dispatch({ type: actionTypes.USER, data: response.data.user });
|
||||
|
||||
dispatch({ type: actionTypes.AUTH, data: { logged: true } });
|
||||
dispatch({ type: actionTypes.USER, data: response.data.user });
|
||||
dispatch({ type: actionTypes.COMPANY, data: response.data.company });
|
||||
|
||||
resolve();
|
||||
Router.push('/');
|
||||
resolve();
|
||||
Router.push('/');
|
||||
})
|
||||
.catch(() =>
|
||||
{
|
||||
reject();
|
||||
});
|
||||
//dispatch({ type: actionTypes.COMPANY, data: response.data.company });
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
47
actions/companyActions.js
Normal file
47
actions/companyActions.js
Normal file
@ -0,0 +1,47 @@
|
||||
import axios from 'axios';
|
||||
import { Cookies } from 'react-cookie';
|
||||
import Router from 'next/router';
|
||||
import moment from 'moment';
|
||||
|
||||
import * as actionTypes from '../constants/actionTypes';
|
||||
|
||||
if(process.browser)
|
||||
{
|
||||
FormData.prototype.appendObject = function(obj, namespace)
|
||||
{
|
||||
let keyName;
|
||||
for (var key in obj)
|
||||
{
|
||||
if (obj.hasOwnProperty(key))
|
||||
{
|
||||
keyName = [namespace, '[', key, ']'].join('');
|
||||
this.append(keyName, obj[key]);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export const getCompanyInfo = ({ dispatch }) =>
|
||||
{
|
||||
console.log("getCompanyInfo");
|
||||
return new Promise((resolve, reject) =>
|
||||
{
|
||||
axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/company`, {}, {
|
||||
withCredentials: true,
|
||||
})
|
||||
.then((response) =>
|
||||
{
|
||||
console.log("getCompanyInfo", "response", response.data);
|
||||
|
||||
dispatch({ type: actionTypes.COMPANY, data: response.data });
|
||||
resolve();
|
||||
})
|
||||
.catch((error) =>
|
||||
{
|
||||
console.log("error");
|
||||
console.error(error);
|
||||
|
||||
reject();
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
export * from './authActions';
|
||||
export * from './contractsActions';
|
||||
export * from './contractActions';
|
||||
export * from './calendarActions';
|
||||
export * from './calendarActions';
|
||||
export * from './companyActions';
|
||||
@ -4,7 +4,7 @@ const withLess = require("next-with-less");
|
||||
|
||||
module.exports = withImages(withFonts(withLess({
|
||||
images: {
|
||||
domains: [ 'evo-lk.quickcode.ru', 'wow.evoleasing.ru', 'www.evoleasing.ru', 'lk.evoleasing.ru', 'evoleasing.ru', 'localhost', 'localhost:3000'],
|
||||
domains: [ 'lk-evo.quickcode.ru', 'wow.evoleasing.ru', 'www.evoleasing.ru', 'lk.evoleasing.ru', 'evoleasing.ru', 'localhost', 'localhost:3000'],
|
||||
},
|
||||
reactStrictMode: true,
|
||||
/*
|
||||
|
||||
@ -29,7 +29,8 @@
|
||||
"react-redux": "^7.2.6",
|
||||
"react-widgets": "^5.5.1",
|
||||
"redux": "^4.1.2",
|
||||
"redux-persist": "^6.0.0"
|
||||
"redux-persist": "^6.0.0",
|
||||
"spinners-react": "^1.0.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^8.3.0",
|
||||
|
||||
@ -16,18 +16,9 @@ export default async function handler(req, res)
|
||||
|
||||
if(cookies.jwt !== undefined && cookies.jwt !== null)
|
||||
{
|
||||
console.log("cookies.jwt");
|
||||
console.log(cookies.jwt);
|
||||
|
||||
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
|
||||
var crm_jwt = jwt.sign(client_jwt_decoded, process.env.JWT_SECRET_CRM, { noTimestamp: true });
|
||||
|
||||
console.log("client_jwt_decoded", client_jwt_decoded);
|
||||
console.log("crm_jwt", crm_jwt);
|
||||
|
||||
console.log(`URL`);
|
||||
console.log(`${ process.env.CRM_API_HOST }/lk/Account/GetPaymentCalendar/`);
|
||||
|
||||
try
|
||||
{
|
||||
axios.get(`${ process.env.CRM_API_HOST }/lk/Account/GetPaymentCalendar/`, {
|
||||
@ -38,8 +29,6 @@ export default async function handler(req, res)
|
||||
})
|
||||
.then((crm_response) =>
|
||||
{
|
||||
console.log("crm_response");
|
||||
console.log(crm_response);
|
||||
res.status(200).json(crm_response.data);
|
||||
})
|
||||
.catch((error) =>
|
||||
|
||||
51
pages/api/company.js
Normal file
51
pages/api/company.js
Normal file
@ -0,0 +1,51 @@
|
||||
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
||||
import axios from 'axios';
|
||||
import { Cookies } from 'react-cookie';
|
||||
import cookie from 'cookie';
|
||||
import moment from 'moment';
|
||||
import jwt from 'jsonwebtoken';
|
||||
import { cors } from '../../lib/cors';
|
||||
|
||||
export default async function handler(req, res)
|
||||
{
|
||||
await cors(req, res);
|
||||
|
||||
if(req.headers.cookie !== undefined)
|
||||
{
|
||||
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
|
||||
|
||||
if(cookies.jwt !== undefined && cookies.jwt !== null)
|
||||
{
|
||||
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
|
||||
var crm_jwt = jwt.sign(client_jwt_decoded, process.env.JWT_SECRET_CRM, { noTimestamp: true });
|
||||
|
||||
try
|
||||
{
|
||||
axios.get(`${ process.env.CRM_API_HOST }/lk/Account/GetCompanyInfo/`, {
|
||||
params: client_jwt_decoded,
|
||||
headers: {
|
||||
"Authorization": `Bearer ${ crm_jwt }`,
|
||||
}
|
||||
})
|
||||
.then((crm_response) =>
|
||||
{
|
||||
res.status(200).json(crm_response.data);
|
||||
})
|
||||
.catch((error) =>
|
||||
{
|
||||
console.error(error);
|
||||
res.status(500);
|
||||
});
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
console.error(e);
|
||||
res.status(500);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
res.status(403);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -18,28 +18,33 @@ export default async function handler(req, res)
|
||||
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
|
||||
var crm_jwt = jwt.sign(client_jwt_decoded, process.env.JWT_SECRET_CRM, { noTimestamp: true });
|
||||
|
||||
try
|
||||
const result = {
|
||||
upd: null,
|
||||
fines: null,
|
||||
};
|
||||
|
||||
await Promise.all([
|
||||
new Promise((resolve) => {
|
||||
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetUPDListByContract`, {
|
||||
params: { ...client_jwt_decoded, contract_number: req.body.number },
|
||||
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
|
||||
})
|
||||
.then((crm_response) => { result.upd = crm_response.data; resolve(); })
|
||||
.catch((error) => { console.error(error); resolve(); });
|
||||
}),
|
||||
new Promise((resolve) => {
|
||||
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetFineGIBDDList`, {
|
||||
params: { ...client_jwt_decoded, contract_number: req.body.number },
|
||||
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
|
||||
})
|
||||
.then((crm_response) => { result.fines = crm_response.data; resolve(); })
|
||||
.catch((error) => { console.error(error); resolve(); });
|
||||
}),
|
||||
])
|
||||
.then(() =>
|
||||
{
|
||||
await axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetUPDListByContract`, {
|
||||
params: { ...client_jwt_decoded, contract_number: req.body.number },
|
||||
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
|
||||
withCredentials: true,
|
||||
})
|
||||
.then((crm_response) =>
|
||||
{
|
||||
res.status(200).json(crm_response.data);
|
||||
})
|
||||
.catch((error) =>
|
||||
{
|
||||
console.error(error);
|
||||
res.status(500);
|
||||
});
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
console.error(e);
|
||||
res.status(500);
|
||||
}
|
||||
res.status(200).json(result);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -39,26 +39,26 @@ export default async function handler(req, res)
|
||||
await Promise.all([
|
||||
new Promise((resolve) => {
|
||||
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetOsago`, {
|
||||
params: client_jwt_decoded,
|
||||
params: { ...client_jwt_decoded, contract_number: req.body.number },
|
||||
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
|
||||
})
|
||||
.then((crm_response) => { result.osago = crm_response; resolve(); })
|
||||
.then((crm_response) => { result.osago = crm_response.data; resolve(); })
|
||||
.catch((error) => { console.error(error); resolve(); });
|
||||
}),
|
||||
new Promise((resolve) => {
|
||||
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetKasko`, {
|
||||
params: client_jwt_decoded,
|
||||
params: { ...client_jwt_decoded, contract_number: req.body.number },
|
||||
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
|
||||
})
|
||||
.then((crm_response) => { result.kasko = crm_response; resolve(); })
|
||||
.then((crm_response) => { result.kasko = crm_response.data; resolve(); })
|
||||
.catch((error) => { console.error(error); resolve(); });
|
||||
}),
|
||||
new Promise((resolve) => {
|
||||
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetNsib`, {
|
||||
params: client_jwt_decoded,
|
||||
params: { ...client_jwt_decoded, contract_number: req.body.number },
|
||||
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
|
||||
})
|
||||
.then((crm_response) => { result.nsib = crm_response; resolve(); })
|
||||
.then((crm_response) => { result.nsib = crm_response.data; resolve(); })
|
||||
.catch((error) => { console.error(error); resolve(); });
|
||||
}),
|
||||
])
|
||||
|
||||
@ -3,6 +3,8 @@ import Head from 'next/head';
|
||||
import Image from 'next/image';
|
||||
import { connect } from "react-redux";
|
||||
import { withRouter } from 'next/router';
|
||||
import { SpinnerCircular } from 'spinners-react';
|
||||
|
||||
import { reduxWrapper } from '../../store';
|
||||
|
||||
import Header from '../components/Header';
|
||||
@ -75,7 +77,7 @@ class ContractSchedulePage extends React.Component
|
||||
|
||||
render()
|
||||
{
|
||||
const { payments, contract_date, full, opened } = this.state;
|
||||
const { payments, contract_date, full, opened, loading } = this.state;
|
||||
const { number } = this.props;
|
||||
|
||||
console.log("RENDER", "payments");
|
||||
@ -121,83 +123,91 @@ class ContractSchedulePage extends React.Component
|
||||
<div className="table_cell">Статус платежа</div>
|
||||
<div className="table_cell">Платежное поручение</div>
|
||||
</div>
|
||||
{ !full && (
|
||||
<button className="show_more primary" onClick={ this._handle_onSetFull }>Показать прошедшие платежи</button>
|
||||
) }
|
||||
{ payments !== null && Object.values(payments).map((payment, index) =>
|
||||
{
|
||||
let pd = moment(payment.date, "DD-MM-YYYY");
|
||||
if(!full && today > pd) { return null; }
|
||||
{ loading ? (
|
||||
<div className="table_row table_header" style={{ minHeight: 300, display: "flex", justifyContent: "center", alignItems: "center" }}>
|
||||
<SpinnerCircular size={90} thickness={51} speed={100} color="rgba(28, 1, 169, 1)" secondaryColor="rgba(236, 239, 244, 1)" />
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
{ !full && (
|
||||
<button className="show_more primary" onClick={ this._handle_onSetFull }>Показать прошедшие платежи</button>
|
||||
) }
|
||||
{ payments !== null && Object.values(payments).map((payment, index) =>
|
||||
{
|
||||
let pd = moment(payment.date, "DD-MM-YYYY");
|
||||
if(!full && today > pd) { return null; }
|
||||
|
||||
return (
|
||||
<div className={ `table_row ${ opened.indexOf(payment.number) > -1 ? "opened" : "" }` } data-status={ payment.status === "NotPaid" && pd < today ? "notpaid" : statuses[payment.status] } key={ index }>
|
||||
<div className="table_cell" data-title="Платеж №">{ payment.number }</div>
|
||||
<div className="table_cell" data-title="от">{ moment(payment.date, "DD-MM-YYYY").format("DD.MM.YYYY") }</div>
|
||||
<div className="table_cell" data-title="На сумму">{ numeral(payment.total_amount).format('') }</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">{ numeral(payment.vat_amount).format('') }</div>
|
||||
<div className="table_cell">
|
||||
{ payment.status === "Paid" && "Оплачено" }
|
||||
{ payment.status === "NotPaid" && "Не оплачено" }
|
||||
{ payment.status === "HalfPaid" && "Частично оплачено" }
|
||||
{ payment.status === "OverPaid" && (
|
||||
<div className="table_cell"><span>Переплата</span> <span>{ numeral(payment.total_amount).format('') } ₽</span></div>
|
||||
) }
|
||||
</div>
|
||||
<div className="table_cell">
|
||||
{ payment.invoices.map((invoice, invoice_index) =>
|
||||
(
|
||||
<React.Fragment key={invoice_index}>
|
||||
<p style={{ paddingBottom: "15px", lineHeight: "18px" }}>№{ invoice.number } от { moment(invoice.date, "DD-MM-YYYY").format("DD.MM.YYYY") } на сумму { numeral(invoice.total_amount).format('') } ₽</p>
|
||||
</React.Fragment>
|
||||
)) }
|
||||
</div>
|
||||
<button className="toggle_cell" onClick={ () => this._handle_onSetOpen(payment.number) }></button>
|
||||
return (
|
||||
<div className={ `table_row ${ opened.indexOf(payment.number) > -1 ? "opened" : "" }` } data-status={ payment.status === "NotPaid" && pd < today ? "notpaid" : statuses[payment.status] } key={ index }>
|
||||
<div className="table_cell" data-title="Платеж №">{ payment.number }</div>
|
||||
<div className="table_cell" data-title="от">{ moment(payment.date, "DD-MM-YYYY").format("DD.MM.YYYY") }</div>
|
||||
<div className="table_cell" data-title="На сумму">{ numeral(payment.total_amount).format('') }</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">{ numeral(payment.vat_amount).format('') }</div>
|
||||
<div className="table_cell">
|
||||
{ payment.status === "Paid" && "Оплачено" }
|
||||
{ payment.status === "NotPaid" && "Не оплачено" }
|
||||
{ payment.status === "HalfPaid" && "Частично оплачено" }
|
||||
{ payment.status === "OverPaid" && (
|
||||
<div className="table_cell"><span>Переплата</span> <span>{ numeral(payment.total_amount).format('') } ₽</span></div>
|
||||
) }
|
||||
</div>
|
||||
<div className="table_cell">
|
||||
{ payment.invoices.map((invoice, invoice_index) =>
|
||||
(
|
||||
<React.Fragment key={invoice_index}>
|
||||
<p style={{ paddingBottom: "15px", lineHeight: "18px" }}>№{ invoice.number } от { moment(invoice.date, "DD-MM-YYYY").format("DD.MM.YYYY") } на сумму { numeral(invoice.total_amount).format('') } ₽</p>
|
||||
</React.Fragment>
|
||||
)) }
|
||||
</div>
|
||||
<button className="toggle_cell" onClick={ () => this._handle_onSetOpen(payment.number) }></button>
|
||||
</div>
|
||||
)
|
||||
}) }
|
||||
{/*}
|
||||
<div className="table_row" data-status="overpayment-2">
|
||||
<div className="table_cell" data-title="Платеж №">11</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell"><span>Переплата</span> <span>15 000,00 ₽</span></div>
|
||||
<div className="table_cell">№18432 от 20/01/2021 на сумму 255 000,00 ₽</div>
|
||||
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
)
|
||||
}) }
|
||||
{/*}
|
||||
<div className="table_row" data-status="overpayment-2">
|
||||
<div className="table_cell" data-title="Платеж №">11</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell"><span>Переплата</span> <span>15 000,00 ₽</span></div>
|
||||
<div className="table_cell">№18432 от 20/01/2021 на сумму 255 000,00 ₽</div>
|
||||
<div className="table_row opened" data-status="overpayment-1">
|
||||
<div className="table_cell" data-title="Платеж №">12</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell">Переплата 10 000,00 ₽</div>
|
||||
<div className="table_cell">№34223 от 21/02/2021 на сумму 229 724,05 ₽</div>
|
||||
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
<div className="table_row opened" data-status="overpayment-1">
|
||||
<div className="table_cell" data-title="Платеж №">12</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell">Переплата 10 000,00 ₽</div>
|
||||
<div className="table_cell">№34223 от 21/02/2021 на сумму 229 724,05 ₽</div>
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
<div className="table_row" data-status="paid">
|
||||
<div className="table_cell" data-title="Платеж №">13</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell">Оплачено </div>
|
||||
<div className="table_cell">№44911 от 10/03/2021 на сумму 100 000,00 ₽
|
||||
№49877 от 21/03/2021 на сумму 139 724,05 ₽</div>
|
||||
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
<div className="table_row" data-status="paid">
|
||||
<div className="table_cell" data-title="Платеж №">13</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell">Оплачено </div>
|
||||
<div className="table_cell">№44911 от 10/03/2021 на сумму 100 000,00 ₽
|
||||
№49877 от 21/03/2021 на сумму 139 724,05 ₽</div>
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
<div className="table_row">
|
||||
<div className="table_cell" data-title="Платеж №">14</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell">Не оплачено </div>
|
||||
<div className="table_cell">-</div>
|
||||
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
<div className="table_row">
|
||||
<div className="table_cell" data-title="Платеж №">14</div>
|
||||
<div className="table_cell" data-title="от">21.02.2021</div>
|
||||
<div className="table_cell" data-title="На сумму">239 724,05</div>
|
||||
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
|
||||
<div className="table_cell">Не оплачено </div>
|
||||
<div className="table_cell">-</div>
|
||||
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
{*/}
|
||||
<button className="toggle_cell"></button>
|
||||
</div>
|
||||
{*/}
|
||||
</>
|
||||
) }
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
@ -3173,6 +3173,11 @@ source-map@^0.6.1:
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
spinners-react@^1.0.6:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/spinners-react/-/spinners-react-1.0.6.tgz#b7e43d6097fa30107718df718108f3586d50088f"
|
||||
integrity sha512-5J3sPZ9xogVA3CbLjFD3vTWhcuHb+mKFSBBEm5c8+8JSdPGweLQ6sPU+SD51FwZ2lqHks8DpiLk/lyLUa70oJA==
|
||||
|
||||
stacktrace-parser@0.1.10:
|
||||
version "0.1.10"
|
||||
resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user