diff --git a/app/javascript/mastodon/features/lists/new.tsx b/app/javascript/mastodon/features/lists/new.tsx index 8253ab58b79..d89f27478fd 100644 --- a/app/javascript/mastodon/features/lists/new.tsx +++ b/app/javascript/mastodon/features/lists/new.tsx @@ -22,6 +22,7 @@ import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; import { Icon } from 'mastodon/components/icon'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import type { List } from 'mastodon/models/list'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import { messages as membersMessages } from './members'; @@ -72,36 +73,23 @@ const MembersLink: React.FC<{ ); }; -const NewList: React.FC<{ - multiColumn?: boolean; -}> = ({ multiColumn }) => { +const NewList: React.FC<{ list?: List | null }> = ({ list }) => { const dispatch = useAppDispatch(); - const { id } = useParams<{ id?: string }>(); - const intl = useIntl(); const history = useHistory(); - const list = useAppSelector((state) => - id ? state.lists.get(id) : undefined, - ); - const [title, setTitle] = useState(''); - const [exclusive, setExclusive] = useState(false); - const [repliesPolicy, setRepliesPolicy] = useState('list'); + const { + id, + title: initialTitle = '', + exclusive: initialExclusive = false, + replies_policy: initialRepliesPolicy = 'list', + } = list ?? {}; + + const [title, setTitle] = useState(initialTitle); + const [exclusive, setExclusive] = useState(initialExclusive); + const [repliesPolicy, setRepliesPolicy] = + useState(initialRepliesPolicy); const [submitting, setSubmitting] = useState(false); - useEffect(() => { - if (id) { - dispatch(fetchList(id)); - } - }, [dispatch, id]); - - useEffect(() => { - if (id && list) { - setTitle(list.title); - setExclusive(list.exclusive); - setRepliesPolicy(list.replies_policy); - } - }, [setTitle, setExclusive, setRepliesPolicy, id, list]); - const handleTitleChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { setTitle(value); @@ -158,6 +146,138 @@ const NewList: React.FC<{ } }, [history, dispatch, setSubmitting, id, title, exclusive, repliesPolicy]); + return ( +
+
+
+
+ + +
+ +
+
+
+
+ +
+
+
+ + +
+ +
+
+
+
+ + {id && ( +
+ +
+ )} + +
+ {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} + +
+ +
+ +
+
+ ); +}; + +const NewListWrapper: React.FC<{ + multiColumn?: boolean; +}> = ({ multiColumn }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const { id } = useParams<{ id?: string }>(); + const list = useAppSelector((state) => + id ? state.lists.get(id) : undefined, + ); + + useEffect(() => { + if (id) { + dispatch(fetchList(id)); + } + }, [dispatch, id]); + + const isLoading = id && !list; + return (
-
-
-
-
- - -
- -
-
-
-
- -
-
-
- - -
- -
-
-
-
- - {id && ( -
- -
- )} - -
- {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} - -
- -
- -
-
+ {isLoading ? : }
@@ -298,4 +306,4 @@ const NewList: React.FC<{ }; // eslint-disable-next-line import/no-default-export -export default NewList; +export default NewListWrapper;