import React from 'react';
import { Container, Card, CardContent, Typography, List, Avatar, Divider } from '@mui/material';
import { DialerSipRounded, GroupOutlined, RoomRounded } from '@mui/icons-material';
import ListItemLink from '../components/ListItemLink';

export default function AccountCreationDialog(props) {

  return (
    <Container>
      <Card>
        <CardContent>
          <Typography gutterBottom variant="h5" component="h2">
            Create new account
          </Typography>
          <Typography variant="body2" color="textSecondary" component="p">
            Welcome to the Jami web node setup.<br />
            Let's start by creating a new administrator account to control access to the server configuration.
          </Typography>
        </CardContent>

        <List>
          <ListItemLink
            to="/newAccount/rendezVous"
            icon={<Avatar><RoomRounded /></Avatar>}
            primary="Rendez-vous point"
            secondary="A Rendez-vous account provides a unique space suitable to easily organize meetings" />
          <Divider />
          <ListItemLink
            to="/newAccount/jami"
            icon={<Avatar><GroupOutlined /></Avatar>}
            primary="Jami account"
            secondary="A pesonal communication account to join a Rendez-vous point or directly contact other Jami users" />
          <Divider />
          <ListItemLink
            to="/newAccount/sip"
            icon={<Avatar><DialerSipRounded /></Avatar>}
            primary="SIP Account"
            secondary="Connect with standard SIP communication providers or classic telephony services" />
        </List>
      </Card>
    </Container>)
}
