Feature(react): Move settings to React
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
import { modernChallenges, map, challenges } from './challenges';
|
import { modernChallenges, map, challenges } from './challenges';
|
||||||
import NotFound from '../components/NotFound/index.jsx';
|
import NotFound from '../components/NotFound/index.jsx';
|
||||||
import { addLang } from '../utils/lang';
|
import { addLang } from '../utils/lang';
|
||||||
|
import settings from './settings';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
path: '/:lang',
|
path: '/:lang',
|
||||||
@ -15,6 +16,7 @@ export default {
|
|||||||
challenges,
|
challenges,
|
||||||
modernChallenges,
|
modernChallenges,
|
||||||
map,
|
map,
|
||||||
|
settings,
|
||||||
{
|
{
|
||||||
path: '*',
|
path: '*',
|
||||||
component: NotFound
|
component: NotFound
|
||||||
|
61
common/app/routes/settings/components/Delete-Modal.jsx
Normal file
61
common/app/routes/settings/components/Delete-Modal.jsx
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import React, { PropTypes } from 'react';
|
||||||
|
import { Modal, Button } from 'react-bootstrap';
|
||||||
|
|
||||||
|
export default function DeleteModal({ isOpen }) {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='danger'
|
||||||
|
className='btn-link-social'
|
||||||
|
>
|
||||||
|
Delete my Free Code Camp account
|
||||||
|
</Button>
|
||||||
|
<Modal
|
||||||
|
backdrop={ true }
|
||||||
|
show={ isOpen }
|
||||||
|
>
|
||||||
|
<Modal.Header>
|
||||||
|
<h3>You don't really want to delete your account, do you?</h3>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<p>
|
||||||
|
This will really delete all your data, including
|
||||||
|
all your progress and brownie points.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We won't be able to recover any of it for you later,
|
||||||
|
even if you change your mind.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If there's something we could do better, send
|
||||||
|
us an email instead and we'll do our best:  
|
||||||
|
<a href='mailto:team@freecodecamp.com'>
|
||||||
|
team@freecodecamp.com
|
||||||
|
</a>.
|
||||||
|
</p>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsStyle='success'
|
||||||
|
>
|
||||||
|
Nevermind, I don't want to delete all of my progress
|
||||||
|
</Button>
|
||||||
|
<div className='spacer' />
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsStyle='danger'
|
||||||
|
>
|
||||||
|
I am 100% sure I want to delete my account and all of my progress
|
||||||
|
</Button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeleteModal.propTypes = {
|
||||||
|
isOpen: PropTypes.bool
|
||||||
|
};
|
122
common/app/routes/settings/components/Email-Setting.jsx
Normal file
122
common/app/routes/settings/components/Email-Setting.jsx
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
import React, { PropTypes } from 'react';
|
||||||
|
import { Button, Row, Col } from 'react-bootstrap';
|
||||||
|
import FA from 'react-fontawesome';
|
||||||
|
import classnames from 'classnames';
|
||||||
|
|
||||||
|
export function UpdateEmailButton() {
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className='btn-link-social'
|
||||||
|
>
|
||||||
|
<FA name='envelope' />
|
||||||
|
Update my Email
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function EmailSettings({
|
||||||
|
email,
|
||||||
|
sendMonthlyEmail,
|
||||||
|
sendNotificationEmail,
|
||||||
|
sendQuincyEmail
|
||||||
|
}) {
|
||||||
|
if (!email) {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Row>
|
||||||
|
<p className='large-p text-center'>
|
||||||
|
You don't have an email id associated to this account.
|
||||||
|
</p>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<UpdateEmailButton />
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Row>
|
||||||
|
<p className='large-p text-center'>
|
||||||
|
<em>{ email }</em>
|
||||||
|
</p>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<UpdateEmailButton />
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Col xs={ 9 }>
|
||||||
|
<p className='large-p'>
|
||||||
|
Send me announcement emails
|
||||||
|
<br />
|
||||||
|
(we'll send you these every Thursday)
|
||||||
|
</p>
|
||||||
|
</Col>
|
||||||
|
<Col xs={ 3 }>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className={
|
||||||
|
classnames('positive-20', { active: sendMonthlyEmail })
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{ sendMonthlyEmail ? 'On' : 'Off' }
|
||||||
|
</Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Col xs={ 9 }>
|
||||||
|
<p className='large-p'>
|
||||||
|
Send me notification emails
|
||||||
|
<br />
|
||||||
|
(these will pertain to your account)
|
||||||
|
</p>
|
||||||
|
</Col>
|
||||||
|
<Col xs={ 3 }>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className={
|
||||||
|
classnames('positive-20', { active: sendNotificationEmail })
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{ sendNotificationEmail ? 'On' : 'Off' }
|
||||||
|
</Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Col xs={ 9 }>
|
||||||
|
<p className='large-p'>
|
||||||
|
Send me Quincy's weekly email
|
||||||
|
<br />
|
||||||
|
(with new articles every Tuesday)
|
||||||
|
</p>
|
||||||
|
</Col>
|
||||||
|
<Col xs={ 3 }>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className={
|
||||||
|
classnames('positive-20', { active: sendQuincyEmail })
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{ sendQuincyEmail ? 'On' : 'Off' }
|
||||||
|
</Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
EmailSettings.propTypes = {
|
||||||
|
email: PropTypes.string,
|
||||||
|
sendMonthlyEmail: PropTypes.bool,
|
||||||
|
sendNotificationEmail: PropTypes.bool,
|
||||||
|
sendQuincyEmail: PropTypes.bool
|
||||||
|
};
|
49
common/app/routes/settings/components/Language-Settings.jsx
Normal file
49
common/app/routes/settings/components/Language-Settings.jsx
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import React, { PropTypes } from 'react';
|
||||||
|
import { FormControl } from 'react-bootstrap';
|
||||||
|
import langs from '../../../../utils/supported-languages';
|
||||||
|
|
||||||
|
const langOptions = [
|
||||||
|
...Object.keys(langs).map(tag => {
|
||||||
|
return (
|
||||||
|
<option
|
||||||
|
key={ tag }
|
||||||
|
value={ tag }
|
||||||
|
>
|
||||||
|
{ langs[tag] }
|
||||||
|
</option>
|
||||||
|
);
|
||||||
|
}), (
|
||||||
|
<option
|
||||||
|
disabled={ true }
|
||||||
|
key='more'
|
||||||
|
>
|
||||||
|
More to come...
|
||||||
|
</option>
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function LangaugeSettings({ userLang }) {
|
||||||
|
const options = [(
|
||||||
|
<option
|
||||||
|
disabled={ true }
|
||||||
|
key='default'
|
||||||
|
selected={ userLang ? false : true }
|
||||||
|
>
|
||||||
|
Prefered Langauge
|
||||||
|
</option>
|
||||||
|
),
|
||||||
|
...langOptions
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<FormControl
|
||||||
|
className='btn btn-block btn-primary btn-link-social'
|
||||||
|
componentClass='select'
|
||||||
|
>
|
||||||
|
{ options }
|
||||||
|
</FormControl>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
LangaugeSettings.propTypes = {
|
||||||
|
userLang: PropTypes.string
|
||||||
|
};
|
35
common/app/routes/settings/components/Locked-Settings.jsx
Normal file
35
common/app/routes/settings/components/Locked-Settings.jsx
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import React, { PropTypes } from 'react';
|
||||||
|
import { Button, Row, Col } from 'react-bootstrap';
|
||||||
|
import classnames from 'classnames';
|
||||||
|
|
||||||
|
export default function LockSettings({ isLocked }) {
|
||||||
|
const className = classnames({
|
||||||
|
'positive-20': true,
|
||||||
|
active: isLocked
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<Row>
|
||||||
|
<Col xs={ 9 }>
|
||||||
|
<p className='large-p'>
|
||||||
|
Make all of my solutions private
|
||||||
|
<br />
|
||||||
|
(this disables your certificates)
|
||||||
|
</p>
|
||||||
|
</Col>
|
||||||
|
<Col xs={ 3 }>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className={ className }
|
||||||
|
>
|
||||||
|
{ isLocked ? 'On' : 'Off' }
|
||||||
|
</Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
LockSettings.propTypes = {
|
||||||
|
isLocked: PropTypes.bool
|
||||||
|
};
|
135
common/app/routes/settings/components/Settings.jsx
Normal file
135
common/app/routes/settings/components/Settings.jsx
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
import React, { PropTypes } from 'react';
|
||||||
|
import { Button, Row, Col } from 'react-bootstrap';
|
||||||
|
|
||||||
|
import LockedSettings from './Locked-Settings.jsx';
|
||||||
|
import SocialSettings from './Social-Settings.jsx';
|
||||||
|
import EmailSettings from './Email-Setting.jsx';
|
||||||
|
import LangaugeSettings from './Language-Settings.jsx';
|
||||||
|
import DeleteModal from './Delete-Modal.jsx';
|
||||||
|
|
||||||
|
export default class Settings extends React.Component {
|
||||||
|
static displayName = 'Settings';
|
||||||
|
static propTypes = {
|
||||||
|
isLocked: PropTypes.bool,
|
||||||
|
isGithubCool: PropTypes.bool,
|
||||||
|
isTwitter: PropTypes.bool,
|
||||||
|
isLinkedIn: PropTypes.bool,
|
||||||
|
email: PropTypes.string,
|
||||||
|
sendMonthlyEmail: PropTypes.bool,
|
||||||
|
sendNotificationEmail: PropTypes.bool,
|
||||||
|
sendQuincyEmail: PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
isLocked,
|
||||||
|
isGithubCool,
|
||||||
|
isTwitter,
|
||||||
|
isLinkedIn,
|
||||||
|
email,
|
||||||
|
sendMonthlyEmail,
|
||||||
|
sendNotificationEmail,
|
||||||
|
sendQuincyEmail
|
||||||
|
} = this.props;
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1 className='text-center'>Settings for your Account</h1>
|
||||||
|
<h2 className='text-center'>Actions</h2>
|
||||||
|
<Row>
|
||||||
|
<Col xs={ 12 }>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className='btn-link-social'
|
||||||
|
>
|
||||||
|
NightMode
|
||||||
|
</Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Col xs={ 12 }>
|
||||||
|
<SocialSettings
|
||||||
|
isGithubCool={ isGithubCool }
|
||||||
|
isLinkedIn={ isLinkedIn }
|
||||||
|
isTwitter={ isTwitter }
|
||||||
|
/>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<div className='spacer' />
|
||||||
|
<h2 className='text-center'>Account Settings</h2>
|
||||||
|
<Row>
|
||||||
|
<Col xs={ 12 }>
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className='btn-link-social'
|
||||||
|
href='/commit'
|
||||||
|
>
|
||||||
|
Edit my pledge
|
||||||
|
</Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<div className='spacer' />
|
||||||
|
<h2 className='text-center'>Privacy Settings</h2>
|
||||||
|
<Row>
|
||||||
|
<Col
|
||||||
|
md={ 6 }
|
||||||
|
mdOffset={ 3 }
|
||||||
|
sm={ 8 }
|
||||||
|
smOffset={ 2 }
|
||||||
|
xs={ 12 }
|
||||||
|
>
|
||||||
|
<LockedSettings isLocked={ isLocked } />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<div className='spacer' />
|
||||||
|
<h2 className='text-center'>Email Settings</h2>
|
||||||
|
<Row>
|
||||||
|
<Col
|
||||||
|
md={ 6 }
|
||||||
|
mdOffset={ 3 }
|
||||||
|
sm={ 8 }
|
||||||
|
smOffset={ 2 }
|
||||||
|
xs={ 12 }
|
||||||
|
>
|
||||||
|
<EmailSettings
|
||||||
|
email={ email }
|
||||||
|
sendMonthlyEmail={ sendMonthlyEmail }
|
||||||
|
sendNotificationEmail={ sendNotificationEmail }
|
||||||
|
sendQuincyEmail={ sendQuincyEmail }
|
||||||
|
/>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<div className='spacer' />
|
||||||
|
<h2 className='text-center'>Language Settigns</h2>
|
||||||
|
<Row>
|
||||||
|
<Col
|
||||||
|
md={ 6 }
|
||||||
|
mdOffset={ 3 }
|
||||||
|
sm={ 8 }
|
||||||
|
smOffset={ 2 }
|
||||||
|
xs={ 12 }
|
||||||
|
>
|
||||||
|
<LangaugeSettings />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<div className='spacer' />
|
||||||
|
<h2 className='text-center'>Danger Zone</h2>
|
||||||
|
<Row>
|
||||||
|
<Col
|
||||||
|
md={ 6 }
|
||||||
|
mdOffset={ 3 }
|
||||||
|
sm={ 8 }
|
||||||
|
smOffset={ 2 }
|
||||||
|
xs={ 12 }
|
||||||
|
>
|
||||||
|
<DeleteModal />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
60
common/app/routes/settings/components/Social-Settings.jsx
Normal file
60
common/app/routes/settings/components/Social-Settings.jsx
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import React, { PropTypes } from 'react';
|
||||||
|
import { Button } from 'react-bootstrap';
|
||||||
|
import FA from 'react-fontawesome';
|
||||||
|
|
||||||
|
export default function SocialSettings({
|
||||||
|
isGithubCool,
|
||||||
|
isTwitter,
|
||||||
|
isLinkedIn
|
||||||
|
}) {
|
||||||
|
const githubCopy = isGithubCool ?
|
||||||
|
'Update my portfolio from GitHub' :
|
||||||
|
'Link my GitHub to unlock my portfolio';
|
||||||
|
const buttons = [
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
className='btn-link-social btn-github'
|
||||||
|
href='/link/github'
|
||||||
|
key='github'
|
||||||
|
>
|
||||||
|
<FA name='github' />
|
||||||
|
{ githubCopy }
|
||||||
|
</Button>
|
||||||
|
];
|
||||||
|
if (isGithubCool && !isTwitter) {
|
||||||
|
buttons.push((
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
className='btn-link-social btn-twitter'
|
||||||
|
href='/link/twitter'
|
||||||
|
key='twitter'
|
||||||
|
>
|
||||||
|
<FA name='twitter' />
|
||||||
|
Add my LinkedIn to my portfolio
|
||||||
|
</Button>
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if (isGithubCool && !isLinkedIn) {
|
||||||
|
buttons.push((
|
||||||
|
<Button
|
||||||
|
block={ true }
|
||||||
|
bsSize='lg'
|
||||||
|
className='btn-link-social btn-linkedin'
|
||||||
|
href='/link/linkedin'
|
||||||
|
key='linkedin'
|
||||||
|
>
|
||||||
|
<FA name='linked' />
|
||||||
|
Add my LinkedIn to my portfolio
|
||||||
|
</Button>
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return (<div>{ buttons }</div>);
|
||||||
|
}
|
||||||
|
|
||||||
|
SocialSettings.propTypes = {
|
||||||
|
isGithubCool: PropTypes.bool,
|
||||||
|
isTwitter: PropTypes.bool,
|
||||||
|
isLinkedIn: PropTypes.bool
|
||||||
|
};
|
6
common/app/routes/settings/index.js
Normal file
6
common/app/routes/settings/index.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import Settings from './components/Settings.jsx';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
path: 'settings',
|
||||||
|
component: Settings
|
||||||
|
};
|
3
server/boot/react.js
vendored
3
server/boot/react.js
vendored
@ -14,7 +14,8 @@ const log = debug('fcc:react-server');
|
|||||||
const routes = [
|
const routes = [
|
||||||
'/challenges',
|
'/challenges',
|
||||||
'/challenges/*',
|
'/challenges/*',
|
||||||
'/map'
|
'/map',
|
||||||
|
'/settings'
|
||||||
];
|
];
|
||||||
|
|
||||||
const devRoutes = [];
|
const devRoutes = [];
|
||||||
|
@ -14,8 +14,7 @@ import certTypes from '../utils/certTypes.json';
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
ifNoUser401,
|
ifNoUser401,
|
||||||
ifNoUserRedirectTo,
|
ifNoUserRedirectTo
|
||||||
flashIfNotVerified
|
|
||||||
} from '../utils/middleware';
|
} from '../utils/middleware';
|
||||||
import { observeQuery } from '../utils/rx';
|
import { observeQuery } from '../utils/rx';
|
||||||
import {
|
import {
|
||||||
@ -186,12 +185,6 @@ module.exports = function(app) {
|
|||||||
sendNonUserToMap,
|
sendNonUserToMap,
|
||||||
getAccount
|
getAccount
|
||||||
);
|
);
|
||||||
router.get(
|
|
||||||
'/settings',
|
|
||||||
sendNonUserToMap,
|
|
||||||
flashIfNotVerified,
|
|
||||||
getSettings
|
|
||||||
);
|
|
||||||
|
|
||||||
// Ensure these are the last routes!
|
// Ensure these are the last routes!
|
||||||
api.get(
|
api.get(
|
||||||
@ -217,7 +210,7 @@ module.exports = function(app) {
|
|||||||
router.get('/:username', returnUser);
|
router.get('/:username', returnUser);
|
||||||
|
|
||||||
app.use('/:lang', router);
|
app.use('/:lang', router);
|
||||||
app.use(router);
|
app.use(api);
|
||||||
|
|
||||||
function getSignin(req, res) {
|
function getSignin(req, res) {
|
||||||
if (req.user) {
|
if (req.user) {
|
||||||
@ -275,12 +268,6 @@ module.exports = function(app) {
|
|||||||
return res.redirect('/' + username);
|
return res.redirect('/' + username);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSettings(req, res) {
|
|
||||||
res.render('account/settings', {
|
|
||||||
title: 'Settings'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function returnUser(req, res, next) {
|
function returnUser(req, res, next) {
|
||||||
const username = req.params.username.toLowerCase();
|
const username = req.params.username.toLowerCase();
|
||||||
const { user } = req;
|
const { user } = req;
|
||||||
@ -579,34 +566,4 @@ module.exports = function(app) {
|
|||||||
return res.render('account/forgot');
|
return res.render('account/forgot');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// function vote1(req, res, next) {
|
|
||||||
// if (req.user) {
|
|
||||||
// req.user.tshirtVote = 1;
|
|
||||||
// req.user.save(function(err) {
|
|
||||||
// if (err) { return next(err); }
|
|
||||||
//
|
|
||||||
// req.flash('success', { msg: 'Thanks for voting!' });
|
|
||||||
// return res.redirect('/map');
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// req.flash('error', { msg: 'You must be signed in to vote.' });
|
|
||||||
// res.redirect('/map');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// function vote2(req, res, next) {
|
|
||||||
// if (req.user) {
|
|
||||||
// req.user.tshirtVote = 2;
|
|
||||||
// req.user.save(function(err) {
|
|
||||||
// if (err) { return next(err); }
|
|
||||||
//
|
|
||||||
// req.flash('success', { msg: 'Thanks for voting!' });
|
|
||||||
// return res.redirect('/map');
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// req.flash('error', {msg: 'You must be signed in to vote.'});
|
|
||||||
// res.redirect('/map');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
};
|
};
|
||||||
|
@ -1,142 +0,0 @@
|
|||||||
extends ../layout
|
|
||||||
block content
|
|
||||||
h1.text-center Settings for your Account
|
|
||||||
hr
|
|
||||||
h2.text-center Actions
|
|
||||||
.row
|
|
||||||
.col-xs-12
|
|
||||||
a#night-mode.btn.btn-lg.btn-block.btn-primary.btn-link-social Night Mode
|
|
||||||
.row
|
|
||||||
.col-xs-12
|
|
||||||
if (!user.isGithubCool)
|
|
||||||
a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')
|
|
||||||
i.fa.fa-github
|
|
||||||
| Link my GitHub to unlock my portfolio
|
|
||||||
else
|
|
||||||
a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')
|
|
||||||
i.fa.fa-github
|
|
||||||
| Update my portfolio from GitHub
|
|
||||||
if (!user.twitter)
|
|
||||||
a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/link/twitter')
|
|
||||||
i.fa.fa-twitter
|
|
||||||
| Add my Twitter to my portfolio
|
|
||||||
if (!user.linkedin)
|
|
||||||
a.btn.btn-lg.btn-block.btn-linkedin.btn-link-social(href='/link/linkedin')
|
|
||||||
i.fa.fa-linkedin
|
|
||||||
| Add my LinkedIn to my portfolio
|
|
||||||
.spacer
|
|
||||||
h2.text-center Account Settings
|
|
||||||
.row
|
|
||||||
.col-xs-12
|
|
||||||
a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/commit')
|
|
||||||
| Edit my pledge
|
|
||||||
.spacer
|
|
||||||
h2.text-center Privacy Settings
|
|
||||||
.row
|
|
||||||
.col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3
|
|
||||||
.row
|
|
||||||
.col-xs-9
|
|
||||||
p.large-p Make all of my solutions private
|
|
||||||
br
|
|
||||||
| (this disables your certificates)
|
|
||||||
if (user.isLocked)
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-lockdown-mode') On
|
|
||||||
else
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-lockdown-mode') Off
|
|
||||||
|
|
||||||
.spacer
|
|
||||||
h2.text-center Email settings
|
|
||||||
if(user.email)
|
|
||||||
.row
|
|
||||||
.col-xs-12
|
|
||||||
p.large-p.text-center
|
|
||||||
em #{user.email}
|
|
||||||
.col-xs-12
|
|
||||||
a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/update-email')
|
|
||||||
i.fa.fa-envelope
|
|
||||||
| Update my Email
|
|
||||||
.row
|
|
||||||
.col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3
|
|
||||||
.row
|
|
||||||
.col-xs-9
|
|
||||||
p.large-p Send me announcement emails
|
|
||||||
br
|
|
||||||
| (we'll send you these every Thursday)
|
|
||||||
if (user.sendMonthlyEmail)
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-announcement-email-mode') On
|
|
||||||
else
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-announcement-email-mode') Off
|
|
||||||
|
|
||||||
.row
|
|
||||||
.col-xs-9
|
|
||||||
p.large-p Send me notification emails
|
|
||||||
br
|
|
||||||
| (these will pertain to your account)
|
|
||||||
if (user.sendNotificationEmail)
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-notification-email-mode') On
|
|
||||||
else
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-notification-email-mode') Off
|
|
||||||
|
|
||||||
.row
|
|
||||||
.col-xs-9
|
|
||||||
p.large-p Send me Quincy's weekly email
|
|
||||||
br
|
|
||||||
| (with new articles every Tuesday)
|
|
||||||
if (user.sendQuincyEmail)
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-quincy-email-mode') On
|
|
||||||
else
|
|
||||||
.col-xs-3
|
|
||||||
a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-quincy-email-mode') Off
|
|
||||||
else
|
|
||||||
.row
|
|
||||||
.col-xs-12
|
|
||||||
p.large-p.text-center
|
|
||||||
| You don't have an email id associated to this account.
|
|
||||||
.col-xs-12
|
|
||||||
a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/update-email')
|
|
||||||
i.fa.fa-envelope
|
|
||||||
| Update my Email
|
|
||||||
if supportedLanguages
|
|
||||||
.col-xs-12
|
|
||||||
select#lang-select.form-control.btn.btn-lg.btn-block.btn-primary.btn-link-social(name='langTag')
|
|
||||||
option(disabled selected=languageTag ? false : true) Prefered Language
|
|
||||||
for languageDisplay, lang in supportedLanguages
|
|
||||||
option(value=lang selected=lang === languageTag ? 'selected' : false)= languageDisplay
|
|
||||||
option(disabled) More to come...
|
|
||||||
.spacer
|
|
||||||
h2.text-center Danger Zone
|
|
||||||
.row
|
|
||||||
.col-xs-12
|
|
||||||
a.btn.btn-lg.btn-block.btn-danger.btn-link-social.confirm-deletion
|
|
||||||
| Delete my Free Code Camp account
|
|
||||||
script.
|
|
||||||
$('.confirm-deletion').on("click", function () {
|
|
||||||
$('#modal-dialog').modal('show');
|
|
||||||
});
|
|
||||||
#modal-dialog.modal.animated.wobble
|
|
||||||
.modal-dialog
|
|
||||||
.modal-content
|
|
||||||
.modal-header
|
|
||||||
a.close(href='#', data-dismiss='modal', aria-hidden='true') ×
|
|
||||||
h3 You don't really want to delete your account, do you?
|
|
||||||
.modal-body
|
|
||||||
p This will really delete all your data, including all your progress and brownie points.
|
|
||||||
p We won't be able to recover any of it for you later, even if you change your mind.
|
|
||||||
p If there's something we could do better, send us an email instead and we'll do our best:  
|
|
||||||
a(href="mailto:team@freecodecamp.com") team@freecodecamp.com
|
|
||||||
| .
|
|
||||||
.modal-footer
|
|
||||||
a.btn.btn-success.btn-block(href='#', data-dismiss='modal', aria-hidden='true')
|
|
||||||
| Nevermind, I don't want to delete all of my progress
|
|
||||||
.spacer
|
|
||||||
form(action='/account/delete', method='POST')
|
|
||||||
input(type='hidden', name='_csrf', value=_csrf)
|
|
||||||
button.btn.btn-danger.btn-block(type='submit')
|
|
||||||
| I am 100% sure I want to delete my account and all of my progress
|
|
Reference in New Issue
Block a user