JSON
This commit is contained in:
362
src/index.js
362
src/index.js
@@ -9,7 +9,7 @@
|
|||||||
// event.respondWith(handleRequest(event.request));
|
// event.respondWith(handleRequest(event.request));
|
||||||
// });
|
// });
|
||||||
export default {
|
export default {
|
||||||
async fetch(request, env, ctx) {
|
async fetch(request, _env, _ctx) {
|
||||||
return handleRequest(request);
|
return handleRequest(request);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -17,7 +17,7 @@ export default {
|
|||||||
async function handleRequest(request) {
|
async function handleRequest(request) {
|
||||||
const { searchParams } = new URL(request.url);
|
const { searchParams } = new URL(request.url);
|
||||||
const state = searchParams.get('state') || getRandomState();
|
const state = searchParams.get('state') || getRandomState();
|
||||||
let address, name, gender, phone, country;
|
let address, phone, country;
|
||||||
|
|
||||||
const remoteProvinces = ['NL', 'NT', 'NU', 'YT']; // Remote Canadian Provinces/Territories
|
const remoteProvinces = ['NL', 'NT', 'NU', 'YT']; // Remote Canadian Provinces/Territories
|
||||||
|
|
||||||
@@ -57,146 +57,47 @@ async function handleRequest(request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!address) {
|
if (!address) {
|
||||||
return new Response('Failed to retrieve detailed address', { status: 500 });
|
return new Response(
|
||||||
|
JSON.stringify({ error: 'Failed to retrieve detailed address' }),
|
||||||
|
{
|
||||||
|
status: 500,
|
||||||
|
headers: { 'content-type': 'application/json;charset=UTF-8' }
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const userResp = await fetch('https://fakerapi.it/api/v1/persons?_quantity=1&_locale=en_US');
|
const userResp = await fetch('https://fakerapi.it/api/v1/persons?_quantity=1&_locale=en_US');
|
||||||
const userJson = await userResp.json();
|
const userJson = await userResp.json();
|
||||||
|
let firstName, lastName;
|
||||||
if (userJson && userJson.data && userJson.data.length > 0) {
|
if (userJson && userJson.data && userJson.data.length > 0) {
|
||||||
const user = userJson.data[0];
|
const user = userJson.data[0];
|
||||||
name = `${user.firstname} ${user.lastname}`;
|
firstName = user.firstname;
|
||||||
gender = user.gender.charAt(0).toUpperCase() + user.gender.slice(1);
|
lastName = user.lastname;
|
||||||
phone = getRandomPhoneNumber(country, state);
|
phone = getRandomPhoneNumber(country, state);
|
||||||
} else {
|
} else {
|
||||||
name = getRandomName();
|
const randomName = getRandomName();
|
||||||
gender = 'Unknown';
|
const nameParts = randomName.split(' ');
|
||||||
|
firstName = nameParts[0];
|
||||||
|
lastName = nameParts[1];
|
||||||
phone = getRandomPhoneNumber(country, state);
|
phone = getRandomPhoneNumber(country, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
const html = `
|
// Parse address components
|
||||||
<!DOCTYPE html>
|
const addressParts = parseAddressComponents(address, state);
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Real US & Canadian Address Generator</title>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-direction: column;
|
|
||||||
min-height: 100vh;
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.container {
|
|
||||||
text-align: center;
|
|
||||||
background: white;
|
|
||||||
padding: 20px;
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
||||||
width: 90%;
|
|
||||||
max-width: 600px;
|
|
||||||
margin: 20px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.name, .gender, .phone, .address {
|
|
||||||
font-size: 1.5em;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.refresh-btn {
|
|
||||||
padding: 10px 20px;
|
|
||||||
background-color: #007bff;
|
|
||||||
color: white;
|
|
||||||
border: none;
|
|
||||||
border-radius: 5px;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
.refresh-btn:hover {
|
|
||||||
background-color: #0056b3;
|
|
||||||
}
|
|
||||||
.state-select {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
.map {
|
|
||||||
width: 100%;
|
|
||||||
height: 400px;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
.title {
|
|
||||||
font-size: 2em;
|
|
||||||
margin: 20px 0;
|
|
||||||
}
|
|
||||||
.footer {
|
|
||||||
margin-top: auto;
|
|
||||||
padding: 10px 0;
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
width: 100%;
|
|
||||||
text-align: center;
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
.footer a {
|
|
||||||
color: #007bff;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.footer a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
.copied {
|
|
||||||
position: absolute;
|
|
||||||
top: 10px;
|
|
||||||
right: 10px;
|
|
||||||
background: #28a745;
|
|
||||||
color: white;
|
|
||||||
padding: 5px 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="title">Real US & Canadian Address Generator</div>
|
|
||||||
<div class="container">
|
|
||||||
<div class="copied" id="copied">Copied!</div>
|
|
||||||
<div class="name" onclick="copyToClipboard('${name}')">${name}</div>
|
|
||||||
<div class="gender" onclick="copyToClipboard('${gender}')">${gender}</div>
|
|
||||||
<div class="phone" onclick="copyToClipboard('${phone.replace(/[()\s-]/g, '')}')">${phone}</div>
|
|
||||||
<div class="address" onclick="copyToClipboard('${address}')">${address}</div>
|
|
||||||
<button class="refresh-btn" onclick="window.location.reload();">Get Another Address</button>
|
|
||||||
<div class="state-select">
|
|
||||||
<label for="state">Select State/Province:</label>
|
|
||||||
<select id="state" onchange="changeState(this.value)">
|
|
||||||
${getStateOptions(state)}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<iframe class="map" src="https://www.google.com/maps?q=${encodeURIComponent(address)}&output=embed"></iframe>
|
|
||||||
</div>
|
|
||||||
<div class="footer">
|
|
||||||
© chatgpt.org.uk 2025 All rights reserved | <a href="https://chatgpt.org.uk" target="_blank">https://chatgpt.org.uk</a>
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
function copyToClipboard(text) {
|
|
||||||
navigator.clipboard.writeText(text).then(() => {
|
|
||||||
const copied = document.getElementById('copied')
|
|
||||||
copied.style.display = 'block'
|
|
||||||
setTimeout(() => {
|
|
||||||
copied.style.display = 'none'
|
|
||||||
}, 2000)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function changeState(state) {
|
|
||||||
window.location.href = \`?state=\${state}\`
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
`;
|
|
||||||
|
|
||||||
return new Response(html, {
|
const jsonResponse = {
|
||||||
headers: { 'content-type': 'text/html;charset=UTF-8' },
|
firstName: firstName,
|
||||||
|
lastName: lastName,
|
||||||
|
streetAddress: addressParts.streetAddress,
|
||||||
|
aptSuiteBldg: addressParts.aptSuiteBldg,
|
||||||
|
city: addressParts.city,
|
||||||
|
state: addressParts.state,
|
||||||
|
zipCode: addressParts.zipCode,
|
||||||
|
phoneNumber: phone
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Response(JSON.stringify(jsonResponse), {
|
||||||
|
headers: { 'content-type': 'application/json;charset=UTF-8' },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -559,34 +460,7 @@ function getRandomPhoneNumber(country, state) {
|
|||||||
AK: ['907'],
|
AK: ['907'],
|
||||||
AZ: ['480', '520', '602', '623', '928'],
|
AZ: ['480', '520', '602', '623', '928'],
|
||||||
AR: ['479', '501', '870'],
|
AR: ['479', '501', '870'],
|
||||||
CA: [
|
CA: [ '209', '213', '310', '323', '408', '415', '424', '510', '530', '559', '562', '619', '626', '650', '661', '707', '714', '760', '805', '818', '831', '858', '909', '916', '925', '949', ],
|
||||||
'209',
|
|
||||||
'213',
|
|
||||||
'310',
|
|
||||||
'323',
|
|
||||||
'408',
|
|
||||||
'415',
|
|
||||||
'424',
|
|
||||||
'510',
|
|
||||||
'530',
|
|
||||||
'559',
|
|
||||||
'562',
|
|
||||||
'619',
|
|
||||||
'626',
|
|
||||||
'650',
|
|
||||||
'661',
|
|
||||||
'707',
|
|
||||||
'714',
|
|
||||||
'760',
|
|
||||||
'805',
|
|
||||||
'818',
|
|
||||||
'831',
|
|
||||||
'858',
|
|
||||||
'909',
|
|
||||||
'916',
|
|
||||||
'925',
|
|
||||||
'949',
|
|
||||||
],
|
|
||||||
CO: ['303', '719', '720', '970'],
|
CO: ['303', '719', '720', '970'],
|
||||||
CT: ['203', '475', '860', '959'],
|
CT: ['203', '475', '860', '959'],
|
||||||
DE: ['302'],
|
DE: ['302'],
|
||||||
@@ -613,27 +487,7 @@ function getRandomPhoneNumber(country, state) {
|
|||||||
NH: ['603'],
|
NH: ['603'],
|
||||||
NJ: ['201', '551', '609', '732', '848', '856', '862', '908', '973'],
|
NJ: ['201', '551', '609', '732', '848', '856', '862', '908', '973'],
|
||||||
NM: ['505', '575'],
|
NM: ['505', '575'],
|
||||||
NY: [
|
NY: [ '212', '315', '332', '347', '516', '518', '585', '607', '631', '646', '680', '716', '718', '838', '845', '914', '917', '929', '934', ],
|
||||||
'212',
|
|
||||||
'315',
|
|
||||||
'332',
|
|
||||||
'347',
|
|
||||||
'516',
|
|
||||||
'518',
|
|
||||||
'585',
|
|
||||||
'607',
|
|
||||||
'631',
|
|
||||||
'646',
|
|
||||||
'680',
|
|
||||||
'716',
|
|
||||||
'718',
|
|
||||||
'838',
|
|
||||||
'845',
|
|
||||||
'914',
|
|
||||||
'917',
|
|
||||||
'929',
|
|
||||||
'934',
|
|
||||||
],
|
|
||||||
NC: ['252', '336', '704', '743', '828', '910', '919', '980', '984'],
|
NC: ['252', '336', '704', '743', '828', '910', '919', '980', '984'],
|
||||||
ND: ['701'],
|
ND: ['701'],
|
||||||
OH: ['216', '234', '283', '330', '380', '419', '440', '513', '567', '614', '740', '937'],
|
OH: ['216', '234', '283', '330', '380', '419', '440', '513', '567', '614', '740', '937'],
|
||||||
@@ -644,33 +498,7 @@ function getRandomPhoneNumber(country, state) {
|
|||||||
SC: ['803', '839', '843', '854', '864'],
|
SC: ['803', '839', '843', '854', '864'],
|
||||||
SD: ['605'],
|
SD: ['605'],
|
||||||
TN: ['423', '615', '629', '731', '865', '901', '931'],
|
TN: ['423', '615', '629', '731', '865', '901', '931'],
|
||||||
TX: [
|
TX: [ '210', '214', '254', '281', '325', '346', '409', '430', '432', '469', '512', '682', '713', '737', '806', '817', '830', '832', '903', '915', '936', '940', '956', '972', '979', ],
|
||||||
'210',
|
|
||||||
'214',
|
|
||||||
'254',
|
|
||||||
'281',
|
|
||||||
'325',
|
|
||||||
'346',
|
|
||||||
'409',
|
|
||||||
'430',
|
|
||||||
'432',
|
|
||||||
'469',
|
|
||||||
'512',
|
|
||||||
'682',
|
|
||||||
'713',
|
|
||||||
'737',
|
|
||||||
'806',
|
|
||||||
'817',
|
|
||||||
'830',
|
|
||||||
'832',
|
|
||||||
'903',
|
|
||||||
'915',
|
|
||||||
'936',
|
|
||||||
'940',
|
|
||||||
'956',
|
|
||||||
'972',
|
|
||||||
'979',
|
|
||||||
],
|
|
||||||
UT: ['385', '435', '801'],
|
UT: ['385', '435', '801'],
|
||||||
VT: ['802'],
|
VT: ['802'],
|
||||||
VA: ['276', '434', '540', '571', '703', '757', '804'],
|
VA: ['276', '434', '540', '571', '703', '757', '804'],
|
||||||
@@ -712,6 +540,50 @@ function getRandomPhoneNumber(country, state) {
|
|||||||
return `(${areaCode}) ${exchangeCode}-${lineNumber}`;
|
return `(${areaCode}) ${exchangeCode}-${lineNumber}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseAddressComponents(fullAddress, state) {
|
||||||
|
// Parse the formatted address to extract components
|
||||||
|
const parts = fullAddress.split(', ');
|
||||||
|
let streetAddress = '';
|
||||||
|
let aptSuiteBldg = '';
|
||||||
|
let city = '';
|
||||||
|
let stateCode = '';
|
||||||
|
let zipCode = '';
|
||||||
|
|
||||||
|
if (parts.length >= 3) {
|
||||||
|
streetAddress = parts[0] || '';
|
||||||
|
city = parts[1] || '';
|
||||||
|
|
||||||
|
// Handle state and zip from the third part
|
||||||
|
if (parts[2]) {
|
||||||
|
const stateZipMatch = parts[2].match(/^([A-Z]{2})\s*([A-Z0-9\s-]*)/);
|
||||||
|
if (stateZipMatch) {
|
||||||
|
stateCode = stateZipMatch[1];
|
||||||
|
zipCode = stateZipMatch[2] ? stateZipMatch[2].trim() : '';
|
||||||
|
} else {
|
||||||
|
stateCode = state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For partial addresses
|
||||||
|
if (parts.length === 2) {
|
||||||
|
city = parts[0] || '';
|
||||||
|
const stateZipMatch = parts[1].match(/^([A-Z]{2})\s*([A-Z0-9\s-]*)/);
|
||||||
|
if (stateZipMatch) {
|
||||||
|
stateCode = stateZipMatch[1];
|
||||||
|
zipCode = stateZipMatch[2] ? stateZipMatch[2].trim() : '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
streetAddress: streetAddress,
|
||||||
|
aptSuiteBldg: aptSuiteBldg, // Empty for now, could be enhanced
|
||||||
|
city: city,
|
||||||
|
state: stateCode || state,
|
||||||
|
zipCode: zipCode
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function getRandomState() {
|
function getRandomState() {
|
||||||
const states = [
|
const states = [
|
||||||
// US States
|
// US States
|
||||||
@@ -728,84 +600,6 @@ function getRandomState() {
|
|||||||
return states[Math.floor(Math.random() * states.length)];
|
return states[Math.floor(Math.random() * states.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getStateOptions(selectedState) {
|
|
||||||
const states = [
|
|
||||||
// US States
|
|
||||||
{ full: 'Alabama', abbr: 'AL', country: 'US' },
|
|
||||||
{ full: 'Alaska', abbr: 'AK', country: 'US' },
|
|
||||||
{ full: 'Arizona', abbr: 'AZ', country: 'US' },
|
|
||||||
{ full: 'Arkansas', abbr: 'AR', country: 'US' },
|
|
||||||
{ full: 'California', abbr: 'CA', country: 'US' },
|
|
||||||
{ full: 'Colorado', abbr: 'CO', country: 'US' },
|
|
||||||
{ full: 'Connecticut', abbr: 'CT', country: 'US' },
|
|
||||||
{ full: 'Delaware', abbr: 'DE', country: 'US' },
|
|
||||||
{ full: 'Florida', abbr: 'FL', country: 'US' },
|
|
||||||
{ full: 'Georgia', abbr: 'GA', country: 'US' },
|
|
||||||
{ full: 'Hawaii', abbr: 'HI', country: 'US' },
|
|
||||||
{ full: 'Idaho', abbr: 'ID', country: 'US' },
|
|
||||||
{ full: 'Illinois', abbr: 'IL', country: 'US' },
|
|
||||||
{ full: 'Indiana', abbr: 'IN', country: 'US' },
|
|
||||||
{ full: 'Iowa', abbr: 'IA', country: 'US' },
|
|
||||||
{ full: 'Kansas', abbr: 'KS', country: 'US' },
|
|
||||||
{ full: 'Kentucky', abbr: 'KY', country: 'US' },
|
|
||||||
{ full: 'Louisiana', abbr: 'LA', country: 'US' },
|
|
||||||
{ full: 'Maine', abbr: 'ME', country: 'US' },
|
|
||||||
{ full: 'Maryland', abbr: 'MD', country: 'US' },
|
|
||||||
{ full: 'Massachusetts', abbr: 'MA', country: 'US' },
|
|
||||||
{ full: 'Michigan', abbr: 'MI', country: 'US' },
|
|
||||||
{ full: 'Minnesota', abbr: 'MN', country: 'US' },
|
|
||||||
{ full: 'Mississippi', abbr: 'MS', country: 'US' },
|
|
||||||
{ full: 'Missouri', abbr: 'MO', country: 'US' },
|
|
||||||
{ full: 'Montana', abbr: 'MT', country: 'US' },
|
|
||||||
{ full: 'Nebraska', abbr: 'NE', country: 'US' },
|
|
||||||
{ full: 'Nevada', abbr: 'NV', country: 'US' },
|
|
||||||
{ full: 'New Hampshire', abbr: 'NH', country: 'US' },
|
|
||||||
{ full: 'New Jersey', abbr: 'NJ', country: 'US' },
|
|
||||||
{ full: 'New Mexico', abbr: 'NM', country: 'US' },
|
|
||||||
{ full: 'New York', abbr: 'NY', country: 'US' },
|
|
||||||
{ full: 'North Carolina', abbr: 'NC', country: 'US' },
|
|
||||||
{ full: 'North Dakota', abbr: 'ND', country: 'US' },
|
|
||||||
{ full: 'Ohio', abbr: 'OH', country: 'US' },
|
|
||||||
{ full: 'Oklahoma', abbr: 'OK', country: 'US' },
|
|
||||||
{ full: 'Oregon', abbr: 'OR', country: 'US' },
|
|
||||||
{ full: 'Pennsylvania', abbr: 'PA', country: 'US' },
|
|
||||||
{ full: 'Rhode Island', abbr: 'RI', country: 'US' },
|
|
||||||
{ full: 'South Carolina', abbr: 'SC', country: 'US' },
|
|
||||||
{ full: 'South Dakota', abbr: 'SD', country: 'US' },
|
|
||||||
{ full: 'Tennessee', abbr: 'TN', country: 'US' },
|
|
||||||
{ full: 'Texas', abbr: 'TX', country: 'US' },
|
|
||||||
{ full: 'Utah', abbr: 'UT', country: 'US' },
|
|
||||||
{ full: 'Vermont', abbr: 'VT', country: 'US' },
|
|
||||||
{ full: 'Virginia', abbr: 'VA', country: 'US' },
|
|
||||||
{ full: 'Washington', abbr: 'WA', country: 'US' },
|
|
||||||
{ full: 'West Virginia', abbr: 'WV', country: 'US' },
|
|
||||||
{ full: 'Wisconsin', abbr: 'WI', country: 'US' },
|
|
||||||
{ full: 'Wyoming', abbr: 'WY', country: 'US' },
|
|
||||||
// Canadian Provinces and Territories
|
|
||||||
{ full: 'Alberta', abbr: 'AB', country: 'CA' },
|
|
||||||
{ full: 'British Columbia', abbr: 'BC', country: 'CA' },
|
|
||||||
{ full: 'Manitoba', abbr: 'MB', country: 'CA' },
|
|
||||||
{ full: 'New Brunswick', abbr: 'NB', country: 'CA' },
|
|
||||||
{ full: 'Newfoundland and Labrador', abbr: 'NL', country: 'CA' },
|
|
||||||
{ full: 'Nova Scotia', abbr: 'NS', country: 'CA' },
|
|
||||||
{ full: 'Ontario', abbr: 'ON', country: 'CA' },
|
|
||||||
{ full: 'Prince Edward Island', abbr: 'PE', country: 'CA' },
|
|
||||||
{ full: 'Quebec', abbr: 'QC', country: 'CA' },
|
|
||||||
{ full: 'Saskatchewan', abbr: 'SK', country: 'CA' },
|
|
||||||
{ full: 'Northwest Territories', abbr: 'NT', country: 'CA' },
|
|
||||||
{ full: 'Nunavut', abbr: 'NU', country: 'CA' },
|
|
||||||
{ full: 'Yukon', abbr: 'YT', country: 'CA' },
|
|
||||||
];
|
|
||||||
return states
|
|
||||||
.map(
|
|
||||||
(state) =>
|
|
||||||
`<option value="${state.abbr}" ${state.abbr === selectedState ? 'selected' : ''}>${state.full} (${state.abbr}) - ${
|
|
||||||
state.country === 'US' ? 'USA' : 'Canada'
|
|
||||||
}</option>`
|
|
||||||
)
|
|
||||||
.join('');
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRandomName() {
|
function getRandomName() {
|
||||||
const firstNames = ['John', 'Jane', 'Alex', 'Emily', 'Chris', 'Katie', 'Mike', 'Laura', 'David', 'Sarah'];
|
const firstNames = ['John', 'Jane', 'Alex', 'Emily', 'Chris', 'Katie', 'Mike', 'Laura', 'David', 'Sarah'];
|
||||||
const lastNames = ['Smith', 'Johnson', 'Brown', 'Williams', 'Jones', 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez'];
|
const lastNames = ['Smith', 'Johnson', 'Brown', 'Williams', 'Jones', 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez'];
|
||||||
|
@@ -20,7 +20,7 @@ describe('Hello World worker', () => {
|
|||||||
|
|
||||||
it('_', async () => {
|
it('_', async () => {
|
||||||
const response = await SELF.fetch('http://example.com');
|
const response = await SELF.fetch('http://example.com');
|
||||||
const responseText = await response.text();
|
const jsonResponse = await response.json();
|
||||||
console.debug(`responseText :>> `, responseText);
|
console.debug(`jsonResponse :>> `, jsonResponse);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user