Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6c34cad1e7 | |||
| cb5268bf27 | |||
| 7b77b2195d | |||
| dad7e6b2eb | |||
| 146d1a5061 | |||
| ed626137cf | |||
| 224cedac65 | |||
| b5b41b4849 | |||
| d1ee296684 | |||
| 6cf3bcc658 | |||
| b20efef730 | |||
| 459ff88e9d | |||
| dcdbfed2a3 | |||
| d235b08fe3 | |||
| e5b9f2b75d | |||
| 563107e649 | |||
| 5545dbfad0 | |||
| 353128fa8e | |||
| 2e9fa7e9d0 | |||
| c0e5ec6e90 | |||
| 33adc4c819 | |||
| ebe81cd588 |
@@ -8,6 +8,8 @@ import LocationOnIcon from '@material-ui/icons/LocationOn';
|
||||
import BusinessCenterIcon from '@material-ui/icons/BusinessCenter';
|
||||
import Business from '@material-ui/icons/Business';
|
||||
import Typography from '@material-ui/core/Typography';
|
||||
import WatchLater from '@material-ui/icons/WatchLater';
|
||||
import Home from '@material-ui/icons/Home';
|
||||
|
||||
const variantIcon = {
|
||||
assignment: AssignmentIcon,
|
||||
@@ -15,6 +17,8 @@ const variantIcon = {
|
||||
location_on: LocationOnIcon,
|
||||
business_center: BusinessCenterIcon,
|
||||
business: Business,
|
||||
watch_later: WatchLater,
|
||||
home: Home,
|
||||
};
|
||||
|
||||
const styles = theme => ({
|
||||
|
||||
@@ -4,6 +4,7 @@ import { withStyles } from '@material-ui/core/styles';
|
||||
import AssignmentIcon from '@material-ui/icons/Assignment';
|
||||
import RoomIcon from '@material-ui/icons/Room';
|
||||
import LocationOnIcon from '@material-ui/icons/LocationOn';
|
||||
import HomeOnIcon from '@material-ui/icons/Home';
|
||||
import WatchLater from '@material-ui/icons/WatchLater';
|
||||
import BusinessCenterIcon from '@material-ui/icons/BusinessCenter';
|
||||
import Typography from '@material-ui/core/Typography';
|
||||
@@ -13,6 +14,7 @@ const variantIcon = {
|
||||
assignment: AssignmentIcon,
|
||||
room: RoomIcon,
|
||||
location_on: LocationOnIcon,
|
||||
home: HomeOnIcon,
|
||||
watch_later: WatchLater,
|
||||
business_center: BusinessCenterIcon,
|
||||
business: Business,
|
||||
|
||||
@@ -6,7 +6,7 @@ const OgHead = props => {
|
||||
return (
|
||||
<Head>
|
||||
<title key="title">{props.seo_title}</title>
|
||||
<meta name="robots" content="noindex, nofollow"></meta>
|
||||
{/* <meta name="robots" content="noindex, nofollow"></meta> */}
|
||||
<meta name="description" kenoindexy="description" content={props.seo_description} />
|
||||
<meta name="keywords" content={props.seo_key}/>
|
||||
<meta key="og:url" property="og:url" content={props.seo_url} />
|
||||
@@ -22,11 +22,11 @@ const OgHead = props => {
|
||||
<meta name="twitter:card" content="summary"/>
|
||||
<meta name="twitter:site" content="@TalentsTube"/>
|
||||
<meta name="twitter:title" content={props.seo_title}/>
|
||||
<meta name="twitter:description" content={props.seo_title}/>
|
||||
<meta name="twitter:description" content={props.seo_description}/>
|
||||
<meta name="twitter:image" content={props.image}/>
|
||||
<meta httpEquiv='cache-control' content='no-store,no-cache'></meta>
|
||||
{/* <meta httpEquiv='cache-control' content='no-store,no-cache'></meta>
|
||||
<meta httpEquiv='expires' content='0'></meta>
|
||||
<meta httpEquiv='pragma' content='no-cache'></meta>
|
||||
<meta httpEquiv='pragma' content='no-cache'></meta> */}
|
||||
{/* <link rel="canonical" href={ props.seo_url} /> */}
|
||||
|
||||
</Head>
|
||||
|
||||
@@ -94,7 +94,7 @@ const useStyles = makeStyles(theme => ({
|
||||
|
||||
export default function SimpleCollapse(props) {
|
||||
const classes = useStyles();
|
||||
const [expanded, setExpanded] = React.useState(false);
|
||||
const [expanded, setExpanded] = React.useState(true);
|
||||
|
||||
function handleExpandClick() {
|
||||
setExpanded(!expanded);
|
||||
@@ -111,12 +111,10 @@ export default function SimpleCollapse(props) {
|
||||
</Collapse>
|
||||
|
||||
<CardActions disableSpacing classes={{ root: classes.rootCardAction }}>
|
||||
|
||||
|
||||
<IconButton
|
||||
onClick={handleExpandClick}
|
||||
aria-expanded={expanded}
|
||||
aria-label="Afficher plus"
|
||||
aria-label="Afficher plus "
|
||||
> <Typography className={classes.displayMore}>
|
||||
{(!expanded) ? 'Afficher plus' : 'Afficher moins'}
|
||||
</Typography>
|
||||
|
||||
@@ -71,6 +71,16 @@ const styles = theme => ({
|
||||
backgroundColor: "#25D89A",
|
||||
}
|
||||
},
|
||||
captureButton: {
|
||||
color: theme.palette.secondary.main,
|
||||
backgroundColor: theme.palette.primary.main,
|
||||
padding: theme.spacing(5, 2),
|
||||
margin: theme.spacing(1),
|
||||
boxShadow: '0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 4px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.14)',
|
||||
'&:hover': {
|
||||
backgroundColor: theme.palette.primary.main,
|
||||
},
|
||||
},
|
||||
importButton: {
|
||||
color: theme.palette.primary.main,
|
||||
backgroundColor: theme.palette.secondary.main,
|
||||
@@ -135,7 +145,7 @@ class Etape2 extends React.Component {
|
||||
//window.location.reload(false);
|
||||
if (nextProps.media.status === 'success') {
|
||||
const success = {};
|
||||
success.message ="Vidéo mis à jour";
|
||||
success.message ="Vidéo mise à jour";
|
||||
this.setState({ success });
|
||||
this.setActiveStep(1);
|
||||
}
|
||||
|
||||
@@ -243,6 +243,13 @@ function Footer(props) {
|
||||
</Typography>
|
||||
</a>
|
||||
</Link>
|
||||
<Link href="" >
|
||||
<a href="https://blog.talentstube.com/contact" target="_blank">
|
||||
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
|
||||
Contact
|
||||
</Typography>
|
||||
</a>
|
||||
</Link>
|
||||
</section>
|
||||
<section className={classes.container}>
|
||||
<Typography color="secondary" component="p" className={classes.titleContainer}>
|
||||
@@ -255,7 +262,7 @@ function Footer(props) {
|
||||
56 000 Vannes
|
||||
</Typography>
|
||||
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
|
||||
02.30.05.06.31
|
||||
<a href="tel:+33230050631" >02.30.05.06.31 </a>
|
||||
</Typography>
|
||||
{/* <Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
|
||||
contact@talentstube.com
|
||||
|
||||
@@ -2,6 +2,7 @@ import React from 'react';
|
||||
|
||||
const NextButton = ({ hasNext, onClick, style, className, text }) => hasNext ? (
|
||||
<button type="button" onClick={onClick} style={style} className={className}>Suivant</button>
|
||||
|
||||
) :
|
||||
null;
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
// import React, { useState } from 'react';
|
||||
// import Pagination from '@material-ui/lab/Pagination';
|
||||
// import PaginationItem from '@material-ui/lab/PaginationItem';
|
||||
// export default function GriddleCustomPageDropdown(props) {
|
||||
// let [page] = React.useState(1);
|
||||
// let PageDropDown = null;
|
||||
// const setPage = (event, newPage) => {
|
||||
// console.log('test');
|
||||
// setPage(newPage);
|
||||
|
||||
// };
|
||||
// return (
|
||||
// <Pagination count={props.maxPages} defaultPage={props.currentPage} onChange={props.setPage}/>
|
||||
// );
|
||||
// }
|
||||
|
||||
// const [page, setPage] = useState(1);
|
||||
// const handleChangePage = (event, newPage) => {
|
||||
|
||||
// setPage(newPage);
|
||||
// };
|
||||
// const PageDropDown = ({ maxPages, currentPage, setPage }) => <Pagination count={maxPages} defaultPage={currentPage} onChangePage={handleChangePage}/> ;
|
||||
|
||||
// export default PageDropDown;
|
||||
|
||||
|
||||
import React from 'react';
|
||||
import Pagination from '@material-ui/lab/Pagination';
|
||||
|
||||
const NextButton = ({ maxPages, currentPage, setPage, className, text }) => maxPages ? (
|
||||
<Pagination count={maxPages} defaultPage={currentPage} onChange={setPage} shape="rounded"/>
|
||||
) :
|
||||
null;
|
||||
|
||||
export default NextButton;
|
||||
@@ -40,7 +40,7 @@ import ActiveLink from "./../atoms/Activelink";
|
||||
import axios from 'axios';
|
||||
import setAuthorizationHeader from "../../data/setAuthorizationHeader";
|
||||
import getConfig from 'next/config'
|
||||
|
||||
import Router from 'next/router'
|
||||
const styles = theme => ({
|
||||
root: {
|
||||
width: '100%',
|
||||
@@ -327,7 +327,12 @@ class Header extends React.Component {
|
||||
}
|
||||
|
||||
toggle = () => this.setState(state => ({ toggle: !state.toggle }))
|
||||
chargerPage =(type)=> {
|
||||
console.log(type);
|
||||
//Router.replace(page);
|
||||
sessionStorage.setItem(type+'_currentPage',1);
|
||||
|
||||
}
|
||||
render() {
|
||||
const { classes } = this.props;
|
||||
const { publicRuntimeConfig } = getConfig();
|
||||
@@ -538,13 +543,13 @@ class Header extends React.Component {
|
||||
|
||||
<List className={classes.desktopMenuList}>
|
||||
<div>
|
||||
<ActiveLink activeClassName={classes.active} href="/Offres" >
|
||||
<a className={classes.desktopMenuItem}>
|
||||
<ActiveLink activeClassName={classes.active} href="/Offres" >
|
||||
<a className={classes.desktopMenuItem} >
|
||||
<ListItemText primary="Offres d'emploi">
|
||||
</ListItemText>
|
||||
</a>
|
||||
</ActiveLink>
|
||||
<ActiveLink activeClassName={classes.active} href="/Entreprises" >
|
||||
<ActiveLink activeClassName={classes.active} href="/Entreprises" >
|
||||
<a className={classes.desktopMenuItem}>
|
||||
<ListItemText primary='Nos entreprises'>
|
||||
</ListItemText>
|
||||
|
||||
@@ -0,0 +1,565 @@
|
||||
import React, { Fragment, Children } from 'react';
|
||||
import AppBar from '@material-ui/core/AppBar';
|
||||
import Toolbar from '@material-ui/core/Toolbar';
|
||||
import IconButton from '@material-ui/core/IconButton';
|
||||
import { withStyles, getMuiTheme } from '@material-ui/core/styles';
|
||||
import MenuIcon from '@material-ui/icons/Menu';
|
||||
import Link from 'next/link'
|
||||
import Drawer from '@material-ui/core/Drawer';
|
||||
import Divider from '@material-ui/core/Divider';
|
||||
import HomeIcon from '@material-ui/icons/HomeOutlined';
|
||||
import OfferIcon from '@material-ui/icons/LocalOfferOutlined';
|
||||
import CompanyIcon from '@material-ui/icons/DomainOutlined';
|
||||
import HelpIcon from '@material-ui/icons/HelpOutline';
|
||||
import VideoIcon from '@material-ui/icons/OndemandVideoOutlined';
|
||||
import NotesIcon from '@material-ui/icons/NotesOutlined';
|
||||
import SupervisorAccountIcon from '@material-ui/icons/SupervisorAccount';
|
||||
import PersonIcon from '@material-ui/icons/Person';
|
||||
import PersonAddIcon from '@material-ui/icons/PersonAdd';
|
||||
import WorkOutlineIcon from '@material-ui/icons/WorkOutline';
|
||||
import AccountCircleOutlinedIcon from '@material-ui/icons/AccountCircleOutlined';
|
||||
import FolderSharedIcon from '@material-ui/icons/FolderShared';
|
||||
import AccountCircleIcon from '@material-ui/icons/AccountCircle';
|
||||
import PermContactCalendar from '@material-ui/icons/PermContactCalendar';
|
||||
import VideoCam from '@material-ui/icons/Videocam';
|
||||
import SettingsIcon from '@material-ui/icons/Settings';
|
||||
import PowerSettingsNewIcon from '@material-ui/icons/PowerSettingsNew';
|
||||
import ArrowForward from '@material-ui/icons/ArrowForward';
|
||||
import List from '@material-ui/core/List';
|
||||
import ListItem from '@material-ui/core/ListItem';
|
||||
import { ListItemText } from '@material-ui/core';
|
||||
import Loader from '../templates/loader'
|
||||
import { connect } from 'react-redux'
|
||||
import { fetchCurrentUserRequest } from "../../actions/user";
|
||||
import { requestLogout } from "../../actions/auth";
|
||||
import Button from '@material-ui/core/Button';
|
||||
import withWidth, { isWidthUp } from '@material-ui/core/withWidth'
|
||||
import Typography from '@material-ui/core/Typography';
|
||||
import { withRouter } from "next/router";
|
||||
import ActiveLink from "../atoms/Activelink";
|
||||
import axios from 'axios';
|
||||
import setAuthorizationHeader from "../../data/setAuthorizationHeader";
|
||||
import getConfig from 'next/config'
|
||||
import Router from 'next/router'
|
||||
import ButtonBase from "@material-ui/core/ButtonBase";
|
||||
import ArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
|
||||
const styles = theme => ({
|
||||
root: {
|
||||
width: '100%',
|
||||
position: 'relative',
|
||||
zIndex: '999',
|
||||
'& a': {
|
||||
textDecoration: 'none'
|
||||
}
|
||||
},
|
||||
toolbar: {
|
||||
height: '64px',
|
||||
},
|
||||
grow: {
|
||||
flexGrow: 1,
|
||||
},
|
||||
menuButton: {
|
||||
marginLeft: -12,
|
||||
marginRight: 20,
|
||||
display: 'block'
|
||||
},
|
||||
menuLogo: {
|
||||
cursor: 'pointer',
|
||||
[theme.breakpoints.down('md')]: {
|
||||
width: '200px'
|
||||
},
|
||||
[theme.breakpoints.down('sm')]: {
|
||||
width: '130px'
|
||||
},
|
||||
},
|
||||
menuAvatar: {
|
||||
width: '2.5em',
|
||||
borderRadius: '50%',
|
||||
marginTop: theme.spacing(2),
|
||||
marginLeft: theme.spacing(2),
|
||||
},
|
||||
menuUserName: {
|
||||
color: theme.palette.menu.emailText,
|
||||
fontSize: '1.3rem',
|
||||
fontWeight: '500',
|
||||
},
|
||||
menuUserEmail: {
|
||||
color: theme.palette.menu.emailText,
|
||||
fontSize: '0.9rem',
|
||||
fontWeight: '200',
|
||||
},
|
||||
darkDivider: {
|
||||
background: 'whitesmoke',
|
||||
opacity: '0.1',
|
||||
},
|
||||
List: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
justifyContent: 'space-between',
|
||||
height: '100%',
|
||||
paddingTop: 0,
|
||||
paddingBottom: 0,
|
||||
'&>a:first-child': {
|
||||
minHeight: '64px',
|
||||
height: '64px',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
[theme.breakpoints.up('md')]: {
|
||||
'&>a:first-child': {
|
||||
height: '64px',
|
||||
},
|
||||
'&>a:first-child li': {
|
||||
height: '64px',
|
||||
alignItems: 'center',
|
||||
},
|
||||
},
|
||||
},
|
||||
fullList: {
|
||||
width: 'auto',
|
||||
cursor: 'pointer',
|
||||
paddingBottom: 0
|
||||
},
|
||||
lightFullList: {
|
||||
height: '100vh',
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
darkFullList: {
|
||||
backgroundColor: theme.palette.background.dark,
|
||||
},
|
||||
lightMenuItem: {
|
||||
color: theme.palette.menu.lightText,
|
||||
textDecoration: 'none',
|
||||
},
|
||||
darkMenuItem: {
|
||||
color: theme.palette.menu.darkText,
|
||||
textDecoration: 'none',
|
||||
},
|
||||
darkMenuItemSpecific: {
|
||||
'&:hover,&:active': {
|
||||
color: theme.palette.primary.main,
|
||||
}
|
||||
},
|
||||
links: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
justifyContent: 'space-between',
|
||||
height: '100%',
|
||||
},
|
||||
linkGroup: {
|
||||
padding: theme.spacing(1.2, 0),
|
||||
paddingLeft: 0,
|
||||
},
|
||||
videothequeLinkGroup: {
|
||||
backgroundColor: theme.palette.background.videotheque,
|
||||
},
|
||||
blogLinkGroup: {
|
||||
backgroundColor: theme.palette.background.blog,
|
||||
},
|
||||
recruteurLinkGroup: {
|
||||
backgroundColor: theme.palette.background.recruteur,
|
||||
},
|
||||
rootListItem: {
|
||||
padding: theme.spacing(1, 2),
|
||||
cursor: 'pointer',
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
alignItems: 'flex-start',
|
||||
},
|
||||
rootListItemIcon: {
|
||||
padding: theme.spacing(1, 2),
|
||||
cursor: 'pointer',
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
},
|
||||
ListItemUserConnected: {
|
||||
flexDirection: 'column',
|
||||
},
|
||||
ListItemText: {
|
||||
fontSize: '1em',
|
||||
},
|
||||
icon: {
|
||||
paddingRight: theme.spacing(2.5),
|
||||
},
|
||||
iconAccount: {
|
||||
color: theme.palette.primary.dark,
|
||||
},
|
||||
title: {
|
||||
color: theme.palette.secondary.main,
|
||||
fontSize: '1.5em'
|
||||
},
|
||||
email: {
|
||||
color: theme.palette.menu.emailText,
|
||||
fontSize: '0.9em'
|
||||
},
|
||||
button: {
|
||||
padding: theme.spacing(0.5, 1),
|
||||
textTransform: 'inherit',
|
||||
'& svg': {
|
||||
width: '0.7em',
|
||||
height: '0.7em',
|
||||
},
|
||||
},
|
||||
|
||||
active: {
|
||||
'& span, & svg': {
|
||||
color: theme.palette.primary.main + ' !important',
|
||||
},
|
||||
},
|
||||
|
||||
//DESKTOP PART
|
||||
|
||||
desktopMenuItem: {
|
||||
[theme.breakpoints.down('md')]: {
|
||||
padding: theme.spacing(0.4),
|
||||
},
|
||||
'& span.MuiTypography-root': {
|
||||
fontSize: '0.8rem',
|
||||
fontWeight: '500',
|
||||
},
|
||||
},
|
||||
desktopMenuList: {
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'space-between',
|
||||
padding: 0,
|
||||
},
|
||||
appBarDesktopSection: {
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
appBarDesktopSection1: {
|
||||
padding: theme.spacing(0, 2),
|
||||
height: '100%',
|
||||
borderRight: 'solid 1px whitesmoke',
|
||||
},
|
||||
appBarDesktopSection2: {
|
||||
width: '100%',
|
||||
justifyContent: 'space-between',
|
||||
padding: theme.spacing(0, 2),
|
||||
'& ul': {
|
||||
width: '95%',
|
||||
},
|
||||
'& ul>div': {
|
||||
display: 'flex',
|
||||
},
|
||||
'& ul > div:nth-child(1) a span': {
|
||||
color: theme.palette.primary.dark,
|
||||
'&:hover, &:active': {
|
||||
color: theme.palette.primary.main,
|
||||
}
|
||||
},
|
||||
'& .MuiListItemText-root': {
|
||||
padding: theme.spacing(0, 1),
|
||||
[theme.breakpoints.down('md')]: {
|
||||
padding: theme.spacing(0),
|
||||
},
|
||||
},
|
||||
'& a:last-child .MuiButtonBase-root span': {
|
||||
color: theme.palette.secondary.main,
|
||||
},
|
||||
},
|
||||
appBarDesktopSection3: {
|
||||
padding: theme.spacing(0, 2),
|
||||
height: '100%',
|
||||
backgroundColor: theme.palette.primary.dark,
|
||||
'& a': {
|
||||
display: 'flex',
|
||||
alignItems: 'flex-end',
|
||||
},
|
||||
'& span, & svg': {
|
||||
color: theme.palette.secondary.main,
|
||||
},
|
||||
},
|
||||
toolbarDesktop: {
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'space-between',
|
||||
height: '64px',
|
||||
},
|
||||
desktopMenuButtonLogin: {
|
||||
background: theme.palette.primary.main,
|
||||
borderColor: theme.palette.primary.main,
|
||||
},
|
||||
rootListItemDesktop: {
|
||||
[theme.breakpoints.up('md')]: {
|
||||
padding: theme.spacing(1),
|
||||
},
|
||||
},
|
||||
iconDesktop: {
|
||||
paddingRight: theme.spacing(2.5),
|
||||
[theme.breakpoints.up('md')]: {
|
||||
paddingRight: 0,
|
||||
},
|
||||
},
|
||||
});
|
||||
let urlEnv;
|
||||
|
||||
class HeaderOffre extends React.Component {
|
||||
state = {
|
||||
top: false,
|
||||
left: false,
|
||||
bottom: false,
|
||||
right: false,
|
||||
toggle: true
|
||||
};
|
||||
|
||||
|
||||
|
||||
componentDidMount() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
toggleDrawer = (side, open) => () => {
|
||||
this.setState({
|
||||
[side]: open,
|
||||
});
|
||||
};
|
||||
|
||||
onRedirectAccount = e => {
|
||||
urlEnv = (process.env.NODE_ENV !== 'production') ? '//localhost/app_dev.php' : process.env.SERVER_URL;
|
||||
e.preventDefault();
|
||||
var redirectAccountUrl = urlEnv + "/api/talent?bearer=" + localStorage.getItem("ttJWT");
|
||||
window.open(redirectAccountUrl);
|
||||
}
|
||||
|
||||
toggle = () => this.setState(state => ({ toggle: !state.toggle }))
|
||||
chargerPage =(type)=> {
|
||||
console.log(type);
|
||||
//Router.replace(page);
|
||||
sessionStorage.setItem(type+'_currentPage',1);
|
||||
|
||||
}
|
||||
render() {
|
||||
const { classes } = this.props;
|
||||
const { publicRuntimeConfig } = getConfig();
|
||||
|
||||
|
||||
return (
|
||||
<div className={classes.root}>
|
||||
|
||||
|
||||
<Drawer anchor="right" open={this.state.right} onClose={this.toggleDrawer('right', false)}>
|
||||
<div
|
||||
tabIndex={0}
|
||||
role="button"
|
||||
onClick={this.toggleDrawer('right', false)}
|
||||
onKeyDown={this.toggleDrawer('right', false)}
|
||||
>{!!this.props.loading &&
|
||||
(<Loader />
|
||||
)}
|
||||
{!!!this.props.loading && !!!this.props.fetched
|
||||
&&
|
||||
<div className={classes.fullList + ' ' + classes.darkFullList}>
|
||||
|
||||
</div>}
|
||||
{!!!this.props.loading && !!this.props.fetched &&
|
||||
<Fragment>
|
||||
{this.props.user.picture ?
|
||||
<img alt="talents-tube" src={publicRuntimeConfig.symphonyUrl +publicRuntimeConfig.postedContentUrl+ this.props.user.picture} className={classes.menuAvatar} />
|
||||
:
|
||||
<img alt="talents-tube" src='/static/images/default/account-avatar-default.svg' className={classes.menuAvatar} />
|
||||
}
|
||||
<ListItem classes={{ root: classes.rootListItem }} className={classes.ListItemUserConnected}>
|
||||
<Typography gutterBottom component="h1" className={classes.menuUserName}>
|
||||
{this.props.user.firstname + " " + this.props.user.lastname}
|
||||
</Typography>
|
||||
|
||||
<Typography gutterBottom component="h3" className={classes.menuUserEmail} >
|
||||
{this.props.user.email}
|
||||
</Typography>
|
||||
</ListItem>
|
||||
|
||||
<Divider className={classes.darkDivider} />
|
||||
|
||||
{/* TODO:real links */}
|
||||
<Link href="/Candidatures" >
|
||||
<a className={classes.lightMenuItem}><ListItem classes={{ root: classes.rootListItemIcon }}>
|
||||
<FolderSharedIcon className={classes.icon} />
|
||||
<ListItemText primary='Mes candidatures'>
|
||||
</ListItemText>
|
||||
</ListItem></a>
|
||||
</Link>
|
||||
<Link href="/profileStep" >
|
||||
<a className={classes.lightMenuItem}><ListItem classes={{ root: classes.rootListItemIcon }}>
|
||||
<AccountCircleIcon className={classes.icon} />
|
||||
<ListItemText primary='Mon compte'>
|
||||
</ListItemText>
|
||||
</ListItem></a>
|
||||
</Link>
|
||||
|
||||
<Link href="/Parametres" >
|
||||
<a className={classes.lightMenuItem}><ListItem classes={{ root: classes.rootListItemIcon }}>
|
||||
<SettingsIcon className={classes.icon} />
|
||||
<ListItemText primary='Paramètres de notification'>
|
||||
</ListItemText>
|
||||
</ListItem></a>
|
||||
</Link>
|
||||
<Link href="/" >
|
||||
<a onClick={() => {
|
||||
localStorage.removeItem("ttJWT");
|
||||
return this.props.requestLogout();
|
||||
}} className={classes.lightMenuItem}><ListItem classes={{ root: classes.rootListItemIcon }}>
|
||||
<PowerSettingsNewIcon className={classes.icon} />
|
||||
<ListItemText primary='Déconnexion'>
|
||||
</ListItemText>
|
||||
</ListItem></a>
|
||||
</Link>
|
||||
</Fragment>
|
||||
}
|
||||
</div>
|
||||
</Drawer>
|
||||
|
||||
{isWidthUp('md', this.props.width) ?
|
||||
(<AppBar position="static" className={classes.appBar}>
|
||||
<Toolbar disableGutters={true} className={classes.toolbarDesktop}>
|
||||
<section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection1}>
|
||||
<Link href="/" >
|
||||
<a className={classes.darkMenuItem}>
|
||||
<ListItem classes={{ root: classes.rootListItemDesktop }}>
|
||||
<img alt="talents-tube" src='/statique/images/logos/TalentsTube_logo-color.svg' className={classes.desktopMenuLogo} />
|
||||
</ListItem>
|
||||
</a>
|
||||
</Link>
|
||||
</section>
|
||||
<section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection2}>
|
||||
{/* <IconButton className={classes.menuButton} onClick={this.toggleDrawer('left', true)}
|
||||
color="inherit" aria-label="Open drawer">
|
||||
<MenuIcon />
|
||||
</IconButton> */}
|
||||
{/* <ButtonBase name='back'
|
||||
focusRipple
|
||||
className={classes.back}
|
||||
focusVisibleClassName={classes.focusVisible}
|
||||
onClick={() => Router.back()}>
|
||||
<ArrowLeft color="primary" classes={{ root: classes.icon }}></ArrowLeft>
|
||||
</ButtonBase> */}
|
||||
<List className={classes.desktopMenuList}>
|
||||
<div>
|
||||
<ActiveLink activeClassName={classes.active} href="/Offres" >
|
||||
<a className={classes.desktopMenuItem} >
|
||||
<ListItemText primary="Offres d'emploi">
|
||||
</ListItemText>
|
||||
</a>
|
||||
</ActiveLink>
|
||||
<ActiveLink activeClassName={classes.active} href="/Entreprises" >
|
||||
<a className={classes.desktopMenuItem}>
|
||||
<ListItemText primary='Nos entreprises'>
|
||||
</ListItemText>
|
||||
</a>
|
||||
</ActiveLink>
|
||||
<ActiveLink activeClassName={classes.active} href="/Help" >
|
||||
<a className={classes.desktopMenuItem}>
|
||||
<ListItemText primary='Comment ça marche ?'>
|
||||
</ListItemText>
|
||||
</a>
|
||||
</ActiveLink>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{!!!this.props.loading && !!!this.props.fetched &&
|
||||
<Fragment>
|
||||
<Link href="/Login?inscription=true" >
|
||||
<a className={classes.desktopMenuItem}>
|
||||
<ListItem classes={{ root: classes.rootListItemDesktop }}>
|
||||
<Button
|
||||
variant="outlined"
|
||||
className={classes.button + ' ' + classes.desktopMenuButtonRegister}>
|
||||
<PersonAddIcon className={classes.iconDesktop} />
|
||||
<ListItemText classes={{ primary: classes.ListItemText }} primary='Inscription'></ListItemText>
|
||||
</Button >
|
||||
</ListItem>
|
||||
</a>
|
||||
</Link>
|
||||
|
||||
<Link href="/Login" >
|
||||
<a className={classes.desktopMenuItem}>
|
||||
<ListItem classes={{ root: classes.rootListItemDesktop }}>
|
||||
<Button
|
||||
variant="outlined"
|
||||
className={classes.button + ' ' + classes.desktopMenuButtonLogin}>
|
||||
<PersonIcon className={classes.iconDesktop} />
|
||||
<ListItemText classes={{ primary: classes.ListItemText }} primary='Connexion'></ListItemText>
|
||||
</Button >
|
||||
</ListItem>
|
||||
</a>
|
||||
</Link>
|
||||
</Fragment>
|
||||
}
|
||||
{!!!this.props.loading && !!this.props.fetched &&
|
||||
<IconButton
|
||||
edge="end"
|
||||
aria-label="Profile"
|
||||
aria-controls={'primary-search-account-menu'}
|
||||
aria-haspopup="true"
|
||||
onClick={this.toggleDrawer('right', true)}
|
||||
className={classes.iconAccount + ' cypConnexionMenu'}
|
||||
>
|
||||
<AccountCircleOutlinedIcon />
|
||||
</IconButton>
|
||||
}
|
||||
</div>
|
||||
</List>
|
||||
</section>
|
||||
<section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
|
||||
|
||||
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.desktopMenuItem}>
|
||||
<ListItemText primary='Espace recruteurs'>
|
||||
</ListItemText>
|
||||
<ArrowForward className={classes.icon} />
|
||||
</a>
|
||||
</section>
|
||||
</Toolbar>
|
||||
</AppBar>)
|
||||
:
|
||||
(
|
||||
<AppBar position="static" className={classes.appBar}>
|
||||
<Toolbar className={classes.toolbar}>
|
||||
{/* <IconButton className={classes.menuButton} onClick={this.toggleDrawer('left', true)}
|
||||
color="inherit" role="button">
|
||||
<MenuIcon />
|
||||
</IconButton> */}
|
||||
<ButtonBase name='back'
|
||||
focusRipple
|
||||
className={classes.back}
|
||||
focusVisibleClassName={classes.focusVisible}
|
||||
onClick={() => Router.back()}>
|
||||
<ArrowLeft color="primary" classes={{ root: classes.icon }}></ArrowLeft>
|
||||
</ButtonBase>
|
||||
<div className={classes.grow} />
|
||||
<Link href="/" >
|
||||
<a><img alt="talents-tube" src='/statique/images/logos/TalentsTube_logo-color.svg' className={classes.menuLogo} /></a>
|
||||
</Link>
|
||||
<div className={classes.grow} />
|
||||
<IconButton
|
||||
edge="end"
|
||||
aria-label="Profile"
|
||||
aria-controls={'primary-search-account-menu'}
|
||||
aria-haspopup="true"
|
||||
onClick={this.toggleDrawer('right', true)}
|
||||
className={classes.iconAccount + ' cypConnexionMenu'}
|
||||
|
||||
>
|
||||
<AccountCircleOutlinedIcon />
|
||||
</IconButton>
|
||||
</Toolbar>
|
||||
</AppBar>
|
||||
)}
|
||||
</div >
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function mapStateToProps(state) {
|
||||
return {
|
||||
user: state.user,
|
||||
fetched: !!state.user.fetched,
|
||||
loading: !!state.user.loading
|
||||
};
|
||||
}
|
||||
export default (connect(mapStateToProps, { fetchCurrentUserRequest, requestLogout })(withStyles(styles)(withWidth()(HeaderOffre))));
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,8 +17,28 @@ const RTCRecorder = dynamic(() => import('RecordRTC'), {
|
||||
|
||||
const videoJsOptions = {
|
||||
controls: true,
|
||||
|
||||
languages: {
|
||||
fr: {
|
||||
|
||||
Replay: 'Jouer'
|
||||
}
|
||||
},
|
||||
autoplay:true,
|
||||
preload:"auto",
|
||||
playsinline : true,
|
||||
//videoEngine: 'webm-wasm',
|
||||
//liveui : true,
|
||||
fluid: true,
|
||||
nativeControlsForTouch:false,
|
||||
controlBar: {
|
||||
// hide fullscreen and volume controls
|
||||
fullscreenToggle: false,
|
||||
volumePanel: false,
|
||||
deviceButton: false,
|
||||
recordIndicator:true,
|
||||
recordToggle: true
|
||||
},
|
||||
// poster: "https://vignette.wikia.nocookie.net/charabattles/images/e/eb/Chuck_norris.jpg/revision/latest/scale-to-width-down/400?cb=20170412123612&path-prefix=fr",
|
||||
plugins: {
|
||||
/*
|
||||
// wavesurfer section is only needed when recording audio-only
|
||||
@@ -81,10 +101,42 @@ class Recorder extends Component {
|
||||
' and recordrtc ' + RTCRecorder.VERSION;
|
||||
videojs.log(version_info);
|
||||
});
|
||||
var vid= this.player;
|
||||
this.player.bigPlayButton.hide();
|
||||
|
||||
|
||||
// When you pass text in options it just creates a control text,
|
||||
// which is displayed as tooltip when hovered on
|
||||
// this button viz the span in you div,
|
||||
var myButton = this.player.controlBar.addChild("button");
|
||||
|
||||
|
||||
|
||||
// There are many functions available for button component
|
||||
// like below mentioned in this docs
|
||||
// https://docs.videojs.com/button.
|
||||
// You can set attributes and clasess as well.
|
||||
|
||||
// Getting html DOM
|
||||
var myButtonDom = myButton.el();
|
||||
//var myButtonDom2 = myButton2.el();
|
||||
// Since now you have the html dom element
|
||||
// you can add click events
|
||||
|
||||
|
||||
// Now I am setting the text as you needed.
|
||||
myButtonDom.innerHTML = "Youi";
|
||||
|
||||
myButtonDom.onclick = function(){
|
||||
//alert("Redirecting");
|
||||
vid.pause();
|
||||
}
|
||||
|
||||
|
||||
// device is ready
|
||||
this.player.on('deviceReady', () => {
|
||||
console.info('device is ready!');
|
||||
this.player.record().start();
|
||||
this.setState({canSend:false});
|
||||
});
|
||||
|
||||
@@ -129,6 +181,23 @@ class Recorder extends Component {
|
||||
this.props.uploader(formData);
|
||||
}
|
||||
|
||||
pausePlayer = () => {
|
||||
// console.log('accessing recording: ', this.player.recordedData)
|
||||
if (this.player) {
|
||||
//this.player.recorder.start()
|
||||
this.player.ready();
|
||||
this.player.record().getDevice();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
arretPlayer = () => {
|
||||
// console.log('accessing recording: ', this.player.recordedData)
|
||||
if (this.player) {
|
||||
this.player.record().stop();
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
const { classes, titreBouton } = this.props;
|
||||
let titreButtonLabel= "Envoyer";
|
||||
@@ -150,6 +219,11 @@ class Recorder extends Component {
|
||||
onClick={this.sendBlob}>
|
||||
{titreButtonLabel}
|
||||
</Button>}
|
||||
<Button className={classes.button} variant="outlined" color="primary" onClick={this.pausePlayer}>Lancer enregistrement</Button>
|
||||
<Button className={classes.button} variant="outlined" color="primary" onClick={this.arretPlayer}>Arreter enregistrement</Button>
|
||||
</div>
|
||||
<div id="controleNav">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import React from 'react';
|
||||
import videojs from 'video.js'
|
||||
import React, { lazy } from 'react';
|
||||
const videojs = lazy(() => import('video.js'));
|
||||
//import videojs from 'video.js'
|
||||
|
||||
export default class VideoPlayer extends React.Component {
|
||||
componentDidMount() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import Griddle, { utils } from "griddle-react";
|
||||
import Griddle, { utils, plugins } from "griddle-react";
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
@@ -7,6 +7,7 @@ import TextField from '@material-ui/core/TextField';
|
||||
import GriddleCustomTable from "../organisms/GriddleCustomTableComponent";
|
||||
import GriddleCustomNextButton from "../organisms/GriddleCustomNextButton"
|
||||
import GriddleCustomPreviousButton from "../organisms/GriddleCustomPreviousButton"
|
||||
import GriddleCustomPageDropdown from "../organisms/GriddleCustomPageDropdown"
|
||||
import Loader from './loader'
|
||||
import IconSearch from '@material-ui/icons/Search';
|
||||
import NoResult from './../atoms/NoResult';
|
||||
@@ -80,18 +81,37 @@ class Grid extends Component {
|
||||
recordCount: 0,
|
||||
promoted: false,
|
||||
filterText: "",
|
||||
// options: [],
|
||||
};
|
||||
|
||||
async componentDidMount() {
|
||||
|
||||
this.setState({pageSize:this.props.limit})
|
||||
|
||||
let data = sessionStorage.getItem(this.props.type+'_currentPage');
|
||||
let current;
|
||||
if(data){
|
||||
current=data;
|
||||
}else{
|
||||
current=this.state.currentPage;
|
||||
}
|
||||
this.props.dataFetcher(
|
||||
{
|
||||
offset: this.state.currentPage,
|
||||
offset: ((current-1)*this.props.limit)+1,
|
||||
limit: this.props.limit
|
||||
}
|
||||
);
|
||||
// let options = [];
|
||||
// let startIndex = Math.max(this.props.currentPage - 5, 0);
|
||||
// let endIndex = Math.min(startIndex + 11, this.props.maxPage);
|
||||
|
||||
// if (this.props.maxPage >= 11 && (endIndex - startIndex) <= 10) {
|
||||
// startIndex = endIndex - 11;
|
||||
// }
|
||||
|
||||
// for(let i = startIndex; i < endIndex ; i++){
|
||||
// let selected = this.props.currentPage == i ? "current-page-selected" : "";
|
||||
// options.push(<button className={selected} data-value={i} onClick={this.pageChange}>{i + 1}</button>);
|
||||
// }
|
||||
}
|
||||
|
||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
||||
@@ -106,10 +126,17 @@ class Grid extends Component {
|
||||
const { currentPage, pageSize, filterText, promoted } = this.state;
|
||||
|
||||
if (nextProps.promoted != this.state.promoted) {
|
||||
let data = sessionStorage.getItem(this.props.type+'_currentPage');
|
||||
let current;
|
||||
if(data){
|
||||
current=data;
|
||||
}else{
|
||||
current=this.state.currentPage;
|
||||
}
|
||||
this.setState({ promoted: nextProps.promoted });
|
||||
this.props.dataFetcher(
|
||||
{
|
||||
offset: this.state.currentPage,
|
||||
offset: ((current-1)*(this.state.pageSize+1))+1,
|
||||
limit: this.state.pageSize,
|
||||
keyword: filterText,
|
||||
isPromoted: nextProps.promoted
|
||||
@@ -123,19 +150,34 @@ class Grid extends Component {
|
||||
_onNext = () => {
|
||||
const { currentPage, pageSize, filterText, promoted } = this.state;
|
||||
this.props.dataFetcher({ offset: currentPage * pageSize, limit: pageSize, keyword: filterText, isPromoted: promoted })
|
||||
sessionStorage.setItem(this.props.type+'_currentPage', currentPage+1);
|
||||
|
||||
};
|
||||
|
||||
_onPrevious = () => {
|
||||
const { currentPage, pageSize, filterText, promoted } = this.state;
|
||||
this.props.dataFetcher({ offset: (currentPage - 2) * pageSize + 1, limit: pageSize, keyword: filterText, isPromoted: promoted });
|
||||
sessionStorage.setItem(this.props.type+'_currentPage', currentPage-1);
|
||||
|
||||
};
|
||||
|
||||
_onGetPage = pageNumber => {
|
||||
_onGetPage = (pageNumber, page) => {
|
||||
const { pageSize, filterText, promoted } = this.state;
|
||||
this.props.dataFetcher({ offset: (page - 1) * pageSize + 1, limit: pageSize, keyword: filterText, isPromoted: promoted });
|
||||
console.log(pageNumber);
|
||||
console.log(page);
|
||||
sessionStorage.setItem(this.props.type+'_currentPage', page);
|
||||
console.log("On get Page");
|
||||
};
|
||||
|
||||
_onSetPage = pageNumber => {
|
||||
const { pageSize, filterText, promoted } = this.state;
|
||||
this.props.dataFetcher({ offset: (pageNumber - 1) * pageSize + 1, limit: pageSize, keyword: filterText, isPromoted: promoted });
|
||||
console.log("On set Page");
|
||||
};
|
||||
|
||||
_onFilter = filterText => {
|
||||
sessionStorage.setItem(this.props.type+'_currentPage', 1);
|
||||
this.setState({ currentPage: 1 });
|
||||
const { currentPage, pageSize, promoted } = this.state;
|
||||
this.setState({ filterText });
|
||||
@@ -148,11 +190,12 @@ class Grid extends Component {
|
||||
|
||||
searchSubmit = () => {
|
||||
const { currentPage, pageSize, promoted, filterText } = this.state;
|
||||
|
||||
sessionStorage.setItem(this.props.type+'_currentPage', 1);
|
||||
this.props.dataFetcher({ offset: 1, limit: pageSize, keyword: filterText, isPromoted: promoted });
|
||||
}
|
||||
|
||||
render() {
|
||||
|
||||
const { classes, placeholder } = this.props
|
||||
const style = {
|
||||
styles: {
|
||||
@@ -203,7 +246,7 @@ class Grid extends Component {
|
||||
fontSize: '0.9em',
|
||||
fontWeight: '600',
|
||||
fontFamily: 'Dosis',
|
||||
display: 'none',
|
||||
// display: 'none',
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -211,10 +254,12 @@ class Grid extends Component {
|
||||
const { filterText, data, currentPage, pageSize, recordCount, loading } = this.state;
|
||||
|
||||
const NewLayout = ({ Table, Pagination, Filter }) => (
|
||||
|
||||
<div>
|
||||
{/* <Filter /> */}
|
||||
<Table />
|
||||
<Pagination />
|
||||
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -278,6 +323,7 @@ class Grid extends Component {
|
||||
recordCount,
|
||||
}}
|
||||
useCustomPagerComponent="true"
|
||||
plugins={plugins.localPlugin}
|
||||
components={{
|
||||
Layout: NewLayout,
|
||||
Row: this.props.CustomRowComponent,
|
||||
@@ -285,12 +331,15 @@ class Grid extends Component {
|
||||
TableBody: CustomTableBody,
|
||||
PreviousButton: GriddleCustomPreviousButton,
|
||||
NextButton: GriddleCustomNextButton,
|
||||
PageDropdown: GriddleCustomPageDropdown,
|
||||
|
||||
}}
|
||||
events={{
|
||||
onNext: this._onNext,
|
||||
onPrevious: this._onPrevious,
|
||||
onGetPage: this._onGetPage,
|
||||
onFilter: this._onFilter
|
||||
onFilter: this._onFilter,
|
||||
onSetPage: this._onSetPage
|
||||
}}
|
||||
styleConfig={style}
|
||||
/>
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
import { withStyles } from '@material-ui/core/styles'
|
||||
import Router from 'next/router';
|
||||
import RootContainer from '../atoms/RootContainer'
|
||||
import ButtonBase from "@material-ui/core/ButtonBase";
|
||||
import ArrowLeft from '@material-ui/icons/Close';
|
||||
import Typography from '@material-ui/core/Typography';
|
||||
|
||||
const styles = theme => ({
|
||||
inner: {
|
||||
height: '100%',
|
||||
position: 'relative',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
boxShadow: '0 6px 10px 0 rgba(0, 0, 0, 0.04), 0 1px 10px 0 rgba(0, 0, 0, 0.04), 0 3px 5px -1px rgba(0, 0, 0, 0.04)',
|
||||
backgroundColor: '#1E2327',
|
||||
},
|
||||
head: {
|
||||
zIndex: '999',
|
||||
width: '100%',
|
||||
height: '64px',
|
||||
background: theme.palette.background.main,
|
||||
position: 'fixed',
|
||||
[theme.breakpoints.up('sm')]: {
|
||||
height: '64px'
|
||||
}
|
||||
},
|
||||
icon: {
|
||||
fontSize: '3em',
|
||||
textAlign :'right'
|
||||
},
|
||||
title: {
|
||||
color: theme.palette.primary.dark,
|
||||
},
|
||||
content: {
|
||||
top: '64px',
|
||||
width: '100%',
|
||||
minHeight: '1000px',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'flex-start',
|
||||
position: 'relative',
|
||||
backgroundColor: '#1E2327',
|
||||
},
|
||||
contentFixed: {
|
||||
height: 'calc(100vh - 64px)',
|
||||
backgroundColor: '#1E2327',
|
||||
},
|
||||
back: {
|
||||
zIndex: 10,
|
||||
border: 'none',
|
||||
padding: theme.spacing(0.2),
|
||||
textAlign: 'center',
|
||||
textDecoration: 'none',
|
||||
borderRadius: '50%',
|
||||
position: 'absolute',
|
||||
right: theme.spacing(1),
|
||||
backgroundColor: '#fff'
|
||||
},
|
||||
player: {
|
||||
background:'#1E2327'
|
||||
},
|
||||
});
|
||||
|
||||
function LayoutBack(props) {
|
||||
|
||||
const { classes, height} = props;
|
||||
|
||||
//height fixed = height 100vh
|
||||
const content = (height == 'fixed') ? classes.content+' '+classes.contentFixed : classes.content
|
||||
return (
|
||||
<RootContainer align='center' className={content}>
|
||||
<div id="H" className={classes.head}>
|
||||
<div className={classes.inner}>
|
||||
<ButtonBase name='back'
|
||||
focusRipple
|
||||
className={classes.back}
|
||||
focusVisibleClassName={classes.focusVisible}
|
||||
onClick={() => Router.push(props.url)}>
|
||||
<ArrowLeft color="#fff" classes={{ root: classes.icon }}></ArrowLeft>
|
||||
</ButtonBase>
|
||||
<Typography
|
||||
component="h1"
|
||||
align="center"
|
||||
className={classes.title}
|
||||
>
|
||||
{props.text}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
<div id="C" className={content}>
|
||||
{props.children}
|
||||
</div>
|
||||
|
||||
</RootContainer>
|
||||
)
|
||||
}
|
||||
|
||||
export default withStyles(styles)(LayoutBack)
|
||||
@@ -5,7 +5,8 @@ import Router from 'next/router';
|
||||
import RootContainer from '../atoms/RootContainer'
|
||||
import ButtonBase from "@material-ui/core/ButtonBase";
|
||||
import ArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
|
||||
import Header from '../organisms/Header'
|
||||
import Header from '../organisms/HeaderOffre'
|
||||
import SocialShare from '../organisms/SocialShare'
|
||||
import withWidth, { isWidthUp } from '@material-ui/core/withWidth'
|
||||
import Hidden from '@material-ui/core/Hidden';
|
||||
import Link from 'next/link'
|
||||
@@ -72,16 +73,19 @@ const styles = theme => ({
|
||||
backgroundColor: '#F3F3F4',
|
||||
|
||||
},
|
||||
pourvuButton:{
|
||||
padding :'10px'
|
||||
},
|
||||
})
|
||||
|
||||
function LayoutOffre(props) {
|
||||
|
||||
const { classes, offreId, offre, isProvided } = props;
|
||||
const { classes, offreId, offre, isProvided, socialShareUrl } = props;
|
||||
const contentClass = (!isProvided) ? classes.contentDefault : classes.contentProvided
|
||||
|
||||
return (
|
||||
<RootContainer>
|
||||
{isWidthUp('sm', props.width) ?
|
||||
{isWidthUp('xs', props.width) ?
|
||||
(<Header />)
|
||||
:
|
||||
(<ButtonBase name='back'
|
||||
@@ -101,13 +105,12 @@ function LayoutOffre(props) {
|
||||
<div id="F" className={classes.foot}>
|
||||
{/* <div className={classes.inner}>
|
||||
<div className={classes.grow} /> */}
|
||||
<Link href={`/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`} >
|
||||
{/* <Link href={`/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`} >
|
||||
<Button
|
||||
variant="contained"
|
||||
className={classes.voirEntreprise + ' cypButtonApply'}
|
||||
>Voir l'entreprise</Button>
|
||||
|
||||
</Link>
|
||||
>Voir l'entreprise</Button>
|
||||
</Link> */}
|
||||
|
||||
<Button
|
||||
variant="contained"
|
||||
@@ -115,7 +118,23 @@ function LayoutOffre(props) {
|
||||
classes={{ root: classes.rootButton}}
|
||||
onClick={() => Router.push(`/Reponse?adId=${offreId}`)}
|
||||
>
|
||||
Postuler</Button>
|
||||
Postuler
|
||||
</Button>
|
||||
<SocialShare url={socialShareUrl} />
|
||||
|
||||
{/* <div className={classes.grow} />
|
||||
</div> */}
|
||||
</div>
|
||||
)}
|
||||
{isProvided && (
|
||||
<div id="F" className={classes.foot}>
|
||||
{/* <div className={classes.inner}>
|
||||
<div className={classes.grow} /> */}
|
||||
|
||||
|
||||
<Button variant="contained" disabled className={classes.pourvuButton}>
|
||||
Pourvue
|
||||
</Button>
|
||||
{/* <div className={classes.grow} />
|
||||
</div> */}
|
||||
</div>
|
||||
|
||||
+13
-10
@@ -40,18 +40,21 @@ module.exports = withPlugins(
|
||||
}],
|
||||
[{
|
||||
publicRuntimeConfig: {
|
||||
//symphonyUrl: 'http://localhost/app_dev.php',
|
||||
//blogUrl: 'https://blog.talentstube.com',
|
||||
//frontServerUrl: 'http://localhost:3000',
|
||||
//cvThequeUrl: 'https://recruteur.talentstube.com',
|
||||
//symphonyUrl: 'https://recruteur.talentstube.com',
|
||||
//blogUrl: 'https://blog.talentstube.com',
|
||||
//frontServerUrl: 'https://www.talentstube.com',
|
||||
//cvThequeUrl: 'https://recruteur.talentstube.com',
|
||||
symphonyUrl: 'https://pp.talentstube.com/',
|
||||
// DEV
|
||||
// symphonyUrl: 'http://localhost/app_dev.php/',
|
||||
// blogUrl: 'https://blog.talentstube.com',
|
||||
// frontServerUrl: 'http://localhost:3000',
|
||||
// cvThequeUrl: 'https://recruteur.talentstube.com',
|
||||
// PROD
|
||||
symphonyUrl: 'https://recruteur.talentstube.com/',
|
||||
blogUrl: 'https://blog.talentstube.com',
|
||||
frontServerUrl: 'https://pp.app.talentstube.com/',
|
||||
frontServerUrl: 'https://www.talentstube.com/',
|
||||
cvThequeUrl: 'https://recruteur.talentstube.com',
|
||||
// PRE PROD
|
||||
// symphonyUrl: 'https://pp.talentstube.com/',
|
||||
// blogUrl: 'https://blog.talentstube.com',
|
||||
// frontServerUrl: 'https://pp.app.talentstube.com/',
|
||||
// cvThequeUrl: 'https://recruteur.talentstube.com',
|
||||
adListDefaultUrl: '/statique/images/default/default_picture_company.svg',
|
||||
cachedMediaUrl: '/media/cache/profile_thumb/uploads/img/',
|
||||
postedContentUrl: '/uploads/img/',
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
"@material-ui/icons": "^4.9.1",
|
||||
"@material-ui/lab": "^4.0.0-alpha.56",
|
||||
"@ostai/next-css": "^1.0.2",
|
||||
"autosuggest-highlight": "^3.1.1",
|
||||
"axios": "^0.18.0",
|
||||
"connect-mongo": "^2.0.1",
|
||||
"cross-env": "^5.2.0",
|
||||
@@ -47,6 +48,7 @@
|
||||
"prop-types": "latest",
|
||||
"react": "^16.9.0",
|
||||
"react-ad-block-detect": "^1.0.1",
|
||||
"react-autosuggest": "^10.0.2",
|
||||
"react-dom": "^16.9.0",
|
||||
"react-ga": "^2.5.7",
|
||||
"react-google-recaptcha": "^2.0.1",
|
||||
@@ -54,6 +56,7 @@
|
||||
"react-jss": "latest",
|
||||
"react-moment": "^0.9.7",
|
||||
"react-redux": "^7.0.3",
|
||||
"react-sticky-box": "^0.9.3",
|
||||
"react-swipeable-views": "^0.13.3",
|
||||
"reactstrap": "^6.4.0",
|
||||
"recordrtc": "^5.5.4",
|
||||
|
||||
@@ -84,10 +84,20 @@ class ConfirmAccount extends Component {
|
||||
e-mail validé
|
||||
</Typography>
|
||||
<Typography gutterBottom align="left" className={classes.text}>
|
||||
Votre email a bien été validé.
|
||||
Votre email a bien été validé.
|
||||
|
||||
</Typography>
|
||||
<Typography gutterBottom align="left" className={classes.text}>
|
||||
Vous pouvez maintenant vous connecter.
|
||||
<Button
|
||||
variant="contained"
|
||||
className={classes.button}
|
||||
classes={{ root: classes.rootButton }}
|
||||
onClick={() => Router.push('/Login')}
|
||||
>
|
||||
Connexion
|
||||
</Button>
|
||||
|
||||
</Typography>
|
||||
<section className={classes.bottomContainer}>
|
||||
<Button
|
||||
|
||||
+12
-10
@@ -1,5 +1,5 @@
|
||||
|
||||
import React, { Fragment } from 'react'
|
||||
import React, { Fragment,lazy, Suspense } from 'react'
|
||||
import Router from 'next/router'
|
||||
import { connect } from "react-redux"
|
||||
import PropTypes from 'prop-types'
|
||||
@@ -16,7 +16,8 @@ import { fetchCompanyRequest, clearCompany, countCompanyViewRequest } from '../a
|
||||
import IconText from '../components/atoms/IconText'
|
||||
import IconTextInline from '../components/atoms/IconTextInline'
|
||||
import SimpleCollapse from '../components/atoms/SimpleCollapse'
|
||||
import VideoVimeo from '../components/atoms/VideoVimeo'
|
||||
const VideoVimeo = lazy(() => import('../components/atoms/VideoVimeo'));
|
||||
//import VideoVimeo from '../components/atoms/VideoVimeo'
|
||||
import SocialShare from '../components/organisms/SocialShare'
|
||||
import Loader from '../components/templates/loader'
|
||||
import _ from "lodash"
|
||||
@@ -25,7 +26,7 @@ import withWidth from '@material-ui/core/withWidth'
|
||||
import Hidden from '@material-ui/core/Hidden';
|
||||
import NoResult from '../components/atoms/NoResult';
|
||||
import OgHead from '../components/atoms/OgHead';
|
||||
|
||||
const renderLoader = () => <p>Chargement</p>;
|
||||
const styles = theme => ({
|
||||
companyContainer: {
|
||||
[theme.breakpoints.up('md')]: {
|
||||
@@ -432,11 +433,7 @@ class Entreprise extends React.Component {
|
||||
</div>
|
||||
</div>
|
||||
<div className={classes.buttonContainer}>
|
||||
<Button
|
||||
variant="contained"
|
||||
className={classes.button}
|
||||
onClick={() => Router.push(`/Reponse?companyId=${company.id}`)}
|
||||
>Candidature spontanée</Button>
|
||||
|
||||
<Link href="#discover" >
|
||||
<Button
|
||||
variant="contained"
|
||||
@@ -444,10 +441,15 @@ class Entreprise extends React.Component {
|
||||
>Voir les offres</Button>
|
||||
|
||||
</Link>
|
||||
<Button
|
||||
variant="contained"
|
||||
className={classes.button}
|
||||
onClick={() => Router.push(`/Reponse?companyId=${company.id}`)}
|
||||
>Candidature spontanée</Button>
|
||||
</div>
|
||||
</section>
|
||||
</Hidden>
|
||||
{company.presentation_video && <VideoVimeo videoId={Ar.last(_.split(company.presentation_video.cdn_url, '/'))} autoplay='1' />}
|
||||
{company.presentation_video && <Suspense fallback={renderLoader()}><VideoVimeo videoId={Ar.last(_.split(company.presentation_video.cdn_url, '/'))} autoplay='1' /></Suspense>}
|
||||
<div className={classes.container}>
|
||||
<Hidden mdUp>
|
||||
<section className={classes.headerContainer}>
|
||||
@@ -567,7 +569,7 @@ class Entreprise extends React.Component {
|
||||
Découvrir le <span className={classes.primary}>territoire</span>
|
||||
</Typography>
|
||||
<section className={classes.discoverTerritoryContentContainer}>
|
||||
<VideoVimeo classesOverride={classes.videoVimeo} videoId={territoryVideoId} autoplay='0' />
|
||||
<Suspense fallback={renderLoader()}><VideoVimeo classesOverride={classes.videoVimeo} videoId={territoryVideoId} autoplay='0' /></Suspense>
|
||||
<Typography className={classes.territoryTitle}>
|
||||
{(company.territories) ? company.territories[0].territory.brand_name : ''}
|
||||
</Typography>
|
||||
|
||||
@@ -112,6 +112,7 @@ class Entreprises extends React.Component {
|
||||
currentPage={this.props.currentPage}
|
||||
recordCount={this.props.recordCount}
|
||||
loading={this.props.loading}
|
||||
type="entreprises"
|
||||
limit={12}
|
||||
placeholder={"Rechercher une entreprise"}
|
||||
/>
|
||||
|
||||
@@ -246,7 +246,7 @@ class LoginPage extends React.Component {
|
||||
)}
|
||||
{!loading && (
|
||||
<Fragment>
|
||||
<AppBar className={classes.AppBar} color="default">
|
||||
{/* <AppBar className={classes.AppBar} color="default">
|
||||
<Tabs
|
||||
value={this.state.tabIndex}
|
||||
onChange={this.handleChange}
|
||||
@@ -256,7 +256,7 @@ class LoginPage extends React.Component {
|
||||
<Tab label="Connexion" className={classes.tab} />
|
||||
<Tab label="Inscription" className={classes.tab} />
|
||||
</Tabs>
|
||||
</AppBar>
|
||||
</AppBar> */}
|
||||
<SwipeableViews
|
||||
axis={'x'}
|
||||
index={this.state.tabIndex}
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
|
||||
import React from 'react';
|
||||
import React, { Fragment,lazy, Suspense } from 'react'
|
||||
import { connect } from "react-redux";
|
||||
import PropTypes from 'prop-types';
|
||||
import getConfig from 'next/config'
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
import LayoutOffre from "../components/templates/LayoutOffre";
|
||||
import OffreDetail from "../components/organisms/OffreDetail";
|
||||
const OffreDetail = lazy(() => import('../components/organisms/OffreDetail'));
|
||||
//import OffreDetail from "../components/organisms/OffreDetail";
|
||||
import { fetchJobRequest, clearAd, countAdViewRequest } from '../actions/ads'
|
||||
import _ from "lodash/string";
|
||||
|
||||
const renderLoader = () => <p>Chargement</p>;
|
||||
const styles = theme => ({
|
||||
|
||||
});
|
||||
|
||||
const { publicRuntimeConfig } = getConfig()
|
||||
|
||||
class Offre extends React.Component {
|
||||
|
||||
componentDidMount() {
|
||||
@@ -29,10 +31,11 @@ class Offre extends React.Component {
|
||||
}
|
||||
render() {
|
||||
const { classes, offre } = this.props;
|
||||
|
||||
const socialShareUrl = typeof window !== 'undefined' ? window.location : publicRuntimeConfig.frontServerUrl + `/Offre/${offre.id}-${_.kebabCase(offre.title)}`;
|
||||
return (
|
||||
<LayoutOffre backLink="/Offres" offreId={offre.id} offre={offre} isProvided={offre.is_promoted}>
|
||||
<OffreDetail offre={offre}/>
|
||||
{/* <Suspense fallback={renderLoader()}><OffreDetail offre={offre}/></Suspense> */}
|
||||
<Suspense fallback={renderLoader()}><OffreDetail offre={offre}/></Suspense>
|
||||
</LayoutOffre>
|
||||
);
|
||||
}
|
||||
|
||||
+15
-1
@@ -80,9 +80,21 @@ class Offres extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
}
|
||||
voirOffre(){
|
||||
this.props.togglePromotedFilterRequest()
|
||||
sessionStorage.setItem('offres_currentPage',1);
|
||||
}
|
||||
|
||||
static getInitialProps({ query }) {
|
||||
const { init } = query
|
||||
//this.props.promotedFilter =init
|
||||
return { init };
|
||||
}
|
||||
|
||||
render() {
|
||||
|
||||
const { classes } = this.props;
|
||||
const countColor = this.props.promotedFilter ? classes.provided : classes.primary;
|
||||
const btnClass = this.props.promotedFilter ? classes.buttonDefault : classes.buttonProvided;
|
||||
@@ -113,12 +125,14 @@ class Offres extends React.Component {
|
||||
recordCount={this.props.recordCount}
|
||||
promoted={this.props.promotedFilter}
|
||||
loading={this.props.loading}
|
||||
type="offres"
|
||||
placeholder={"Rechercher un job"}
|
||||
/>
|
||||
<Button
|
||||
name="Rechercher un job"
|
||||
variant="outlined"
|
||||
onClick={() => this.props.togglePromotedFilterRequest()}
|
||||
onClick={() => this.voirOffre()
|
||||
}
|
||||
className={classes.button + ' ' + btnClass}>
|
||||
{this.props.promotedFilter? 'Voir les offres en cours' : 'Voir les offres pourvues'}
|
||||
</Button>
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
import React, { Component, Fragment,lazy, Suspense } from 'react';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
import Typography from '@material-ui/core/Typography'
|
||||
import LayoutBackUrl from '../components/templates/LayoutBackUrl';
|
||||
import Router from 'next/router';
|
||||
import Head from 'next/head'
|
||||
// const VideoVimeo = lazy(() => import('../components/atoms/VideoVimeo'));
|
||||
import VideoVimeo from '../components/atoms/VideoVimeo';
|
||||
import queryString from 'query-string';
|
||||
const renderLoader = () => <p>Chargement</p>;
|
||||
const styles = theme => ({
|
||||
player: {
|
||||
background:'#1E2327',
|
||||
height: '100%'
|
||||
},
|
||||
container: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
position: 'relative',
|
||||
height: '100%',
|
||||
padding: '0 10px',
|
||||
},
|
||||
bottomContainer: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
alignSelf: 'center',
|
||||
justifyContent: 'center',
|
||||
position: 'absolute',
|
||||
bottom: 0,
|
||||
},
|
||||
title: {
|
||||
fontFamily: 'Dosis',
|
||||
fontSize: '1.5em',
|
||||
fontWeight: '600',
|
||||
padding: theme.spacing(3, 0),
|
||||
},
|
||||
text: {
|
||||
fontSize: '1em',
|
||||
fontWeight: '300',
|
||||
padding: theme.spacing(1, 0),
|
||||
whiteSpace: 'pre-line',
|
||||
},
|
||||
video: {
|
||||
width:"100%",
|
||||
height:"100%",
|
||||
[theme.breakpoints.up('md')]: {
|
||||
paddingBottom: '35%', /* 16:9 */
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
class Player extends Component {
|
||||
render() {
|
||||
const { classes } = this.props
|
||||
const params = queryString.parse(location.search);
|
||||
console.log(params.id);
|
||||
console.log(params.type);
|
||||
console.log(params.videoId);
|
||||
let url = params.id;
|
||||
return (
|
||||
<LayoutBackUrl text="Player" url={url} >
|
||||
|
||||
|
||||
<VideoVimeo classes={{ video: classes.video }} videoId={params.videoId} options="" autoplay='1' />
|
||||
|
||||
</LayoutBackUrl>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Player.getInitialProps = function (context) {
|
||||
|
||||
let { id, videoId,type } = context.query;
|
||||
let {res} = context;
|
||||
return {};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
export default withStyles(styles)(Player);
|
||||
@@ -76,7 +76,7 @@ class VerifyEmail extends Component {
|
||||
N'oubliez pas de consulter vos spams, si vous ne trouvez pas le lien d'activation dans votre boite de réception.
|
||||
</Typography>
|
||||
<section className={classes.bottomContainer}>
|
||||
<Typography gutterBottom align="center" className={classes.bottomText}>
|
||||
{/* <Typography gutterBottom align="center" className={classes.bottomText}>
|
||||
Cliquez sur suivant pour continuer votre candidature
|
||||
</Typography>
|
||||
<Button
|
||||
@@ -86,7 +86,7 @@ class VerifyEmail extends Component {
|
||||
onClick={() => Router.push('/Login')}
|
||||
>
|
||||
Suivant
|
||||
</Button>
|
||||
</Button> */}
|
||||
</section>
|
||||
</div>
|
||||
</Layout>
|
||||
|
||||
@@ -32,7 +32,7 @@ class MyDocument extends Document {
|
||||
{/* PWA primary color */}
|
||||
<meta name="theme-color" content={theme.palette.primary.main} />
|
||||
|
||||
<link href="https://fonts.googleapis.com/css?family=Dosis:200,300,400,500,600,700,800|Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css?family=Dosis:600|Roboto:100,300,400,500,700,900&display=swap" rel="stylesheet">
|
||||
</link>
|
||||
|
||||
<script type="text/javascript" src="/static/js/pwaInstaller.js" ></script>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* eslint-disable jsx-a11y/anchor-is-valid */
|
||||
|
||||
import React, {Fragment} from 'react';
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
import Layout from "../components/templates/Layout"
|
||||
@@ -8,12 +8,14 @@ import { Typography } from '@material-ui/core';
|
||||
import Button from '@material-ui/core/Button';
|
||||
import Router from 'next/router'
|
||||
import { connect } from 'react-redux'
|
||||
//const fetchEmphasisJobsRequest = lazy(() => import('../actions/ads'));
|
||||
import { fetchEmphasisJobsRequest } from "../actions/ads";
|
||||
//const fetchEmphasisCompaniesRequest = lazy(() => import('../actions/companies'));
|
||||
import { fetchEmphasisCompaniesRequest } from "../actions/companies";
|
||||
import Loader from './../components/templates/loader'
|
||||
import { isEmpty } from "lodash"
|
||||
import NoResult from './../components/atoms/NoResult';
|
||||
import Head from 'next/head'
|
||||
// import Head from 'next/head'
|
||||
import dynamic from 'next/dynamic'
|
||||
import OgHead from '../components/atoms/OgHead';
|
||||
import getConfig from 'next/config'
|
||||
@@ -163,7 +165,7 @@ class Index extends React.Component {
|
||||
const imgUrl = DefaultUrl
|
||||
return (
|
||||
<Layout>
|
||||
<OgHead seo_title="Talents Tube - Plateforme de recrutement en vidéo"
|
||||
<OgHead seo_title="Espace candidat - Plateforme de recrutement en vidéo | Talents Tube"
|
||||
seo_description="Talents Tube est la première plateforme réservée aux offres d'emploi vidéo, vidéo marque employeur et aux CV vidéos. Découvrez une nouvelle méthode de recrutement."
|
||||
seo_url={socialShareUrl}
|
||||
image={imgUrl}
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
import React from 'react';
|
||||
import TextField from '@material-ui/core/TextField';
|
||||
import Autocomplete from '@material-ui/lab/Autocomplete';
|
||||
import LocationOnIcon from '@material-ui/icons/LocationOn';
|
||||
import Grid from '@material-ui/core/Grid';
|
||||
import Typography from '@material-ui/core/Typography';
|
||||
import { makeStyles } from '@material-ui/core/styles';
|
||||
import parse from 'autosuggest-highlight/parse';
|
||||
import throttle from 'lodash/throttle';
|
||||
|
||||
function loadScript(src, position, id) {
|
||||
if (!position) {
|
||||
return;
|
||||
}
|
||||
|
||||
const script = document.createElement('script');
|
||||
script.setAttribute('async', '');
|
||||
script.setAttribute('id', id);
|
||||
script.src = src;
|
||||
position.appendChild(script);
|
||||
}
|
||||
|
||||
const autocompleteService = { current: null };
|
||||
|
||||
const useStyles = makeStyles((theme) => ({
|
||||
icon: {
|
||||
color: theme.palette.text.secondary,
|
||||
marginRight: theme.spacing(2),
|
||||
},
|
||||
}));
|
||||
|
||||
export default function GoogleMaps() {
|
||||
const classes = useStyles();
|
||||
const [value, setValue] = React.useState(null);
|
||||
const [inputValue, setInputValue] = React.useState('');
|
||||
const [options, setOptions] = React.useState([]);
|
||||
const loaded = React.useRef(false);
|
||||
|
||||
if (typeof window !== 'undefined' && !loaded.current) {
|
||||
if (!document.querySelector('#google-maps')) {
|
||||
loadScript(
|
||||
'https://maps.googleapis.com/maps/api/js?key=AIzaSyDYV8IJGtIoWLfXJQQvIuDQ88n2aEuRgpg&libraries=places',
|
||||
document.querySelector('head'),
|
||||
'google-maps',
|
||||
);
|
||||
}
|
||||
|
||||
loaded.current = true;
|
||||
}
|
||||
|
||||
const fetch = React.useMemo(
|
||||
() =>
|
||||
throttle((request, callback) => {
|
||||
autocompleteService.current.getPlacePredictions(request, callback);
|
||||
|
||||
}, 200),
|
||||
[],
|
||||
);
|
||||
|
||||
React.useEffect(() => {
|
||||
let active = true;
|
||||
|
||||
if (!autocompleteService.current && window.google) {
|
||||
autocompleteService.current = new window.google.maps.places.AutocompleteService();
|
||||
// console.log('autocompleteService.current');
|
||||
// console.log(autocompleteService.current);
|
||||
}
|
||||
if (!autocompleteService.current) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (inputValue === '') {
|
||||
setOptions(value ? [value] : []);
|
||||
return undefined;
|
||||
}
|
||||
|
||||
fetch({ input: inputValue }, (results) => {
|
||||
if (active) {
|
||||
let newOptions = [];
|
||||
|
||||
if (value) {
|
||||
newOptions = [value];
|
||||
}
|
||||
|
||||
if (results) {
|
||||
newOptions = [...newOptions, ...results];
|
||||
}
|
||||
|
||||
setOptions(newOptions);
|
||||
}
|
||||
});
|
||||
|
||||
return () => {
|
||||
active = false;
|
||||
};
|
||||
}, [value, inputValue, fetch]);
|
||||
|
||||
return (
|
||||
<Autocomplete
|
||||
id="google-map-demo"
|
||||
style={{ width: 300 }}
|
||||
getOptionLabel={(option) => (typeof option === 'string' ? option : option.description)}
|
||||
filterOptions={(x) => x}
|
||||
options={options}
|
||||
autoComplete
|
||||
includeInputInList
|
||||
filterSelectedOptions
|
||||
value={value}
|
||||
onChange={(event, newValue) => {
|
||||
setOptions(newValue ? [newValue, ...options] : options);
|
||||
setValue(newValue);
|
||||
console.log("newValue");
|
||||
// console.log(newValue);
|
||||
console.log(newValue.description)
|
||||
let geocoder = new google.maps.Geocoder();
|
||||
let addresses = {};
|
||||
geocoder.geocode({ 'address': newValue.description }, function(results, status) {
|
||||
results.map((index, value) => [
|
||||
console.log(index.geometry.location.lat()+" "+index.geometry.location.lng())
|
||||
]);
|
||||
|
||||
|
||||
});
|
||||
|
||||
}}
|
||||
onInputChange={(event, newInputValue) => {
|
||||
setInputValue(newInputValue);
|
||||
console.log('newInputValue');
|
||||
console.log(newInputValue);
|
||||
}}
|
||||
renderInput={(params) => (
|
||||
<TextField {...params} label="Tapez une adresse" variant="outlined" fullWidth />
|
||||
)}
|
||||
renderOption={(option) => {
|
||||
// console.log('option');
|
||||
// console.log(option);
|
||||
const matches = option.structured_formatting.main_text_matched_substrings;
|
||||
const parts = parse(
|
||||
option.structured_formatting.main_text,
|
||||
matches.map((match) => [match.offset, match.offset + match.length]),
|
||||
);
|
||||
|
||||
return (
|
||||
<Grid container alignItems="center">
|
||||
<Grid item>
|
||||
<LocationOnIcon className={classes.icon} />
|
||||
</Grid>
|
||||
<Grid item xs>
|
||||
{parts.map((part, index) => (
|
||||
<span key={index} style={{ fontWeight: part.highlight ? 700 : 400 }}>
|
||||
{part.text}
|
||||
</span>
|
||||
))}
|
||||
|
||||
<Typography variant="body2" color="textSecondary">
|
||||
{option.structured_formatting.secondary_text}
|
||||
</Typography>
|
||||
</Grid>
|
||||
</Grid>
|
||||
);
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
// server.autosuggest.js
|
||||
import React from 'react';
|
||||
import Autosuggest from 'react-autosuggest';
|
||||
// import './autosuggest.css';
|
||||
|
||||
class ServerAutoSuggest extends React.Component {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
//Define state for value and suggestion collection
|
||||
this.state = {
|
||||
value: '',
|
||||
suggestions: []
|
||||
};
|
||||
}
|
||||
|
||||
// Filter logic
|
||||
getSuggestions = async (value) => {
|
||||
const inputValue = value.trim().toLowerCase();
|
||||
let response = await fetch("http://www.omdbapi.com/?s=" + inputValue + "&apikey=a591bb53");
|
||||
let data = await response.json()
|
||||
return data;
|
||||
};
|
||||
|
||||
// Trigger suggestions
|
||||
getSuggestionValue = suggestion => suggestion.Title;
|
||||
|
||||
// Render Each Option
|
||||
renderSuggestion = suggestion => (
|
||||
<span className="sugg-option">
|
||||
<span className="icon-wrap"><img src={suggestion.Poster} /></span>
|
||||
<span className="name">
|
||||
{suggestion.Title}
|
||||
</span>
|
||||
</span>
|
||||
);
|
||||
|
||||
// OnChange event handler
|
||||
onChange = (event, { newValue }) => {
|
||||
this.setState({
|
||||
value: newValue
|
||||
});
|
||||
};
|
||||
|
||||
// Suggestion rerender when user types
|
||||
onSuggestionsFetchRequested = ({ value }) => {
|
||||
this.getSuggestions(value)
|
||||
.then(data => {
|
||||
if (data.Error) {
|
||||
this.setState({
|
||||
suggestions: []
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
suggestions: data.Search
|
||||
});
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
// Triggered on clear
|
||||
onSuggestionsClearRequested = () => {
|
||||
this.setState({
|
||||
suggestions: []
|
||||
});
|
||||
};
|
||||
|
||||
render() {
|
||||
const { value, suggestions } = this.state;
|
||||
|
||||
// Option props
|
||||
const inputProps = {
|
||||
placeholder: 'Type movie name',
|
||||
value,
|
||||
onChange: this.onChange
|
||||
};
|
||||
|
||||
// Adding AutoSuggest component
|
||||
return (
|
||||
<Autosuggest
|
||||
suggestions={suggestions}
|
||||
onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
|
||||
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
|
||||
getSuggestionValue={this.getSuggestionValue}
|
||||
renderSuggestion={this.renderSuggestion}
|
||||
inputProps={inputProps}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default ServerAutoSuggest;
|
||||
@@ -0,0 +1,342 @@
|
||||
/* eslint-disable jsx-a11y/anchor-is-valid */
|
||||
|
||||
import React, {Fragment} from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
import Layout from "../components/templates/Layout"
|
||||
import { Typography } from '@material-ui/core';
|
||||
import Button from '@material-ui/core/Button';
|
||||
import Router from 'next/router'
|
||||
import { connect } from 'react-redux'
|
||||
import Loader from './../components/templates/loader'
|
||||
import { isEmpty } from "lodash"
|
||||
import NoResult from './../components/atoms/NoResult';
|
||||
import Head from 'next/head'
|
||||
import dynamic from 'next/dynamic'
|
||||
import OgHead from '../components/atoms/OgHead';
|
||||
import getConfig from 'next/config'
|
||||
|
||||
import Autosuggest from 'react-autosuggest';
|
||||
|
||||
// const VideoSlider = dynamic(() => import('../components/organisms/ShortVideoHooker'), {
|
||||
// ssr: false
|
||||
// });
|
||||
const HorizontalScroller = dynamic(() => import('../components/organisms/HorizontalScroller'), {
|
||||
ssr: false
|
||||
});
|
||||
|
||||
const TileCompany = dynamic(() => import('../components/organisms/TileCompany'), {
|
||||
ssr: false
|
||||
});
|
||||
|
||||
const TileOffre = dynamic(() => import('../components/organisms/TileOffre'), {
|
||||
ssr: false
|
||||
});
|
||||
|
||||
const Footer = dynamic(() => import('../components/organisms/Footer'), {
|
||||
ssr: false
|
||||
});
|
||||
const { publicRuntimeConfig } = getConfig();
|
||||
const styles = theme => ({
|
||||
root: {
|
||||
position: 'relative',
|
||||
textAlign: 'center',
|
||||
paddingTop: theme.spacing(20),
|
||||
justifyContent: 'center',
|
||||
},
|
||||
primary: {
|
||||
color: theme.palette.primary.main,
|
||||
},
|
||||
container: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
},
|
||||
scrollerSection: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
paddingBottom: theme.spacing(6),
|
||||
'&>div': {
|
||||
paddingBottom: theme.spacing(3),
|
||||
},
|
||||
[theme.breakpoints.up('md')]: {
|
||||
padding: theme.spacing(2, 10),
|
||||
paddingBottom: theme.spacing(9),
|
||||
},
|
||||
[theme.breakpoints.up('lg')]: {
|
||||
padding: theme.spacing(2, 30),
|
||||
paddingBottom: theme.spacing(9),
|
||||
},
|
||||
[theme.breakpoints.up('xl')]: {
|
||||
padding: theme.spacing(2, 55),
|
||||
},
|
||||
},
|
||||
scrollerSectionOffer: {
|
||||
backgroundColor: theme.palette.secondary.main,
|
||||
},
|
||||
scrollerSectionCompany: {
|
||||
backgroundColor: theme.palette.background.grey,
|
||||
},
|
||||
card: {
|
||||
margin: theme.spacing(1),
|
||||
width: '96%',
|
||||
height: '100%',
|
||||
maxWidth: '640px',
|
||||
maxheight: '360px',
|
||||
|
||||
},
|
||||
HorizontalScroller: {
|
||||
marginTop: theme.spacing(1),
|
||||
marginBottom: theme.spacing(4),
|
||||
},
|
||||
paper: {
|
||||
margin: theme.spacing(1),
|
||||
width: '96%',
|
||||
height: '100%',
|
||||
},
|
||||
media: {
|
||||
},
|
||||
svg: {
|
||||
width: 100,
|
||||
height: 100,
|
||||
},
|
||||
polygon: {
|
||||
fill: theme.palette.common.white,
|
||||
stroke: theme.palette.divider,
|
||||
strokeWidth: 4,
|
||||
},
|
||||
img: {
|
||||
maxWidth: '100%',
|
||||
|
||||
},
|
||||
titleContainer: {
|
||||
marginTop: theme.spacing(4),
|
||||
marginBottom: theme.spacing(3),
|
||||
},
|
||||
beforeTitle: {
|
||||
fontSize: '0.8em',
|
||||
fontWeight: '300',
|
||||
textAlign: 'center',
|
||||
textTransform: 'uppercase',
|
||||
color: theme.palette.secondary.text,
|
||||
},
|
||||
title: {
|
||||
fontFamily: 'Dosis',
|
||||
fontSize: '1.5em',
|
||||
fontWeight: '600',
|
||||
textAlign: 'center',
|
||||
},
|
||||
white: {
|
||||
color: theme.palette.common.white
|
||||
},
|
||||
button: {
|
||||
textTransform: 'inherit',
|
||||
margin: theme.spacing(0, 8),
|
||||
padding: theme.spacing(1.2, 2),
|
||||
[theme.breakpoints.up('sm')]: {
|
||||
margin: 'auto',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
class Index extends React.Component {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
//Define state for value and suggestion collection
|
||||
this.state = {
|
||||
value: '',
|
||||
suggestions: [],
|
||||
valueMetier: '',
|
||||
suggestionsMetier: [],
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
localStorage.setItem("loginRedirect", "/")
|
||||
|
||||
}
|
||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
||||
this.setState({
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
// Filter logic
|
||||
getSuggestions = async (value) => {
|
||||
const inputValue = value.trim().toLowerCase();
|
||||
let response = await fetch(publicRuntimeConfig.symphonyUrl+"/api/getCompetences?q=" + inputValue );
|
||||
// let response = await fetch("http://www.omdbapi.com/?s=" + inputValue + "&apikey=a591bb53");
|
||||
let data = await response.json()
|
||||
return data;
|
||||
};
|
||||
|
||||
// Trigger suggestions
|
||||
getSuggestionValue = suggestion => suggestion.libelle;
|
||||
// Render Each Option
|
||||
renderSuggestion = suggestion => (
|
||||
<span className="sugg-option">
|
||||
|
||||
<span className="name">
|
||||
{suggestion.libelle} ({suggestion.code})
|
||||
</span>
|
||||
</span>
|
||||
);
|
||||
|
||||
// OnChange event handler
|
||||
onChange = (event, { newValue }) => {
|
||||
this.setState({
|
||||
value: newValue
|
||||
});
|
||||
};
|
||||
|
||||
// Suggestion rerender when user types
|
||||
onSuggestionsFetchRequested = ({ value }) => {
|
||||
this.getSuggestions(value)
|
||||
.then(data => {
|
||||
if (data.Error) {
|
||||
this.setState({
|
||||
suggestions: []
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
suggestions: data
|
||||
});
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
// Triggered on clear
|
||||
onSuggestionsClearRequested = () => {
|
||||
this.setState({
|
||||
suggestions: []
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// METIER
|
||||
// Filter logic
|
||||
getSuggestionsMetier = async (valueMetier) => {
|
||||
const inputValue = valueMetier.trim().toLowerCase();
|
||||
let response = await fetch(publicRuntimeConfig.symphonyUrl+"api/getAppelationsLibelle?q=" + inputValue );
|
||||
// let response = await fetch("http://www.omdbapi.com/?s=" + inputValue + "&apikey=a591bb53");
|
||||
let data = await response.json()
|
||||
return data;
|
||||
};
|
||||
|
||||
// Trigger suggestions
|
||||
getSuggestionMetierValue = suggestion => suggestion.libelle;
|
||||
// Render Each Option
|
||||
renderSuggestionMetier = suggestion => (
|
||||
<span className="sugg-option">
|
||||
|
||||
<span className="name">
|
||||
{suggestion.libelle} ({suggestion.code})
|
||||
</span>
|
||||
</span>
|
||||
);
|
||||
|
||||
// OnChange event handler
|
||||
onChangeMetier = (event, { newValue }) => {
|
||||
this.setState({
|
||||
valueMetier: newValue
|
||||
});
|
||||
};
|
||||
|
||||
// Suggestion rerender when user types
|
||||
onSuggestionsMetierFetchRequested = ({ value }) => {
|
||||
this.getSuggestionsMetier(value)
|
||||
.then(data => {
|
||||
if (data.Error) {
|
||||
this.setState({
|
||||
suggestionsMetier: []
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
suggestionsMetier: data
|
||||
});
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
// Triggered on clear
|
||||
onSuggestionsMetierClearRequested = () => {
|
||||
this.setState({
|
||||
suggestionsMetier: []
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
render() {
|
||||
const { classes } = this.props;
|
||||
const { value, suggestions, valueMetier, suggestionsMetier } = this.state;
|
||||
// Option props
|
||||
const inputProps = {
|
||||
placeholder: 'Saisir une compétence',
|
||||
value,
|
||||
onChange: this.onChange
|
||||
};
|
||||
|
||||
const inputPropsMetier = {
|
||||
placeholder: 'Saisir un métier',
|
||||
value:valueMetier,
|
||||
onChange: this.onChangeMetier
|
||||
};
|
||||
const socialShareUrl = typeof window !== 'undefined' ? window.location
|
||||
: publicRuntimeConfig.frontServerUrl ;
|
||||
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg"
|
||||
const imgUrl = DefaultUrl
|
||||
return (
|
||||
<Layout>
|
||||
<OgHead seo_title="Talents Tube - Plateforme de recrutement en vidéo"
|
||||
seo_description="Talents Tube est la première plateforme réservée aux offres d'emploi vidéo, vidéo marque employeur et aux CV vidéos. Découvrez une nouvelle méthode de recrutement."
|
||||
seo_url={socialShareUrl}
|
||||
image={imgUrl}
|
||||
seo_key="Recrutement, video"
|
||||
|
||||
></OgHead>
|
||||
<div className={classes.container}>
|
||||
|
||||
{/* <VideoSlider /> */}
|
||||
|
||||
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionOffer}>
|
||||
|
||||
|
||||
|
||||
<Autosuggest
|
||||
suggestions={suggestions}
|
||||
onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
|
||||
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
|
||||
getSuggestionValue={this.getSuggestionValue}
|
||||
renderSuggestion={this.renderSuggestion}
|
||||
inputProps={inputProps}
|
||||
/>
|
||||
<Autosuggest
|
||||
suggestions={suggestionsMetier}
|
||||
onSuggestionsFetchRequested={this.onSuggestionsMetierFetchRequested}
|
||||
onSuggestionsClearRequested={this.onSuggestionsMetierClearRequested}
|
||||
getSuggestionValue={this.getSuggestionMetierValue}
|
||||
renderSuggestion={this.renderSuggestionMetier}
|
||||
inputProps={inputPropsMetier}
|
||||
/>
|
||||
</section>
|
||||
|
||||
|
||||
<Footer />
|
||||
</div>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function mapStateToProps(state) {
|
||||
return {
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
Index.propTypes = {
|
||||
classes: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
export default (connect(mapStateToProps, { })(withStyles(styles)(Index)));
|
||||
@@ -163,6 +163,12 @@ app.prepare()
|
||||
app.render(req, res, actualPage, queryParams)
|
||||
})
|
||||
|
||||
server.get('/Player', (req, res) => {
|
||||
const actualPage = '/Player'
|
||||
const queryParams = { id: req.query.id, videoId:req.query.videoId, type:req.query.type }
|
||||
app.render(req, res, actualPage, queryParams)
|
||||
})
|
||||
|
||||
server.get('/VerifyEmail/:email', (req, res) => {
|
||||
const actualPage = '/VerifyEmail'
|
||||
const queryParams = { email: req.params.email }
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import AppBar from '@material-ui/core/AppBar';
|
||||
import Toolbar from '@material-ui/core/Toolbar';
|
||||
import IconButton from '@material-ui/core/IconButton';
|
||||
import Typography from '@material-ui/core/Typography';
|
||||
import { withStyles, getMuiTheme } from '@material-ui/core/styles';
|
||||
import MenuIcon from '@material-ui/icons/Menu';
|
||||
import Link from 'next/link'
|
||||
import Drawer from '@material-ui/core/Drawer';
|
||||
import ListItemIcon from '@material-ui/core/ListItemIcon';
|
||||
import Divider from '@material-ui/core/Divider';
|
||||
import SendIcon from '@material-ui/icons/Send';
|
||||
import CodeIcon from '@material-ui/icons/Code';
|
||||
import HomeIcon from '@material-ui/icons/Home';
|
||||
import FingerprintIcon from '@material-ui/icons/Fingerprint';
|
||||
import LocalBarIcon from '@material-ui/icons/LocalBar';
|
||||
|
||||
import List from '@material-ui/core/List';
|
||||
import ListItem from '@material-ui/core/ListItem';
|
||||
import { ListItemText } from '@material-ui/core';
|
||||
|
||||
import { Spring, animated } from 'react-spring'
|
||||
|
||||
const styles = theme => ({
|
||||
root: {
|
||||
width: '100%',
|
||||
'& a':{
|
||||
textDecoration:'none'
|
||||
}
|
||||
},
|
||||
|
||||
grow: {
|
||||
flexGrow: 1,
|
||||
},
|
||||
bar: {
|
||||
},
|
||||
menuButton: {
|
||||
marginLeft: -12,
|
||||
marginRight: 20,
|
||||
[theme.breakpoints.up('sm')]: {
|
||||
display: 'none',
|
||||
},
|
||||
[theme.breakpoints.down('md')]: {
|
||||
display: 'block',
|
||||
},
|
||||
},
|
||||
menuLogo: {
|
||||
marginLeft: 20,
|
||||
marginRight: 40,
|
||||
cursor: 'pointer'
|
||||
},
|
||||
title: {
|
||||
display: 'none',
|
||||
[theme.breakpoints.up('sm')]: {
|
||||
display: 'block',
|
||||
},
|
||||
[theme.breakpoints.down('md')]: {
|
||||
display: 'none',
|
||||
},
|
||||
marginRight: 15,
|
||||
cursor: 'pointer'
|
||||
},
|
||||
sectionDesktop: {
|
||||
display: 'none',
|
||||
[theme.breakpoints.up('md')]: {
|
||||
display: 'flex',
|
||||
},
|
||||
},
|
||||
sectionMobile: {
|
||||
display: 'flex',
|
||||
[theme.breakpoints.up('md')]: {
|
||||
display: 'none',
|
||||
},
|
||||
},
|
||||
fullList: {
|
||||
width: 'auto',
|
||||
cursor: 'pointer'
|
||||
},
|
||||
});
|
||||
|
||||
class HeaderOffre extends React.Component {
|
||||
state = {
|
||||
top: false,
|
||||
left: false,
|
||||
bottom: false,
|
||||
right: false,
|
||||
toggle: true
|
||||
};
|
||||
|
||||
toggleDrawer = (side, open) => () => {
|
||||
this.setState({
|
||||
[side]: open,
|
||||
});
|
||||
};
|
||||
|
||||
toggle = () => this.setState(state => ({ toggle: !state.toggle }))
|
||||
|
||||
render() {
|
||||
const { classes } = this.props;
|
||||
return (
|
||||
<div className={classes.root}>
|
||||
<Drawer anchor="top" open={this.state.top} onClose={this.toggleDrawer('top', false)}>
|
||||
<div
|
||||
tabIndex={0}
|
||||
role="button"
|
||||
onClick={this.toggleDrawer('top', false)}
|
||||
onKeyDown={this.toggleDrawer('top', false)}
|
||||
>
|
||||
<div className={classes.fullList}>
|
||||
<List>
|
||||
<Link href="/" prefetch >
|
||||
<a><ListItem>
|
||||
<ListItemIcon>
|
||||
<HomeIcon />
|
||||
</ListItemIcon>
|
||||
<ListItemText primary='Accueil'>
|
||||
</ListItemText>
|
||||
</ListItem></a>
|
||||
</Link>
|
||||
<Divider />
|
||||
<Link href="/contact" prefetch >
|
||||
<a><ListItem>
|
||||
<ListItemIcon>
|
||||
<SendIcon />
|
||||
</ListItemIcon>
|
||||
<ListItemText primary='contact'>
|
||||
</ListItemText>
|
||||
</ListItem></a>
|
||||
</Link>
|
||||
</List>
|
||||
</div>
|
||||
</div>
|
||||
</Drawer>
|
||||
<AppBar position="static" className={classes.appBar}>
|
||||
<Toolbar>
|
||||
<IconButton className={classes.menuButton} onClick={this.toggleDrawer('top', true)}
|
||||
color="inherit" aria-label="Open drawer">
|
||||
<MenuIcon />
|
||||
</IconButton>
|
||||
|
||||
<Link href="/" prefetch>
|
||||
<a><div onClick={this.toggle}>
|
||||
<Spring native from={{ x: 0 }} to={{ x: this.state.toggle ? 1 : 0 }} config={{ duration: 1000 }}>
|
||||
{({ x }) => (
|
||||
<animated.div
|
||||
style={{
|
||||
opacity: x.interpolate({ output: [1, 1] }),
|
||||
transform: x
|
||||
.interpolate({
|
||||
range: [0, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 1],
|
||||
output: [1, 0.97, 0.9, 1.1, 0.9, 1.1, 1.03, 1]
|
||||
})
|
||||
.interpolate(x => `scale(${x})`)
|
||||
}}>
|
||||
<img alt="e-declic" src='https://www.e-declic.com/files/e-declic/img/logo.png' className={classes.menuLogo} />
|
||||
</animated.div>
|
||||
)}
|
||||
</Spring>
|
||||
</div></a>
|
||||
</Link>
|
||||
|
||||
<Link href="/contact" prefetch >
|
||||
<a><Typography className={classes.title} variant="h5" color="inherit" noWrap>
|
||||
Contact
|
||||
</Typography></a>
|
||||
</Link>
|
||||
</Toolbar>
|
||||
</AppBar>
|
||||
</div >
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
HeaderOffre.propTypes = {
|
||||
classes: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
|
||||
export default withStyles(styles)(HeaderOffre)
|
||||
Reference in New Issue
Block a user