diff options
Diffstat (limited to 'web/source/settings/admin/domain-permissions/process.tsx')
-rw-r--r-- | web/source/settings/admin/domain-permissions/process.tsx | 402 |
1 files changed, 0 insertions, 402 deletions
diff --git a/web/source/settings/admin/domain-permissions/process.tsx b/web/source/settings/admin/domain-permissions/process.tsx deleted file mode 100644 index bb9411b9d..000000000 --- a/web/source/settings/admin/domain-permissions/process.tsx +++ /dev/null @@ -1,402 +0,0 @@ -/* - 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 <http://www.gnu.org/licenses/>. -*/ - -import React from "react"; - -import { memo, useMemo, useCallback, useEffect } from "react"; - -import { isValidDomainPermission, hasBetterScope } from "../../lib/util/domain-permission"; - -import { - useTextInput, - useBoolInput, - useRadioInput, - useCheckListInput, -} from "../../lib/form"; - -import { - Select, - TextArea, - RadioGroup, - Checkbox, - TextInput, -} from "../../components/form/inputs"; - -import useFormSubmit from "../../lib/form/submit"; - -import CheckList from "../../components/check-list"; -import MutationButton from "../../components/form/mutation-button"; -import FormWithData from "../../lib/form/form-with-data"; - -import { useImportDomainPermsMutation } from "../../lib/query/admin/domain-permissions/import"; -import { - useDomainAllowsQuery, - useDomainBlocksQuery -} from "../../lib/query/admin/domain-permissions/get"; - -import type { DomainPerm, MappedDomainPerms } from "../../lib/types/domain-permission"; -import type { ChecklistInputHook, RadioFormInputHook } from "../../lib/form/types"; - -export interface ProcessImportProps { - list: DomainPerm[], - permType: RadioFormInputHook, -} - -export const ProcessImport = memo( - function ProcessImport({ list, permType }: ProcessImportProps) { - return ( - <div className="without-border"> - <FormWithData - dataQuery={permType.value == "allow" - ? useDomainAllowsQuery - : useDomainBlocksQuery - } - DataForm={ImportList} - {...{ list, permType }} - /> - </div> - ); - } -); - -export interface ImportListProps { - list: Array<DomainPerm>, - data: MappedDomainPerms, - permType: RadioFormInputHook, -} - -function ImportList({ list, data: domainPerms, permType }: ImportListProps) { - const hasComment = useMemo(() => { - let hasPublic = false; - let hasPrivate = false; - - list.some((entry) => { - if (entry.public_comment) { - hasPublic = true; - } - - if (entry.private_comment) { - hasPrivate = true; - } - - return hasPublic && hasPrivate; - }); - - if (hasPublic && hasPrivate) { - return { both: true }; - } else if (hasPublic) { - return { type: "public_comment" }; - } else if (hasPrivate) { - return { type: "private_comment" }; - } else { - return {}; - } - }, [list]); - - const showComment = useTextInput("showComment", { defaultValue: hasComment.type ?? "public_comment" }); - - const form = { - domains: useCheckListInput("domains", { entries: list }), // DomainPerm is actually also a Checkable. - obfuscate: useBoolInput("obfuscate"), - privateComment: useTextInput("private_comment", { - defaultValue: `Imported on ${new Date().toLocaleString()}` - }), - privateCommentBehavior: useRadioInput("private_comment_behavior", { - defaultValue: "append", - options: { - append: "Append to", - replace: "Replace" - } - }), - publicComment: useTextInput("public_comment"), - publicCommentBehavior: useRadioInput("public_comment_behavior", { - defaultValue: "append", - options: { - append: "Append to", - replace: "Replace" - } - }), - permType: permType, - }; - - const [importDomains, importResult] = useFormSubmit(form, useImportDomainPermsMutation(), { changedOnly: false }); - - return ( - <> - <form - onSubmit={importDomains} - className="domain-perm-import-list" - > - <span>{list.length} domain{list.length != 1 ? "s" : ""} in this list</span> - - {hasComment.both && - <Select field={showComment} options={ - <> - <option value="public_comment">Show public comments</option> - <option value="private_comment">Show private comments</option> - </> - } /> - } - - <div className="checkbox-list-wrapper"> - <DomainCheckList - field={form.domains} - domainPerms={domainPerms} - commentType={showComment.value as "public_comment" | "private_comment"} - permType={form.permType} - /> - </div> - - <TextArea - field={form.privateComment} - label="Private comment" - rows={3} - /> - <RadioGroup - field={form.privateCommentBehavior} - label="imported private comment" - /> - - <TextArea - field={form.publicComment} - label="Public comment" - rows={3} - /> - <RadioGroup - field={form.publicCommentBehavior} - label="imported public comment" - /> - - <Checkbox - field={form.obfuscate} - label="Obfuscate domains in public lists" - /> - - <MutationButton - label="Import" - disabled={false} - result={importResult} - /> - </form> - </> - ); -} - -interface DomainCheckListProps { - field: ChecklistInputHook, - domainPerms: MappedDomainPerms, - commentType: "public_comment" | "private_comment", - permType: RadioFormInputHook, -} - -function DomainCheckList({ field, domainPerms, commentType, permType }: DomainCheckListProps) { - const getExtraProps = useCallback((entry: DomainPerm) => { - return { - comment: entry[commentType], - alreadyExists: entry.domain in domainPerms, - permType: permType, - }; - }, [domainPerms, commentType, permType]); - - const entriesWithSuggestions = useMemo(() => { - const fieldValue = (field.value ?? {}) as { [k: string]: DomainPerm; }; - return Object.values(fieldValue).filter((entry) => entry.suggest); - }, [field.value]); - - return ( - <> - <CheckList - field={field as ChecklistInputHook} - header={<> - <b>Domain</b> - <b> - {commentType == "public_comment" && "Public comment"} - {commentType == "private_comment" && "Private comment"} - </b> - </>} - EntryComponent={DomainEntry} - getExtraProps={getExtraProps} - /> - <UpdateHint - entries={entriesWithSuggestions} - updateEntry={field.onChange} - updateMultiple={field.updateMultiple} - /> - </> - ); -} - -interface UpdateHintProps { - entries, - updateEntry, - updateMultiple, -} - -const UpdateHint = memo( - function UpdateHint({ entries, updateEntry, updateMultiple }: UpdateHintProps) { - if (entries.length == 0) { - return null; - } - - function changeAll() { - updateMultiple( - entries.map((entry) => [entry.key, { domain: entry.suggest, suggest: null }]) - ); - } - - return ( - <div className="update-hints"> - <p> - {entries.length} {entries.length == 1 ? "entry uses" : "entries use"} a specific subdomain, - which you might want to change to the main domain, as that includes all it's (future) subdomains. - </p> - <div className="hints"> - {entries.map((entry) => ( - <UpdateableEntry key={entry.key} entry={entry} updateEntry={updateEntry} /> - ))} - </div> - {entries.length > 0 && <a onClick={changeAll}>change all</a>} - </div> - ); - } -); - -interface UpdateableEntryProps { - entry, - updateEntry, -} - -const UpdateableEntry = memo( - function UpdateableEntry({ entry, updateEntry }: UpdateableEntryProps) { - return ( - <> - <span className="text-cutoff">{entry.domain}</span> - <i className="fa fa-long-arrow-right" aria-hidden="true"></i> - <span>{entry.suggest}</span> - <a role="button" onClick={() => - updateEntry(entry.key, { domain: entry.suggest, suggest: null }) - }>change</a> - </> - ); - } -); - -function domainValidationError(isValid) { - return isValid ? "" : "Invalid domain"; -} - -interface DomainEntryProps { - entry; - onChange; - extraProps: { - alreadyExists: boolean; - comment: string; - permType: RadioFormInputHook; - }; -} - -function DomainEntry({ entry, onChange, extraProps: { alreadyExists, comment, permType } }: DomainEntryProps) { - const domainField = useTextInput("domain", { - defaultValue: entry.domain, - showValidation: entry.checked, - initValidation: domainValidationError(entry.valid), - validator: (value) => domainValidationError(isValidDomainPermission(value)) - }); - - useEffect(() => { - if (entry.valid != domainField.valid) { - onChange({ valid: domainField.valid }); - } - }, [onChange, entry.valid, domainField.valid]); - - useEffect(() => { - if (entry.domain != domainField.value) { - domainField.setter(entry.domain); - } - // domainField.setter is enough, eslint wants domainField - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [entry.domain, domainField.setter]); - - useEffect(() => { - onChange({ suggest: hasBetterScope(domainField.value ?? "") }); - // only need this update if it's the entry.checked that updated, not onChange - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [domainField.value]); - - function clickIcon(e) { - if (entry.suggest) { - e.stopPropagation(); - e.preventDefault(); - domainField.setter(entry.suggest); - onChange({ domain: entry.suggest, checked: true }); - } - } - - return ( - <> - <div className="domain-input"> - <TextInput - field={domainField} - onChange={(e) => { - domainField.onChange(e); - onChange({ domain: e.target.value, checked: true }); - }} - /> - <span id="icon" onClick={clickIcon}> - <DomainEntryIcon - alreadyExists={alreadyExists} - suggestion={entry.suggest} - permTypeString={permType.value?? ""} - /> - </span> - </div> - <p>{comment}</p> - </> - ); -} - -interface DomainEntryIconProps { - alreadyExists: boolean; - suggestion: string; - permTypeString: string; -} - -function DomainEntryIcon({ alreadyExists, suggestion, permTypeString }: DomainEntryIconProps) { - let icon; - let text; - - if (suggestion) { - icon = "fa-info-circle suggest-changes"; - text = `Entry targets a specific subdomain, consider changing it to '${suggestion}'.`; - } else if (alreadyExists) { - icon = "fa-history permission-already-exists"; - text = `Domain ${permTypeString} already exists.`; - } - - if (!icon) { - return null; - } - - return ( - <> - <i className={`fa fa-fw ${icon}`} aria-hidden="true" title={text}></i> - <span className="sr-only">{text}</span> - </> - ); -}
\ No newline at end of file |