import Header from '../components/Header';
import AccountPreferences from '../components/AccountPreferences';
import Container from '@mui/material/Container';
import CircularProgress from '@mui/material/CircularProgress';
import authManager from '../AuthManager';
import Account from '../../../model/Account';

const ServerOverview = (props) => {
  this.accountId = props.accountId || props.match.params.accountId;

  useEffect(() => {
    const controller = new AbortController();
    authManager
      .fetch(`/api/serverConfig`, { signal: controller.signal })
      .then((res) => res.json())
      .then((result) => {
        console.log(result);
        setState({ loaded: true, account: Account.from(result) });
      })
      .catch((e) => console.log(e));
    // return () => controller.abort() // crash on React18
  }, [accountId]);

  return (
    <Container maxWidth="sm" className="app">
      <Header />
      {this.state.loaded ? <AccountPreferences account={this.state.account} /> : <CircularProgress />}
    </Container>
  );
};

export default ServerOverview;
