/*
GoToSocial
Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
"use strict";
const Promise = require("bluebird");
const React = require("react");
const fileDownload = require("js-file-download");
function sortBlocks(blocks) {
return blocks.sort((a, b) => { // alphabetical sort
return a.domain.localeCompare(b.domain);
});
}
function deduplicateBlocks(blocks) {
let a = new Map();
blocks.forEach((block) => {
a.set(block.id, block);
});
return Array.from(a.values());
}
module.exports = function Blocks({oauth}) {
const [blocks, setBlocks] = React.useState([]);
const [info, setInfo] = React.useState("Fetching blocks");
const [errorMsg, setError] = React.useState("");
const [checked, setChecked] = React.useState(new Set());
React.useEffect(() => {
Promise.try(() => {
return oauth.apiRequest("/api/v1/admin/domain_blocks", undefined, undefined, "GET");
}).then((json) => {
setInfo("");
setError("");
setBlocks(sortBlocks(json));
}).catch((e) => {
setError(e.message);
setInfo("");
});
}, []);
let blockList = blocks.map((block) => {
function update(e) {
let newChecked = new Set(checked.values());
if (e.target.checked) {
newChecked.add(block.id);
} else {
newChecked.delete(block.id);
}
setChecked(newChecked);
}
return (
{block.domain}
{(new Date(block.created_at)).toLocaleString()}
);
});
function clearChecked() {
setChecked(new Set());
}
function undoChecked() {
let amount = checked.size;
if(confirm(`Are you sure you want to remove ${amount} block(s)?`)) {
setInfo("");
Promise.map(Array.from(checked.values()), (block) => {
console.log("deleting", block);
return oauth.apiRequest(`/api/v1/admin/domain_blocks/${block}`, "DELETE");
}).then((res) => {
console.log(res);
setInfo(`Deleted ${amount} blocks: ${res.map((a) => a.domain).join(", ")}`);
}).catch((e) => {
setError(e);
});
let newBlocks = blocks.filter((block) => {
if (checked.size > 0 && checked.has(block.id)) {
checked.delete(block.id);
return false;
} else {
return true;
}
});
setBlocks(newBlocks);
clearChecked();
}
}
return (