/* GoToSocial Copyright (C) GoToSocial Authors admin@gotosocial.org SPDX-License-Identifier: AGPL-3.0-or-later 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 React = require("react"); const { useRoute, Redirect, useLocation } = require("wouter"); const query = require("../../lib/query"); const { useTextInput, useBoolInput } = require("../../lib/form"); const useFormSubmit = require("../../lib/form/submit"); const { TextInput, Checkbox, TextArea } = require("../../components/form/inputs"); const Loading = require("../../components/loading"); const BackButton = require("../../components/back-button"); const MutationButton = require("../../components/form/mutation-button"); module.exports = function InstanceDetail({ baseUrl }) { const { data: blockedInstances = {}, isLoading } = query.useInstanceBlocksQuery(); let [_match, { domain }] = useRoute(`${baseUrl}/:domain`); if (domain == "view") { // Retrieve domain from form field submission. domain = (new URL(document.location)).searchParams.get("domain"); } // Normalize / decode domain (it may be URL-encoded). domain = decodeURIComponent(domain); const existingBlock = React.useMemo(() => { return blockedInstances[domain]; }, [blockedInstances, domain]); if (domain == undefined) { return ; } let infoContent = null; if (isLoading) { infoContent = ; } else if (existingBlock == undefined) { infoContent = No stored block yet, you can add one below:; } else { infoContent = (
Editing domain blocks isn't implemented yet, check here for progress
); } return (

Federation settings for: {domain}

{infoContent}
); }; function DomainBlockForm({ defaultDomain, block = {}, baseUrl }) { const isExistingBlock = block.domain != undefined; const disabledForm = isExistingBlock ? { disabled: true, title: "Domain suspensions currently cannot be edited." } : {}; const form = { domain: useTextInput("domain", { source: block, defaultValue: defaultDomain }), obfuscate: useBoolInput("obfuscate", { source: block }), commentPrivate: useTextInput("private_comment", { source: block }), commentPublic: useTextInput("public_comment", { source: block }) }; const [submitForm, addResult] = useFormSubmit(form, query.useAddInstanceBlockMutation(), { changedOnly: false }); const [removeBlock, removeResult] = query.useRemoveInstanceBlockMutation({ fixedCacheKey: block.id }); const [location, setLocation] = useLocation(); function verifyUrlThenSubmit(e) { // Adding a new block happens on /settings/admin/federation/domain.com // but if domain input changes, that doesn't match anymore and causes issues later on // so, before submitting the form, silently change url, then submit let correctUrl = `${baseUrl}/${form.domain.value}`; if (location != correctUrl) { setLocation(correctUrl); } return submitForm(e); } return (