added update_my_personal_data, get_sent_rupee_list and other fixes
This commit is contained in:
parent
e70b2b3a3c
commit
45595704ef
178
index.html
178
index.html
@ -11156,6 +11156,7 @@
|
|||||||
master_configurations: {},
|
master_configurations: {},
|
||||||
actions: {},
|
actions: {},
|
||||||
blocked_flo_ids: [],
|
blocked_flo_ids: [],
|
||||||
|
personal_data: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
token_app.actions = {
|
token_app.actions = {
|
||||||
@ -11164,6 +11165,7 @@
|
|||||||
const num=3;
|
const num=3;
|
||||||
text = `masterFLOAddress=FD5hK9ryBogJ5AcSvCy1tW5as8jRTkMLky
|
text = `masterFLOAddress=FD5hK9ryBogJ5AcSvCy1tW5as8jRTkMLky
|
||||||
#!#CURRENCY=INR
|
#!#CURRENCY=INR
|
||||||
|
#!#TYPE_UPI_APP=UPI_APP_TEST${num}
|
||||||
#!#TYPE_DEPOSITS=CASH_DEPOSITS_TEST${num}
|
#!#TYPE_DEPOSITS=CASH_DEPOSITS_TEST${num}
|
||||||
#!#TYPE_WITHDRAWS=CASH_WITHDRAWS_TEST${num}
|
#!#TYPE_WITHDRAWS=CASH_WITHDRAWS_TEST${num}
|
||||||
#!#TYPE_MSGES=USER_MESSAGES_TEST${num}
|
#!#TYPE_MSGES=USER_MESSAGES_TEST${num}
|
||||||
@ -11181,6 +11183,10 @@
|
|||||||
#!#TYPE_REQUEST_PAYMENT_DECLINED=REQUEST_PAYMENT_DECLINED_TEST${num}
|
#!#TYPE_REQUEST_PAYMENT_DECLINED=REQUEST_PAYMENT_DECLINED_TEST${num}
|
||||||
#!#TYPE_REQUEST_PAYMENT_APPROVED=REQUEST_PAYMENT_APPROVED_TEST${num}
|
#!#TYPE_REQUEST_PAYMENT_APPROVED=REQUEST_PAYMENT_APPROVED_TEST${num}
|
||||||
#!#TYPE_UNCONFIRMED_BALANCE_CLAIM_REQUESTS=TYPE_UNCONFIRMED_BALANCE_CLAIM_REQUESTS_TEST${num}
|
#!#TYPE_UNCONFIRMED_BALANCE_CLAIM_REQUESTS=TYPE_UNCONFIRMED_BALANCE_CLAIM_REQUESTS_TEST${num}
|
||||||
|
#!#TYPE_SENT_TOKENS=TYPE_SENT_TOKENS_TEST${num}
|
||||||
|
#!#TYPE_MY_PERSONAL_DATA=TYPE_MY_PERSONAL_DATA_TEST${num}
|
||||||
|
#!#TYPE_UNCONFIRMED_RUPEE_DEPOSITS=TYPE_UNCONFIRMED_RUPEE_DEPOSITS_TEST${num}
|
||||||
|
#!#TYPE_PROCESSED_UNCONFIRMED_BALANCE_CLAIM_REQUESTS=TYPE_PROCESSED_UNCONFIRMED_BALANCE_CLAIM_REQUESTS_TEST${num}
|
||||||
#!#vendors=FGtPEBu2NFFYkqFrA9NDBJJLpVhyuPubDj,
|
#!#vendors=FGtPEBu2NFFYkqFrA9NDBJJLpVhyuPubDj,
|
||||||
#!#helplineFloId=F9MAyvT5b9aSfsuukAungrbt1L5fgmJmuK
|
#!#helplineFloId=F9MAyvT5b9aSfsuukAungrbt1L5fgmJmuK
|
||||||
#!#cashiers=
|
#!#cashiers=
|
||||||
@ -11355,7 +11361,12 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (Object.keys(token_app.master_configurations.cashiers).includes(myFloID)) {
|
if (Object.keys(token_app.master_configurations.cashiers).includes(myFloID)) {
|
||||||
await Promise.all([floCloudAPI.requestGeneralData(token_app.master_configurations
|
|
||||||
|
await Promise.all([
|
||||||
|
|
||||||
|
create_root_structure(),
|
||||||
|
|
||||||
|
floCloudAPI.requestGeneralData(token_app.master_configurations
|
||||||
.TYPE_DEPOSITS, {
|
.TYPE_DEPOSITS, {
|
||||||
receiverID: myFloID
|
receiverID: myFloID
|
||||||
}),
|
}),
|
||||||
@ -11379,6 +11390,9 @@
|
|||||||
await clearCashierData();
|
await clearCashierData();
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
|
|
||||||
|
create_root_structure(),
|
||||||
|
|
||||||
floCloudAPI.requestGeneralData(token_app.master_configurations
|
floCloudAPI.requestGeneralData(token_app.master_configurations
|
||||||
.TYPE_FILE_DEPOSITS_COMPLAINT),
|
.TYPE_FILE_DEPOSITS_COMPLAINT),
|
||||||
floCloudAPI.requestGeneralData(token_app.master_configurations
|
floCloudAPI.requestGeneralData(token_app.master_configurations
|
||||||
@ -11429,7 +11443,9 @@
|
|||||||
promises.push(p4);
|
promises.push(p4);
|
||||||
|
|
||||||
await Promise.all(promises.map(prom => prom.func.call(floCloudAPI,prom.arg1, prom.arg2)));
|
await Promise.all(promises.map(prom => prom.func.call(floCloudAPI,prom.arg1, prom.arg2)));
|
||||||
|
|
||||||
|
create_root_structure();
|
||||||
|
|
||||||
return promises;
|
return promises;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -11440,20 +11456,37 @@
|
|||||||
|
|
||||||
<!-- Cashier functions -->
|
<!-- Cashier functions -->
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
async function reset_cloud_object(object_name, options) {
|
||||||
|
try {
|
||||||
|
if(typeof floGlobals.appObjects[object_name] !== 'object'
|
||||||
|
|| floGlobals.appObjects[object_name]==null) {
|
||||||
|
floCloudAPI.requestObjectData(object_name, options)
|
||||||
|
.then(resp=>{
|
||||||
|
if(typeof floGlobals.appObjects[object_name] !== 'object'
|
||||||
|
|| floGlobals.appObjects[object_name]==null) {
|
||||||
|
floGlobals.appObjects[object_name] = {};
|
||||||
|
floCloudAPI.resetObjectData(object_name)
|
||||||
|
.then(()=>floCloudAPI.requestObjectData(object_name, options))
|
||||||
|
.then(()=>true);
|
||||||
|
} else return false;
|
||||||
|
});
|
||||||
|
} else return false;
|
||||||
|
} catch(error) {
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
// Create root structure
|
// Create root structure
|
||||||
function create_root_structure() {
|
async function create_root_structure() {
|
||||||
token_app.requests = {};
|
|
||||||
token_app.requests.deposits = {};
|
|
||||||
token_app.requests.withdraws = {};
|
|
||||||
floCloudAPI.resetObjectData(token_app, floGlobals.application, {
|
|
||||||
receiverID: floGlobals.adminID
|
|
||||||
});
|
|
||||||
|
|
||||||
floGlobals.appObjects["unconfirmed_rupee_deposits"] = {};
|
let promises = [];
|
||||||
floCloudAPI.resetObjectData("unconfirmed_rupee_deposits");
|
promises.push(reset_cloud_object(token_app.master_configurations.TYPE_MY_PERSONAL_DATA));
|
||||||
|
if(Object.keys(token_app.master_configurations.cashiers).includes(myFloID)) {
|
||||||
floGlobals.appObjects["processed_unconfirmed_balance_claim_requests"] = {};
|
promises.push(reset_cloud_object(token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS));
|
||||||
floCloudAPI.resetObjectData("processed_unconfirmed_balance_claim_requests");
|
promises.push(reset_cloud_object(token_app.master_configurations.TYPE_PROCESSED_UNCONFIRMED_BALANCE_CLAIM_REQUESTS));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all(promises);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function show_deposit_request() {
|
async function show_deposit_request() {
|
||||||
@ -11595,9 +11628,9 @@
|
|||||||
validateDepositTxidInBlockchain();
|
validateDepositTxidInBlockchain();
|
||||||
n++;
|
n++;
|
||||||
} else {
|
} else {
|
||||||
floGlobals.appObjects["unconfirmed_rupee_deposits"][flo_txid] = input_data;
|
floGlobals.appObjects[token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS][flo_txid] = input_data;
|
||||||
let receiverID = floGlobals.adminID;
|
let receiverID = floGlobals.adminID;
|
||||||
floCloudAPI.updateObjectData("unconfirmed_rupee_deposits", { receiverID });
|
floCloudAPI.updateObjectData(token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS, { receiverID });
|
||||||
notify('Txid '+flo_txid+' added in Unconfirmed Rupee Deposits.', 'error');
|
notify('Txid '+flo_txid+' added in Unconfirmed Rupee Deposits.', 'error');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11724,7 +11757,7 @@
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
notify(`Transaction successful: ${flo_txid}`, 'success', true, true);
|
notify(`Transaction successful: ${flo_txid}`, 'success', true, true);
|
||||||
if (payingRequested) {
|
if (payingRequested===true) {
|
||||||
const all_reqs = floDapps.getNextGeneralData(token_app.master_configurations
|
const all_reqs = floDapps.getNextGeneralData(token_app.master_configurations
|
||||||
.TYPE_REQUEST_PAYMENT, "0").reverse();
|
.TYPE_REQUEST_PAYMENT, "0").reverse();
|
||||||
|
|
||||||
@ -11734,6 +11767,13 @@
|
|||||||
|
|
||||||
payment_request_status(original_req, 'APPROVED')
|
payment_request_status(original_req, 'APPROVED')
|
||||||
showPayRequests();
|
showPayRequests();
|
||||||
|
} else if(payingRequested===false) {
|
||||||
|
let receiverID = myFloID;
|
||||||
|
floGlobals.appObjects[token_app.master_configurations.TYPE_SENT_TOKENS][flo_txid]={
|
||||||
|
token_sender, token_receiver, token_amount, token_name_radio,
|
||||||
|
flo_txid, "datetime": + new Date()
|
||||||
|
};
|
||||||
|
floCloudAPI.updateObjectData(token_app.master_configurations.TYPE_SENT_TOKENS, options = {receiverID});
|
||||||
}
|
}
|
||||||
hidePopup()
|
hidePopup()
|
||||||
return true;
|
return true;
|
||||||
@ -11904,8 +11944,10 @@
|
|||||||
.TYPE_UNCONFIRMED_BALANCE_CLAIM_REQUESTS, "0");
|
.TYPE_UNCONFIRMED_BALANCE_CLAIM_REQUESTS, "0");
|
||||||
|
|
||||||
// load processed claims
|
// load processed claims
|
||||||
await floCloudAPI.requestObjectData("processed_unconfirmed_balance_claim_requests", { receiverID:floGlobals.adminID });
|
const cashiersList = Object.keys(token_app.master_configurations.cashiers);
|
||||||
const processed_unconfirmed_balance_claim_requests_list = floGlobals.appObjects["processed_unconfirmed_balance_claim_requests"];
|
await floCloudAPI.requestObjectData(token_app.master_configurations.TYPE_PROCESSED_UNCONFIRMED_BALANCE_CLAIM_REQUESTS,
|
||||||
|
{ receiverID:floGlobals.adminID, senderIDs:cashiersList });
|
||||||
|
const processed_unconfirmed_balance_claim_requests_list = floGlobals.appObjects[TYPE_PROCESSED_UNCONFIRMED_BALANCE_CLAIM_REQUESTS];
|
||||||
const processed_unconfirmed_balance_claim_requests_txid_arr = Object.keys(processed_unconfirmed_balance_claim_requests_list);
|
const processed_unconfirmed_balance_claim_requests_txid_arr = Object.keys(processed_unconfirmed_balance_claim_requests_list);
|
||||||
|
|
||||||
console.log(unconfirmed_cash_deposit_claims);
|
console.log(unconfirmed_cash_deposit_claims);
|
||||||
@ -11956,9 +11998,9 @@
|
|||||||
if(typeof validate_txid=="object" && validate_txid.result=="ok") {
|
if(typeof validate_txid=="object" && validate_txid.result=="ok") {
|
||||||
// mark as resolved
|
// mark as resolved
|
||||||
subject_req.new_flo_txid = new_txid;
|
subject_req.new_flo_txid = new_txid;
|
||||||
floGlobals.appObjects["processed_unconfirmed_balance_claim_requests"][subject_req.flo_txid] = subject_req;
|
floGlobals.appObjects[TYPE_PROCESSED_UNCONFIRMED_BALANCE_CLAIM_REQUESTS][subject_req.flo_txid] = subject_req;
|
||||||
let receiverID = floGlobals.adminID;
|
let receiverID = floGlobals.adminID;
|
||||||
await floCloudAPI.updateObjectData("processed_unconfirmed_balance_claim_requests", { receiverID });
|
await floCloudAPI.updateObjectData(TYPE_PROCESSED_UNCONFIRMED_BALANCE_CLAIM_REQUESTS, { receiverID });
|
||||||
notify('Token transfer for unconfirmed desposit successfull. Txid: '+ new_txid);
|
notify('Token transfer for unconfirmed desposit successfull. Txid: '+ new_txid);
|
||||||
|
|
||||||
} else if(n<=30) {
|
} else if(n<=30) {
|
||||||
@ -12201,10 +12243,9 @@
|
|||||||
frag.append(render.depositActivity(usr_deposits.vectorClock, upi_txid, deposit_amount))
|
frag.append(render.depositActivity(usr_deposits.vectorClock, upi_txid, deposit_amount))
|
||||||
}
|
}
|
||||||
|
|
||||||
depositActivityContainer.innerHTML = ``;
|
depositActivityContainer.innerHTML = ``;
|
||||||
depositActivityContainer.append(frag)
|
depositActivityContainer.append(frag)
|
||||||
|
|
||||||
|
|
||||||
for (usr_withdraws of withdraw_msg) {
|
for (usr_withdraws of withdraw_msg) {
|
||||||
let {
|
let {
|
||||||
token_txid,
|
token_txid,
|
||||||
@ -12228,14 +12269,14 @@
|
|||||||
amount))
|
amount))
|
||||||
}
|
}
|
||||||
|
|
||||||
payCashierActivityContainer.innerHTML = ``;
|
payCashierActivityContainer.innerHTML = ``;
|
||||||
payCashierActivityContainer.append(frag)
|
payCashierActivityContainer.append(frag)
|
||||||
|
|
||||||
for (msg of user_msg) {
|
for (msg of user_msg) {
|
||||||
frag.append(render.cashierMessage(msg))
|
frag.append(render.cashierMessage(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
cashierMessageContainer.innerHTML = ``;
|
cashierMessageContainer.innerHTML = ``;
|
||||||
cashierMessageContainer.append(frag)
|
cashierMessageContainer.append(frag)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
notify(e, 'error');
|
notify(e, 'error');
|
||||||
@ -12309,21 +12350,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function show_payment_requests() {
|
async function show_payment_requests(requests_received=true, recvr_id='') {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
let options = {receiverID: myFloID};
|
||||||
|
if(requests_received!==true) {
|
||||||
|
options = {receiverID: recvr_id, senderIDs: [myFloID]}
|
||||||
|
}
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
floCloudAPI.requestGeneralData(token_app.master_configurations.TYPE_REQUEST_PAYMENT, {
|
floCloudAPI.requestGeneralData(token_app.master_configurations.TYPE_REQUEST_PAYMENT, options),
|
||||||
receiverID: myFloID
|
floCloudAPI.requestGeneralData(token_app.master_configurations.TYPE_REQUEST_PAYMENT_DECLINED, options),
|
||||||
}),
|
floCloudAPI.requestGeneralData(token_app.master_configurations.TYPE_REQUEST_PAYMENT_APPROVED, options)
|
||||||
floCloudAPI.requestGeneralData(token_app.master_configurations
|
]);
|
||||||
.TYPE_REQUEST_PAYMENT_DECLINED, {
|
|
||||||
receiverID: myFloID
|
|
||||||
}),
|
|
||||||
floCloudAPI.requestGeneralData(token_app.master_configurations
|
|
||||||
.TYPE_REQUEST_PAYMENT_APPROVED, {
|
|
||||||
receiverID: myFloID
|
|
||||||
})
|
|
||||||
])
|
|
||||||
const general_msg = floDapps.getNextGeneralData(token_app.master_configurations
|
const general_msg = floDapps.getNextGeneralData(token_app.master_configurations
|
||||||
.TYPE_REQUEST_PAYMENT, "0").reverse(),
|
.TYPE_REQUEST_PAYMENT, "0").reverse(),
|
||||||
declined_reqs_list = floDapps.getNextGeneralData(token_app.master_configurations
|
declined_reqs_list = floDapps.getNextGeneralData(token_app.master_configurations
|
||||||
@ -12424,19 +12463,21 @@
|
|||||||
tokens_transfers_tx_list = Object.keys(tokens_transfers_tx_list.transactions);
|
tokens_transfers_tx_list = Object.keys(tokens_transfers_tx_list.transactions);
|
||||||
let receiverID = floGlobals.adminID;
|
let receiverID = floGlobals.adminID;
|
||||||
let senderIDs = Object.keys(token_app.master_configurations.cashiers);
|
let senderIDs = Object.keys(token_app.master_configurations.cashiers);
|
||||||
await floCloudAPI.requestObjectData("unconfirmed_rupee_deposits", { receiverID, senderIDs });
|
await floCloudAPI.requestObjectData(token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS,
|
||||||
let unconfirmed_tx_list = Object.keys(floGlobals.appObjects["unconfirmed_rupee_deposits"]);
|
{ receiverID, senderIDs });
|
||||||
|
let unconfirmed_tx_list = Object.keys(floGlobals.appObjects[token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS]);
|
||||||
//console.log(unconfirmed_tx_list);
|
//console.log(unconfirmed_tx_list);
|
||||||
//console.log(tokens_transfers_tx_list);
|
//console.log(tokens_transfers_tx_list);
|
||||||
//console.log(token_balance);
|
//console.log(token_balance);
|
||||||
|
|
||||||
let unconfirmed_balance=0;
|
let unconfirmed_balance=0;
|
||||||
for(ut of unconfirmed_tx_list) {
|
for(ut of unconfirmed_tx_list) {
|
||||||
let subject_deposit = floGlobals.appObjects["unconfirmed_rupee_deposits"][ut];
|
let subject_deposit = floGlobals.appObjects[token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS][ut];
|
||||||
|
if(subject_deposit.receiver_flo_id!==myFloID) continue;
|
||||||
if(tokens_transfers_tx_list.includes(ut)) {
|
if(tokens_transfers_tx_list.includes(ut)) {
|
||||||
// remove this item from unconfirmed_tx_list
|
// remove this item from unconfirmed_tx_list
|
||||||
if(delete subject_deposit)
|
if(delete subject_deposit)
|
||||||
floCloudAPI.updateObjectData("unconfirmed_rupee_deposits", { receiverID });
|
floCloudAPI.updateObjectData(token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS, { receiverID });
|
||||||
} else {
|
} else {
|
||||||
unconfirmed_balance += Number(subject_deposit["tokens_transferred"]);
|
unconfirmed_balance += Number(subject_deposit["tokens_transferred"]);
|
||||||
let dt1 = new Date(subject_deposit["datetime"]);
|
let dt1 = new Date(subject_deposit["datetime"]);
|
||||||
@ -12449,7 +12490,7 @@
|
|||||||
receiverID: cashier
|
receiverID: cashier
|
||||||
});
|
});
|
||||||
subject_deposit["unconfirmed_balance_claimed"] = true;
|
subject_deposit["unconfirmed_balance_claimed"] = true;
|
||||||
floCloudAPI.updateObjectData("unconfirmed_rupee_deposits", { receiverID });
|
floCloudAPI.updateObjectData(token_app.master_configurations.TYPE_UNCONFIRMED_RUPEE_DEPOSITS, { receiverID });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -12461,6 +12502,57 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function get_sent_rupee_list() {
|
||||||
|
try {
|
||||||
|
let senderIDs = [myFloID];
|
||||||
|
let receiverID = myFloID;
|
||||||
|
floGlobals.appObjects[token_app.master_configurations.TYPE_SENT_TOKENS][flo_txid]={
|
||||||
|
token_sender, token_receiver, token_amount, token_name_radio,
|
||||||
|
flo_txid, "datetime": + new Date()
|
||||||
|
};
|
||||||
|
await floCloudAPI.requestObjectData(token_app.master_configurations.TYPE_SENT_TOKENS,
|
||||||
|
options = { receiverID, senderIDs });
|
||||||
|
|
||||||
|
const sent_tokens_list = Object.keys(floGlobals.appObjects
|
||||||
|
[token_app.master_configurations.TYPE_SENT_TOKENS]);
|
||||||
|
|
||||||
|
console.log(sent_tokens_list);
|
||||||
|
// #todo: while displying validate senderIDs===myFloID
|
||||||
|
|
||||||
|
} catch(error) {
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function update_my_personal_data(upi_id) {
|
||||||
|
try {
|
||||||
|
let senderIDs = [myFloID];
|
||||||
|
let receiverID = myFloID;
|
||||||
|
|
||||||
|
floGlobals.appObjects[token_app.master_configurations.TYPE_MY_PERSONAL_DATA][myFloID]={
|
||||||
|
myFloID, "myUPI":upi_id, "last_update": + new Date()
|
||||||
|
};
|
||||||
|
await floCloudAPI.requestObjectData(token_app.master_configurations.TYPE_MY_PERSONAL_DATA,
|
||||||
|
options = { receiverID, senderIDs });
|
||||||
|
|
||||||
|
await floCloudAPI.updateObjectData(token_app.master_configurations.TYPE_MY_PERSONAL_DATA,
|
||||||
|
options = { receiverID, senderIDs });
|
||||||
|
|
||||||
|
await floCloudAPI.requestObjectData(token_app.master_configurations.TYPE_MY_PERSONAL_DATA,
|
||||||
|
options = { receiverID, senderIDs });
|
||||||
|
|
||||||
|
const sent_tokens_list = Object.keys(floGlobals.appObjects
|
||||||
|
[token_app.master_configurations.TYPE_MY_PERSONAL_DATA]);
|
||||||
|
|
||||||
|
notify('Personal information updated successfully.')
|
||||||
|
|
||||||
|
return sent_tokens_list;
|
||||||
|
|
||||||
|
} catch(error) {
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- Helpline -->
|
<!-- Helpline -->
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user