Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3719 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3719 stevensc 1
import React from 'react';
2
import { Link, Outlet, useMatch } from 'react-router-dom';
3
import { useSelector } from 'react-redux';
3741 stevensc 4
import { AppBar, Box, Button, Container, styled, Toolbar, Typography } from '@mui/material';
3719 stevensc 5
import Slider from 'react-slick';
6
 
3741 stevensc 7
import 'slick-carousel/slick/slick.css';
8
import 'slick-carousel/slick/slick-theme.css';
9
 
3719 stevensc 10
import { parse } from '@utils';
3741 stevensc 11
import { ArrowBackIos, ArrowForwardIos } from '@mui/icons-material';
3719 stevensc 12
 
13
const Section = styled('section')(({ theme }) => ({
14
  display: 'flex',
15
  flexDirection: 'column',
16
  gap: theme.spacing(0.5),
17
  justifyContent: 'center',
18
  alignItems: 'center',
19
  flex: 1,
20
  '& > img': {
21
    display: 'block',
22
    margin: '0 auto'
23
  }
24
}));
25
 
26
const AuthPage = styled('div')(({ theme }) => ({
27
  display: 'flex',
28
  flexDirection: 'column',
29
  gap: '1rem',
30
  height: '100%',
3741 stevensc 31
  minHeight: 'calc(100vh - 120px)',
32
  justifyContent: 'center',
33
  alignItems: 'center',
34
 
3719 stevensc 35
  [theme.breakpoints.up('md')]: {
3741 stevensc 36
    flexDirection: 'row',
37
    minHeight: 'calc(100vh - 120px)',
38
    justifyContent: 'space-between',
39
    alignItems: 'stretch'
3719 stevensc 40
  }
41
}));
42
 
43
const AuthSlider = styled(Slider)(({ theme }) => ({
3741 stevensc 44
  maxWidth: '100%',
45
  width: '100%',
46
  margin: '0 auto',
47
  marginBottom: theme.spacing(2),
48
 
49
  // Estilos para las imágenes del slider
3719 stevensc 50
  '& img': {
3741 stevensc 51
    maxWidth: '250px !important',
52
    maxHeight: '250px !important',
3719 stevensc 53
    display: 'block !important',
3741 stevensc 54
    margin: 'auto',
55
    borderRadius: '12px',
56
    objectFit: 'contain',
57
    transition: 'transform 0.3s ease',
58
 
59
    // Responsive para imágenes - iOS optimizado
60
    [theme.breakpoints.down('sm')]: {
61
      maxWidth: '200px !important',
62
      maxHeight: '200px !important'
63
    },
64
 
65
    // Para pantallas muy pequeñas de iPhone
66
    '@media (max-width: 390px)': {
67
      maxWidth: '180px !important',
68
      maxHeight: '180px !important'
69
    }
3719 stevensc 70
  },
3741 stevensc 71
 
72
  // Estilos para cada slide
73
  '& .slick-slide': {
74
    padding: '0 4px',
75
    textAlign: 'center',
76
    outline: 'none'
77
  },
78
 
79
  // Contenedor de cada slide
80
  '& .slick-slide > div': {
81
    outline: 'none',
82
    display: 'flex !important',
83
    flexDirection: 'column',
84
    alignItems: 'center',
85
    justifyContent: 'center'
86
  },
87
 
88
  // Estilos para los textos del slider
89
  '& .MuiTypography-root': {
90
    marginTop: theme.spacing(1.5),
91
    fontSize: '1rem',
92
    fontWeight: 600,
93
    color: theme.palette.text.primary,
94
    textAlign: 'center',
95
    lineHeight: 1.3,
96
    maxWidth: '250px',
97
    margin: `${theme.spacing(1.5)} auto 0`,
98
 
99
    // Responsive para textos
100
    [theme.breakpoints.down('sm')]: {
101
      fontSize: '0.95rem',
102
      marginTop: theme.spacing(1),
103
      maxWidth: '200px'
104
    },
105
 
106
    // Para pantallas muy pequeñas de iPhone
107
    '@media (max-width: 390px)': {
108
      fontSize: '0.9rem',
109
      marginTop: theme.spacing(0.5),
110
      maxWidth: '180px'
111
    }
112
  },
113
 
114
  // Estilos para los dots/puntos de navegación
115
  '& .slick-dots': {
116
    position: 'relative',
117
    bottom: 'auto',
118
    marginTop: theme.spacing(2),
119
    marginBottom: 0,
120
 
121
    '& li': {
122
      margin: '0 3px',
123
 
124
      '& button': {
125
        width: '10px',
126
        height: '10px',
127
 
128
        '&:before': {
129
          fontSize: '10px',
130
          color: theme.palette.primary.main,
131
          opacity: 0.4,
132
          width: '10px',
133
          height: '10px',
134
          lineHeight: '10px'
135
        }
136
      },
137
 
138
      '&.slick-active button:before': {
139
        opacity: 1,
140
        color: theme.palette.primary.main,
141
        transform: 'scale(1.3)'
142
      }
143
    }
144
  },
145
 
146
  // Estilos para transiciones
147
  '& .slick-track': {
148
    display: 'flex',
149
    alignItems: 'center'
150
  },
151
 
152
  // Lista del slider
153
  '& .slick-list': {
154
    overflow: 'hidden',
155
    borderRadius: '8px'
156
  },
157
 
158
  // Ocultar en pantallas medianas y grandes
3719 stevensc 159
  [theme.breakpoints.up('md')]: {
160
    display: 'none'
161
  }
162
}));
163
 
