gotosocial/web/assets/bundled/admin-panel.js

1115 lines
104 KiB
JavaScript
Raw Normal View History

require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({11:[function(require,module,exports){
"use strict";
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var Promise = require("bluebird");
var React = require("react");
var ReactDom = require("react-dom");
var oauthLib = require("./oauth.js");
var Auth = require("./auth");
var Settings = require("./settings");
var Blocks = require("./blocks");
require("./style.css");
function App() {
var _React$useState = React.useState(),
_React$useState2 = _slicedToArray(_React$useState, 2),
oauth = _React$useState2[0],
setOauth = _React$useState2[1];
var _React$useState3 = React.useState(false),
_React$useState4 = _slicedToArray(_React$useState3, 2),
hasAuth = _React$useState4[0],
setAuth = _React$useState4[1];
var _React$useState5 = React.useState(localStorage.getItem("oauth")),
_React$useState6 = _slicedToArray(_React$useState5, 2),
oauthState = _React$useState6[0],
setOauthState = _React$useState6[1];
React.useEffect(function () {
var state = localStorage.getItem("oauth");
if (state != undefined) {
state = JSON.parse(state);
var restoredOauth = oauthLib(state.config, state);
Promise["try"](function () {
return restoredOauth.callback();
}).then(function () {
setAuth(true);
});
setOauth(restoredOauth);
}
}, []);
if (!hasAuth && oauth && oauth.isAuthorized()) {
setAuth(true);
}
if (oauth && oauth.isAuthorized()) {
return /*#__PURE__*/React.createElement(AdminPanel, {
oauth: oauth
});
} else if (oauthState != undefined) {
return "processing oauth...";
} else {
return /*#__PURE__*/React.createElement(Auth, {
setOauth: setOauth
});
}
}
function AdminPanel(_ref) {
var oauth = _ref.oauth;
/*
Features: (issue #78)
- [ ] Instance information updating
GET /api/v1/instance PATCH /api/v1/instance
- [ ] Domain block creation, viewing, and deletion
GET /api/v1/admin/domain_blocks
POST /api/v1/admin/domain_blocks
GET /api/v1/admin/domain_blocks/DOMAIN_BLOCK_ID, DELETE /api/v1/admin/domain_blocks/DOMAIN_BLOCK_ID
- [ ] Blocklist import/export
GET /api/v1/admin/domain_blocks?export=true
POST json file as form field domains to /api/v1/admin/domain_blocks
*/
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Logout, {
oauth: oauth
}), /*#__PURE__*/React.createElement(Settings, {
oauth: oauth
}), /*#__PURE__*/React.createElement(Blocks, {
oauth: oauth
}));
}
function Logout(_ref2) {
var oauth = _ref2.oauth;
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
onClick: oauth.logout
}, "Logout"));
}
ReactDom.render( /*#__PURE__*/React.createElement(App, null), document.getElementById("root"));
},{"./auth":9,"./blocks":10,"./oauth.js":12,"./settings":13,"./style.css":14,"bluebird":15,"react":23,"react-dom":20}],14:[function(require,module,exports){
require("../../node_modules/icssify/global-css-loader.js"); module.exports = {};
},{"../../node_modules/icssify/global-css-loader.js":5}],13:[function(require,module,exports){
"use strict";
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var Promise = require("bluebird");
var React = require("react");
module.exports = function Settings(_ref) {
var oauth = _ref.oauth;
var _React$useState = React.useState({}),
_React$useState2 = _slicedToArray(_React$useState, 2),
info = _React$useState2[0],
setInfo = _React$useState2[1];
var _React$useState3 = React.useState(""),
_React$useState4 = _slicedToArray(_React$useState3, 2),
errorMsg = _React$useState4[0],
setError = _React$useState4[1];
var _React$useState5 = React.useState("Fetching instance info"),
_React$useState6 = _slicedToArray(_React$useState5, 2),
statusMsg = _React$useState6[0],
setStatus = _React$useState6[1];
React.useEffect(function () {
Promise["try"](function () {
return oauth.apiRequest("/api/v1/instance", "GET");
}).then(function (json) {
setInfo(json);
})["catch"](function (e) {
setError(e.message);
setStatus("");
});
}, []);
function submit() {
setStatus("PATCHing");
setError("");
return Promise["try"](function () {
var formDataInfo = new FormData();
Object.entries(info).forEach(function (_ref2) {
var _ref3 = _slicedToArray(_ref2, 2),
key = _ref3[0],
val = _ref3[1];
if (key == "contact_account") {
key = "contact_username";
val = val.username;
}
if (key == "email") {
key = "contact_email";
}
if (_typeof(val) != "object") {
formDataInfo.append(key, val);
}
});
return oauth.apiRequest("/api/v1/instance", "PATCH", formDataInfo, "form");
}).then(function (json) {
setStatus("Config saved");
console.log(json);
})["catch"](function (e) {
setError(e.message);
setStatus("");
});
}
return /*#__PURE__*/React.createElement("section", {
className: "info login"
}, /*#__PURE__*/React.createElement("h1", null, "Instance Information ", /*#__PURE__*/React.createElement("button", {
onClick: submit
}, "Save")), /*#__PURE__*/React.createElement("div", {
className: "error accent"
}, errorMsg), /*#__PURE__*/React.createElement("div", null, statusMsg), /*#__PURE__*/React.createElement("form", {
onSubmit: function onSubmit(e) {
return e.preventDefault();
}
}, editableObject(info)));
};
function editableObject(obj) {
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var readOnlyKeys = ["uri", "version", "urls_streaming_api", "stats"];
var hiddenKeys = ["contact_account_", "urls"];
var explicitShownKeys = ["contact_account_username"];
var implementedKeys = "title, contact_account_username, email, short_description, description, terms, avatar, header".split(", ");
var listing = Object.entries(obj).map(function (_ref4) {
var _ref5 = _slicedToArray(_ref4, 2),
key = _ref5[0],
val = _ref5[1];
var fullkey = [].concat(_toConsumableArray(path), [key]).join("_");
if (hiddenKeys.includes(fullkey) || hiddenKeys.includes(path.join("_") + "_") // also match just parent path
) {
if (!explicitShownKeys.includes(fullkey)) {
return null;
}
}
if (Array.isArray(val)) {// FIXME: handle this
} else if (_typeof(val) == "object") {
return /*#__PURE__*/React.createElement(React.Fragment, {
key: fullkey
}, editableObject(val, [].concat(_toConsumableArray(path), [key])));
}
var isImplemented = "";
if (!implementedKeys.includes(fullkey)) {
isImplemented = " notImplemented";
}
var isReadOnly = readOnlyKeys.includes(fullkey) || readOnlyKeys.includes(path.join("_")) || isImplemented != "";
var label = key.replace(/_/g, " ");
if (path.length > 0) {
label = "\xA0".repeat(4 * path.length) + label;
}
var inputProps;
var changeFunc;
if (val === true || val === false) {
inputProps = {
type: "checkbox",
defaultChecked: val,
disabled: isReadOnly
};
changeFunc = function changeFunc(e) {
return e.target.checked;
};
} else if (val.length != 0 && !isNaN(val)) {
inputProps = {
type: "number",
defaultValue: val,
readOnly: isReadOnly
};
changeFunc = function changeFunc(e) {
return e.target.value;
};
} else {
inputProps = {
type: "text",
defaultValue: val,
readOnly: isReadOnly
};
changeFunc = function changeFunc(e) {
return e.target.value;
};
}
function setRef(element) {
if (element != null) {
element.addEventListener("change", function (e) {
obj[key] = changeFunc(e);
});
}
}
return /*#__PURE__*/React.createElement(React.Fragment, {
key: fullkey
}, /*#__PURE__*/React.createElement("label", {
htmlFor: key,
className: "capitalize"
}, label), /*#__PURE__*/React.createElement("div", {
className: isImplemented
}, /*#__PURE__*/React.createElement("input", _extends({
className: isImplemented,
ref: setRef
}, inputProps))));
});
return /*#__PURE__*/React.createElement(React.Fragment, null, path != "" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("b", null, path, ":"), " ", /*#__PURE__*/React.createElement("span", {
id: "filler"
})), listing);
}
},{"bluebird":15,"react":23}],10:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var Promise = require("bluebird");
var React = require("react");
var fileDownload = require("js-file-download");
function sortBlocks(blocks) {
return blocks.sort(function (a, b) {
// alphabetical sort
return a.domain.localeCompare(b.domain);
});
}
function deduplicateBlocks(blocks) {
var a = new Map();
blocks.forEach(function (block) {
a.set(block.id, block);
});
return Array.from(a.values());
}
module.exports = function Blocks(_ref) {
var oauth = _ref.oauth;
var _React$useState = React.useState([]),
_React$useState2 = _slicedToArray(_React$useState, 2),
blocks = _React$useState2[0],
setBlocks = _React$useState2[1];
var _React$useState3 = React.useState("Fetching blocks"),
_React$useState4 = _slicedToArray(_React$useState3, 2),
info = _React$useState4[0],
setInfo = _React$useState4[1];
var _React$useState5 = React.useState(""),
_React$useState6 = _slicedToArray(_React$useState5, 2),
errorMsg = _React$useState6[0],
setError = _React$useState6[1];
var _React$useState7 = React.useState(new Set()),
_React$useState8 = _slicedToArray(_React$useState7, 2),
checked = _React$useState8[0],
setChecked = _React$useState8[1];
React.useEffect(function () {
Promise["try"](function () {
return oauth.apiRequest("/api/v1/admin/domain_blocks", undefined, undefined, "GET");
}).then(function (json) {
setInfo("");
setError("");
setBlocks(sortBlocks(json));
})["catch"](function (e) {
setError(e.message);
setInfo("");
});
}, []);
var blockList = blocks.map(function (block) {
function update(e) {
var newChecked = new Set(checked.values());
if (e.target.checked) {
newChecked.add(block.id);
} else {
newChecked["delete"](block.id);
}
setChecked(newChecked);
}
return /*#__PURE__*/React.createElement(React.Fragment, {
key: block.id
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("input", {
type: "checkbox",
onChange: update,
checked: checked.has(block.id)
})), /*#__PURE__*/React.createElement("div", null, block.domain), /*#__PURE__*/React.createElement("div", null, new Date(block.created_at).toLocaleString()));
});
function clearChecked() {
setChecked(new Set());
}
function undoChecked() {
var amount = checked.size;
if (confirm("Are you sure you want to remove ".concat(amount, " block(s)?"))) {
setInfo("");
Promise.map(Array.from(checked.values()), function (block) {
console.log("deleting", block);
return oauth.apiRequest("/api/v1/admin/domain_blocks/".concat(block), "DELETE");
}).then(function (res) {
console.log(res);
setInfo("Deleted ".concat(amount, " blocks: ").concat(res.map(function (a) {
return a.domain;
}).join(", ")));
})["catch"](function (e) {
setError(e);
});
var newBlocks = blocks.filter(function (block) {
if (checked.size > 0 && checked.has(block.id)) {
checked["delete"](block.id);
return false;
} else {
return true;
}
});
setBlocks(newBlocks);
clearChecked();
}
}
return /*#__PURE__*/React.createElement("section", {
className: "blocks"
}, /*#__PURE__*/React.createElement("h1", null, "Blocks"), /*#__PURE__*/React.createElement("div", {
className: "error accent"
}, errorMsg), /*#__PURE__*/React.createElement("div", null, info), /*#__PURE__*/React.createElement(AddBlock, {
oauth: oauth,
blocks: blocks,
setBlocks: setBlocks
}), /*#__PURE__*/React.createElement("h3", null, "Blocks:"), /*#__PURE__*/React.createElement("div", {
style: {
display: "grid",
gridTemplateColumns: "1fr auto"
}
}, /*#__PURE__*/React.createElement("span", {
onClick: clearChecked,
className: "accent",
style: {
alignSelf: "end"
}
}, "uncheck all"), /*#__PURE__*/React.createElement("button", {
onClick: undoChecked
}, "Unblock selected")), /*#__PURE__*/React.createElement("div", {
className: "blocklist overflow"
}, blockList), /*#__PURE__*/React.createElement(BulkBlocking, {
oauth: oauth,
blocks: blocks,
setBlocks: setBlocks
}));
};
function BulkBlocking(_ref2) {
var oauth = _ref2.oauth,
blocks = _ref2.blocks,
setBlocks = _ref2.setBlocks;
var _React$useState9 = React.useState(""),
_React$useState10 = _slicedToArray(_React$useState9, 2),
bulk = _React$useState10[0],
setBulk = _React$useState10[1];
var _React$useState11 = React.useState(new Map()),
_React$useState12 = _slicedToArray(_React$useState11, 2),
blockMap = _React$useState12[0],
setBlockMap = _React$useState12[1];
var _React$useState13 = React.useState(),
_React$useState14 = _slicedToArray(_React$useState13, 2),
output = _React$useState14[0],
setOutput = _React$useState14[1];
React.useEffect(function () {
var newBlockMap = new Map();
blocks.forEach(function (block) {
newBlockMap.set(block.domain, block);
});
setBlockMap(newBlockMap);
}, [blocks]);
var fileRef = React.useRef();
function error(e) {
setOutput( /*#__PURE__*/React.createElement("div", {
className: "error accent"
}, e));
throw e;
}
function fileUpload() {
var reader = new FileReader();
reader.addEventListener("load", function (e) {
try {
// TODO: use validatem?
var json = JSON.parse(e.target.result);
json.forEach(function (block) {
console.log("block:", block);
});
} catch (e) {
error(e.message);
}
});
reader.readAsText(fileRef.current.files[0]);
}
React.useEffect(function () {
if (fileRef && fileRef.current) {
fileRef.current.addEventListener("change", fileUpload);
}
return function cleanup() {
fileRef.current.removeEventListener("change", fileUpload);
};
});
function textImport() {
Promise["try"](function () {
if (bulk[0] == "[") {
// assume it's json
return JSON.parse(bulk);
} else {
return bulk.split("\n").map(function (val) {
return {
domain: val.trim()
};
});
}
}).then(function (domains) {
console.log(domains);
var before = domains.length;
setOutput("Importing ".concat(before, " domain(s)"));
domains = domains.filter(function (_ref3) {
var domain = _ref3.domain;
return domain != "" && !blockMap.has(domain);
});
setOutput( /*#__PURE__*/React.createElement("span", null, output, /*#__PURE__*/React.createElement("br", null), "Deduplicated ".concat(before - domains.length, "/").concat(before, " with existing blocks, adding ").concat(domains.length, " block(s)")));
if (domains.length > 0) {
var data = new FormData();
data.append("domains", new Blob([JSON.stringify(domains)], {
type: "application/json"
}), "import.json");
return oauth.apiRequest("/api/v1/admin/domain_blocks?import=true", "POST", data, "form");
}
}).then(function (json) {
console.log("bulk import result:", json);
setBlocks(sortBlocks(deduplicateBlocks([].concat(_toConsumableArray(json), _toConsumableArray(blocks)))));
})["catch"](function (e) {
error(e.message);
});
}
function textExport() {
setBulk(blocks.reduce(function (str, val) {
if (_typeof(str) == "object") {
return str.domain;
} else {
return str + "\n" + val.domain;
}
}));
}
function jsonExport() {
Promise["try"](function () {
return oauth.apiRequest("/api/v1/admin/domain_blocks?export=true", "GET");
}).then(function (json) {
fileDownload(JSON.stringify(json), "block-export.json");
})["catch"](function (e) {
error(e);
});
}
function textAreaUpdate(e) {
setBulk(e.target.value);
}
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h3", null, "Bulk import/export"), /*#__PURE__*/React.createElement("label", {
htmlFor: "bulk"
}, "Domains, one per line:"), /*#__PURE__*/React.createElement("textarea", {
value: bulk,
rows: 20,
onChange: textAreaUpdate
}), /*#__PURE__*/React.createElement("div", {
className: "controls"
}, /*#__PURE__*/React.createElement("button", {
onClick: textImport
}, "Import All From Field"), /*#__PURE__*/React.createElement("button", {
onClick: textExport
}, "Export To Field"), /*#__PURE__*/React.createElement("label", {
className: "button",
htmlFor: "upload"
}, "Upload .json"), /*#__PURE__*/React.createElement("button", {
onClick: jsonExport
}, "Download .json")), output, /*#__PURE__*/React.createElement("input", {
type: "file",
id: "upload",
className: "hidden",
ref: fileRef
}));
}
function AddBlock(_ref4) {
var oauth = _ref4.oauth,
blocks = _ref4.blocks,
setBlocks = _ref4.setBlocks;
var _React$useState15 = React.useState(""),
_React$useState16 = _slicedToArray(_React$useState15, 2),
domain = _React$useState16[0],
setDomain = _React$useState16[1];
var _React$useState17 = React.useState("suspend"),
_React$useState18 = _slicedToArray(_React$useState17, 2),
type = _React$useState18[0],
setType = _React$useState18[1];
var _React$useState19 = React.useState(false),
_React$useState20 = _slicedToArray(_React$useState19, 2),
obfuscated = _React$useState20[0],
setObfuscated = _React$useState20[1];
var _React$useState21 = React.useState(""),
_React$useState22 = _slicedToArray(_React$useState21, 2),
privateDescription = _React$useState22[0],
setPrivateDescription = _React$useState22[1];
var _React$useState23 = React.useState(""),
_React$useState24 = _slicedToArray(_React$useState23, 2),
publicDescription = _React$useState24[0],
setPublicDescription = _React$useState24[1];
function addBlock() {
console.log("".concat(type, "ing"), domain);
Promise["try"](function () {
return oauth.apiRequest("/api/v1/admin/domain_blocks", "POST", {
domain: domain,
obfuscate: obfuscated,
private_comment: privateDescription,
public_comment: publicDescription
}, "json");
}).then(function (json) {
setDomain("");
setPrivateDescription("");
setPublicDescription("");
setBlocks([json].concat(_toConsumableArray(blocks)));
});
}
function onDomainChange(e) {
setDomain(e.target.value);
}
function onTypeChange(e) {
setType(e.target.value);
}
function onKeyDown(e) {
if (e.key == "Enter") {
addBlock();
}
}
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h3", null, "Add Block:"), /*#__PURE__*/React.createElement("div", {
className: "addblock"
}, /*#__PURE__*/React.createElement("input", {
id: "domain",
placeholder: "instance",
onChange: onDomainChange,
value: domain,
onKeyDown: onKeyDown
}), /*#__PURE__*/React.createElement("select", {
value: type,
onChange: onTypeChange
}, /*#__PURE__*/React.createElement("option", {
id: "suspend"
}, "Suspend"), /*#__PURE__*/React.createElement("option", {
id: "silence"
}, "Silence")), /*#__PURE__*/React.createElement("button", {
onClick: addBlock
}, "Add"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
htmlFor: "private"
}, "Private description:"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("textarea", {
id: "private",
value: privateDescription,
onChange: function onChange(e) {
return setPrivateDescription(e.target.value);
}
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
htmlFor: "public"
}, "Public description:"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("textarea", {
id: "public",
value: publicDescription,
onChange: function onChange(e) {
return setPublicDescription(e.target.value);
}
})), /*#__PURE__*/React.createElement("div", {
className: "single"
}, /*#__PURE__*/React.createElement("label", {
htmlFor: "obfuscate"
}, "Obfuscate:"), /*#__PURE__*/React.createElement("input", {
id: "obfuscate",
type: "checkbox",
value: obfuscated,
onChange: function onChange(e) {
return setObfuscated(e.target.checked);
}
}))));
} // function Blocklist() {
// return (
// <section className="blocklists">
// <h1>Blocklists</h1>
// </section>
// );
// }
},{"bluebird":15,"js-file-download":16,"react":23}],16:[function(require,module,exports){
module.exports = function(data, filename, mime, bom) {
var blobData = (typeof bom !== 'undefined') ? [bom, data] : [data]
var blob = new Blob(blobData, {type: mime || 'application/octet-stream'});
if (typeof window.navigator.msSaveBlob !== 'undefined') {
// IE workaround for "HTML7007: One or more blob URLs were
// revoked by closing the blob for which they were created.
// These URLs will no longer resolve as the data backing
// the URL has been freed."
window.navigator.msSaveBlob(blob, filename);
}
else {
var blobURL = (window.URL && window.URL.createObjectURL) ? window.URL.createObjectURL(blob) : window.webkitURL.createObjectURL(blob);
var tempLink = document.createElement('a');
tempLink.style.display = 'none';
tempLink.href = blobURL;
tempLink.setAttribute('download', filename);
// Safari thinks _blank anchor are pop ups. We only want to set _blank
// target if the browser does not support the HTML5 download attribute.
// This allows you to download files in desktop safari if pop up blocking
// is enabled.
if (typeof tempLink.download === 'undefined') {
tempLink.setAttribute('target', '_blank');
}
document.body.appendChild(tempLink);
tempLink.click();
// Fixes "webkit blob resource error 1"
setTimeout(function() {
document.body.removeChild(tempLink);
window.URL.revokeObjectURL(blobURL);
}, 200)
}
}
},{}],9:[function(require,module,exports){
"use strict";
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var Promise = require("bluebird");
var React = require("react");
var oauthLib = require("./oauth");
module.exports = function Auth(_ref) {
var setOauth = _ref.setOauth;
var _React$useState = React.useState(""),
_React$useState2 = _slicedToArray(_React$useState, 2),
instance = _React$useState2[0],
setInstance = _React$useState2[1];
React.useEffect(function () {
var isStillMounted = true; // check if current domain runs an instance
var thisUrl = new URL(window.location.origin);
thisUrl.pathname = "/api/v1/instance";
fetch(thisUrl.href).then(function (res) {
return res.json();
}).then(function (json) {
if (json && json.uri) {
if (isStillMounted) {
setInstance(json.uri);
}
}
})["catch"](function (e) {
console.error("caught", e); // no instance here
});
return function () {
// cleanup function
isStillMounted = false;
};
}, []);
function doAuth() {
var oauth = oauthLib({
instance: instance,
client_name: "GoToSocial Admin Panel",
scope: ["admin"],
website: window.location.href
});
setOauth(oauth);
return Promise["try"](function () {
return oauth.register();
}).then(function () {
return oauth.authorize();
});
}
function updateInstance(e) {
if (e.key == "Enter") {
doAuth();
} else {
setInstance(e.target.value);
}
}
return /*#__PURE__*/React.createElement("section", {
className: "login"
}, /*#__PURE__*/React.createElement("h1", null, "OAUTH Login:"), /*#__PURE__*/React.createElement("form", {
onSubmit: function onSubmit(e) {
return e.preventDefault();
}
}, /*#__PURE__*/React.createElement("label", {
htmlFor: "instance"
}, "Instance: "), /*#__PURE__*/React.createElement("input", {
value: instance,
onChange: updateInstance,
id: "instance"
}), /*#__PURE__*/React.createElement("button", {
onClick: doAuth
}, "Authenticate")));
};
},{"./oauth":12,"bluebird":15,"react":23}],12:[function(require,module,exports){
"use strict";
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var Promise = require("bluebird");
function getCurrentUrl() {
return window.location.origin + window.location.pathname; // strips ?query=string and #hash
}
module.exports = function oauthClient(config, initState) {
/* config:
instance: instance domain (https://testingtesting123.xyz)
client_name: "GoToSocial Admin Panel"
scope: []
website:
*/
var state = initState;
if (initState == undefined) {
state = localStorage.getItem("oauth");
if (state == undefined) {
state = {
config: config
};
storeState();
} else {
state = JSON.parse(state);
}
}
function storeState() {
localStorage.setItem("oauth", JSON.stringify(state));
}
/* register app
/api/v1/apps
*/
function register() {
if (state.client_id != undefined) {
return true; // we already have a registration
}
var url = new URL(config.instance);
url.pathname = "/api/v1/apps";
return fetch(url.href, {
method: "POST",
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
client_name: config.client_name,
redirect_uris: getCurrentUrl(),
scopes: config.scope.join(" "),
website: getCurrentUrl()
})
}).then(function (res) {
if (res.status != 200) {
throw res;
}
return res.json();
}).then(function (json) {
state.client_id = json.client_id;
state.client_secret = json.client_secret;
storeState();
});
}
/* authorize:
/oauth/authorize
?client_id=CLIENT_ID
&redirect_uri=window.location.href
&response_type=code
&scope=admin
*/
function authorize() {
var url = new URL(config.instance);
url.pathname = "/oauth/authorize";
url.searchParams.set("client_id", state.client_id);
url.searchParams.set("redirect_uri", getCurrentUrl());
url.searchParams.set("response_type", "code");
url.searchParams.set("scope", config.scope.join(" "));
window.location.assign(url.href);
}
function callback() {
if (state.access_token != undefined) {
return; // we're already done :)
}
var params = new URL(window.location).searchParams;
var token = params.get("code");
if (token != null) {
console.log("got token callback:", token);
}
return authorizeToken(token)["catch"](function (e) {
console.log("Error processing oauth callback:", e);
logout(); // just to be sure
});
}
function authorizeToken(token) {
var url = new URL(config.instance);
url.pathname = "/oauth/token";
return fetch(url.href, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
client_id: state.client_id,
client_secret: state.client_secret,
redirect_uri: getCurrentUrl(),
grant_type: "authorization_code",
code: token
})
}).then(function (res) {
if (res.status != 200) {
throw res;
}
return res.json();
}).then(function (json) {
state.access_token = json.access_token;
storeState();
window.location = getCurrentUrl(); // clear ?token=
});
}
function isAuthorized() {
return state.access_token != undefined;
}
function apiRequest(path, method, data) {
var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "json";
if (!isAuthorized()) {
throw new Error("Not Authenticated");
}
var url = new URL(config.instance);
var _path$split = path.split("?"),
_path$split2 = _slicedToArray(_path$split, 2),
p = _path$split2[0],
s = _path$split2[1];
url.pathname = p;
url.search = s;
var headers = {
"Authorization": "Bearer ".concat(state.access_token)
};
var body = data;
if (type == "json" && body != undefined) {
headers["Content-Type"] = "application/json";
body = JSON.stringify(data);
}
return fetch(url.href, {
method: method,
headers: headers,
body: body
}).then(function (res) {
return Promise.all([res.json(), res]);
}).then(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
json = _ref2[0],
res = _ref2[1];
if (res.status != 200) {
if (json.error) {
throw new Error(json.error);
} else {
throw new Error("".concat(res.status, ": ").concat(res.statusText));
}
} else {
return json;
}
});
}
function logout() {
var url = new URL(config.instance);
url.pathname = "/oauth/revoke";
return fetch(url.href, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
client_id: state.client_id,
client_secret: state.client_secret,
token: state.access_token
})
}).then(function (res) {
if (res.status != 200) {
// GoToSocial doesn't actually implement this route yet,
// so error is to be expected
return;
}
return res.json();
})["catch"](function () {// see above
}).then(function () {
localStorage.removeItem("oauth");
window.location = getCurrentUrl();
});
}
return {
register: register,
authorize: authorize,
callback: callback,
isAuthorized: isAuthorized,
apiRequest: apiRequest,
logout: logout
};
};
},{"bluebird":15}]},{},[11])
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9mYWN0b3ItYnVuZGxlL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJwYW5lbHMvYWRtaW4vaW5kZXguanMiLCJwYW5lbHMvYWRtaW4vc3R5bGUuY3NzIiwicGFuZWxzL2FkbWluL3NldHRpbmdzLmpzIiwicGFuZWxzL2FkbWluL2Jsb2Nrcy5qcyIsInBhbmVscy9ub2RlX21vZHVsZXMvanMtZmlsZS1kb3dubG9hZC9maWxlLWRvd25sb2FkLmpzIiwicGFuZWxzL2FkbWluL2F1dGguanMiLCJwYW5lbHMvYWRtaW4vb2F1dGguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBRCxDQUF2Qjs7QUFDQSxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBRCxDQUFyQjs7QUFDQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBRCxDQUF4Qjs7QUFFQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBRCxDQUFwQjs7QUFDQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFFQSxPQUFPLENBQUMsYUFBRCxDQUFQOztBQUVBLFNBQVMsR0FBVCxHQUFlO0FBQ2Qsd0JBQTBCLEtBQUssQ0FBQyxRQUFOLEVBQTFCO0FBQUE7QUFBQSxNQUFPLEtBQVA7QUFBQSxNQUFjLFFBQWQ7O0FBQ0EseUJBQTJCLEtBQUssQ0FBQyxRQUFOLENBQWUsS0FBZixDQUEzQjtBQUFBO0FBQUEsTUFBTyxPQUFQO0FBQUEsTUFBZ0IsT0FBaEI7O0FBQ0EseUJBQW9DLEtBQUssQ0FBQyxRQUFOLENBQWUsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsT0FBckIsQ0FBZixDQUFw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