164
const AuthLayout = () => {
165
  const { logo_url, intro } = useSelector(({ auth }) => auth);
166
  const isRoot = useMatch('/');
167
 
168
  return (
169
    <>
170
      <AppBar
171
        sx={{
172
          position: 'relative',
173
          backgroundColor: 'transparent',
3741 stevensc 174
          boxShadow: 'none',
175
          zIndex: 1
3719 stevensc 176
        }}
177
      >
178
        <Container>
179
          <Toolbar
180
            sx={{
181
              minHeight: 'none',
182
              padding: 0,
183
              '& img': {
184
                display: { md: 'none' }
185
              }
186
            }}
187
          >
188
            <Link to='/'>
189
              <img src={logo_url} alt='Logo' width={50} />
190
            </Link>
191
          </Toolbar>
192
        </Container>
193
      </AppBar>
194
 
3741 stevensc 195
      <Container sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
3719 stevensc 196
        <AuthPage>
3741 stevensc 197
          <Section
198
            sx={{
199
              display: { xs: isRoot ? 'flex' : 'none', md: 'flex' }
200
            }}
201
          >
202
            <Box
203
              sx={{
204
                display: { xs: 'flex', md: 'none' },
205
                flexDirection: 'column',
206
                gap: '1rem',
207
                alignItems: 'center',
208
                justifyContent: 'center',
209
                width: '100%',
210
                maxWidth: '400px',
211
                padding: '1rem'
212
              }}
213
            >
214
              {isRoot && (
215
                <AuthSlider
216
                  autoplay={true}
217
                  infinite={true}
218
                  pauseOnHover={true}
219
                  pauseOnFocus={true}
220
                  dots={true}
221
                  arrows={false}
222
                  accessibility={true}
223
                  nextArrow={<ArrowForwardIos />}
224
                  prevArrow={<ArrowBackIos />}
225
                >
226
                  <Box>
227
                    <img src='/images/intro_slide_1.png' alt='image slide' />
228
                    <Typography>Desarrollate en Líder moderno</Typography>
229
                  </Box>
3719 stevensc 230
 
3741 stevensc 231
                  <Box>
232
                    <img src='/images/intro_slide_2.png' alt='image slide' />
233
                    <Typography>Evoluciona día a día</Typography>
234
                  </Box>
3719 stevensc 235
 
3741 stevensc 236
                  <Box>
237
                    <img src='/images/intro_slide_3.png' alt='image slide' />
238
                    <Typography>Construye tu futuro</Typography>
239
                  </Box>
240
                </AuthSlider>
241
              )}
3719 stevensc 242
 
3741 stevensc 243
              <Button
244
                variant='contained'
245
                color='primary'
246
                fullWidth
247
                LinkComponent={Link}
248
                to='/signin'
249
              >
250
                Iniciar sesión
251
              </Button>
252
              <Button
253
                variant='contained'
254
                color='primary'
255
                fullWidth
256
                LinkComponent={Link}
257
                to='/forgot-password'
258
              >
259
                Olvidé mi contraseña
260
              </Button>
261
            </Box>
262
 
263
            <Box
264
              sx={{
265
                display: { xs: isRoot ? 'none' : 'flex', md: 'flex' },
266
                alignItems: 'center',
267
                justifyContent: 'center',
268
                flexDirection: 'column',
269
                gap: '1rem'
270
              }}
271
            >
272
              <img src={logo_url} alt='Leaderslinked logo' />
273
              <Typography>{parse(intro)}</Typography>
274
            </Box>
3719 stevensc 275
          </Section>
276
 
3741 stevensc 277
          <Section
278
            sx={{
279
              display: { xs: isRoot ? 'none' : 'flex', md: 'flex' }
280
            }}
281
          >
3719 stevensc 282
            <Outlet />
283
          </Section>
284
        </AuthPage>
285
      </Container>
286
    </>
287
  );
288
};
289
 
290
export default AuthLayout;