save: save reset

appearance: save button reacts to changes
This commit is contained in:
muerwre 2018-11-27 15:05:49 +07:00
parent 8fcca6587e
commit 7a6776c61b
8 changed files with 36 additions and 18 deletions

View file

@ -54,7 +54,7 @@ class Component extends React.PureComponent<Props, void> {
render() { render() {
const { const {
mode, routerPoints, distance, estimated, activeSticker, logo, user, editing, title, address, mode, distance, estimated, changed, logo, editing,
} = this.props; } = this.props;
return ( return (
@ -137,7 +137,7 @@ class Component extends React.PureComponent<Props, void> {
</button> </button>
<button <button
className="primary" className={classnames({ primary: changed, disabled: !changed })}
onClick={this.startSaveMode} onClick={this.startSaveMode}
> >
<span>СХОРОНИТЬ</span> <span>СХОРОНИТЬ</span>

View file

@ -1,6 +1,7 @@
export const TIPS = { export const TIPS = {
SAVE_INFO: 'Никто, кроме вас не сможет изменить маршрут - только создать его копию и сохранить по другому адресу', SAVE_INFO: 'Никто, кроме вас не сможет изменить маршрут - только создать его копию и сохранить по другому адресу',
SAVE_TIMED_OUT: 'Сервер не ответил на запрос, попробуйте позже', SAVE_TIMED_OUT: 'Сервер не ответил на запрос, попробуйте еще раз',
SAVE_EMPTY: 'Этот маршрут пуст, нарисуйте что-нибудь для начала', SAVE_EMPTY: 'Этот маршрут пуст, нарисуйте что-нибудь для начала',
SAVE_SUCCESS: 'Маршрут сохранен - он будет доступен по указанному адресу' SAVE_SUCCESS: 'Отлично! Ваш маршрут сохранён. Поделитесь ссылкой с друзьями, приятной покатушки!',
SAVE_OVERWRITE: 'У вас уже есть маршрут с таким именем. Можно перезаписать его или переименовать?'
}; };

View file

@ -10,13 +10,13 @@ import { parseStickerAngle, parseStickerStyle } from '$utils/import';
import { getUrlData, pushPath } from '$utils/history'; import { getUrlData, pushPath } from '$utils/history';
import { store } from '$redux/store'; import { store } from '$redux/store';
import { import {
resetSaveDialog,
setActiveSticker, setAddress, setActiveSticker, setAddress,
setChanged, setChanged,
setDistance, setDistance,
setEditing, setMode,
setLogo, setMode,
setRouterPoints, setRouterPoints,
setTitle setTitle,
} from '$redux/user/actions'; } from '$redux/user/actions';
export class Editor { export class Editor {
@ -67,6 +67,9 @@ export class Editor {
}, },
[MODES.LOGO]: { [MODES.LOGO]: {
toggle: this.clearMode, toggle: this.clearMode,
},
[MODES.SAVE]: {
stop: this.resetSaveDialog,
} }
}; };
@ -98,16 +101,21 @@ export class Editor {
getDistance = () => store.getState().user.distance; getDistance = () => store.getState().user.distance;
setMode = value => store.dispatch(setMode(value)); setMode = value => store.dispatch(setMode(value));
setChanged = value => store.dispatch(setChanged(value));
setRouterPoints = value => store.dispatch(setRouterPoints(value)); setRouterPoints = value => store.dispatch(setRouterPoints(value));
setActiveSticker = value => store.dispatch(setActiveSticker(value)); setActiveSticker = value => store.dispatch(setActiveSticker(value));
setTitle = value => store.dispatch(setTitle(value)); setTitle = value => store.dispatch(setTitle(value));
setAddress = value => store.dispatch(setAddress(value)); setAddress = value => store.dispatch(setAddress(value));
resetSaveDialog = () => store.dispatch(resetSaveDialog());
setDistance = value => { setDistance = value => {
if (this.getDistance() !== value) store.dispatch(setDistance(value)); if (this.getDistance() !== value) store.dispatch(setDistance(value));
}; };
setChanged = value => {
if (this.getChanged() !== value) store.dispatch(setChanged(value));
};
clearMode = () => this.setMode(MODES.NONE); clearMode = () => this.setMode(MODES.NONE);
clearChanged = () => store.dispatch(setChanged(false)); clearChanged = () => store.dispatch(setChanged(false));

View file

@ -26,7 +26,7 @@ export const clearAll = () => ({ type: ACTIONS.CLEAR_ALL });
export const clearCancel = () => ({ type: ACTIONS.CLEAR_CANCEL }); export const clearCancel = () => ({ type: ACTIONS.CLEAR_CANCEL });
export const sendSaveRequest = payload => ({ type: ACTIONS.SEND_SAVE_REQUEST, ...payload }); export const sendSaveRequest = payload => ({ type: ACTIONS.SEND_SAVE_REQUEST, ...payload });
export const cancelSaveRequest = () => ({ type: ACTIONS.CANCEL_SAVE_REQUEST }); export const resetSaveDialog = () => ({ type: ACTIONS.RESET_SAVE_DIALOG });
export const setSaveSuccess = payload => ({ type: ACTIONS.SET_SAVE_SUCCESS, ...payload }); export const setSaveSuccess = payload => ({ type: ACTIONS.SET_SAVE_SUCCESS, ...payload });
export const setSaveError = save_error => ({ type: ACTIONS.SET_SAVE_ERROR, save_error }); export const setSaveError = save_error => ({ type: ACTIONS.SET_SAVE_ERROR, save_error });

View file

@ -25,6 +25,7 @@ export const ACTIONS = {
SEND_SAVE_REQUEST: 'SEND_SAVE_REQUEST', SEND_SAVE_REQUEST: 'SEND_SAVE_REQUEST',
CANCEL_SAVE_REQUEST: 'CANCEL_SAVE_REQUEST', CANCEL_SAVE_REQUEST: 'CANCEL_SAVE_REQUEST',
RESET_SAVE_DIALOG: 'RESET_SAVE_DIALOG',
SET_SAVE_SUCCESS: 'SET_SAVE_SUCCESS', SET_SAVE_SUCCESS: 'SET_SAVE_SUCCESS',
SET_SAVE_ERROR: 'SET_SAVE_ERROR', SET_SAVE_ERROR: 'SET_SAVE_ERROR',

View file

@ -3,6 +3,7 @@ import { ACTIONS } from '$redux/user/constants';
import { DEFAULT_USER } from '$constants/auth'; import { DEFAULT_USER } from '$constants/auth';
import { MODES } from '$constants/modes'; import { MODES } from '$constants/modes';
import { DEFAULT_LOGO } from '$constants/logos'; import { DEFAULT_LOGO } from '$constants/logos';
import { TIPS } from '$constants/tips';
const getEstimated = distance => { const getEstimated = distance => {
const time = (distance && (distance / 15)) || 0; const time = (distance && (distance / 15)) || 0;
@ -18,9 +19,7 @@ const setUser = (state, { user }) => ({
}); });
const setEditing = (state, { editing }) => ({ ...state, editing }); const setEditing = (state, { editing }) => ({ ...state, editing });
const setChanged = (state, { changed }) => ({ const setChanged = (state, { changed }) => ({ ...state, changed });
...state, changed, ...state, save_overwriting: false, save_finished: false, save_processing: false, save_error: '',
});
const setMode = (state, { mode }) => ({ ...state, mode }); const setMode = (state, { mode }) => ({ ...state, mode });
const setDistance = (state, { distance }) => ({ const setDistance = (state, { distance }) => ({
...state, ...state,
@ -39,13 +38,19 @@ const sendSaveRequest = state => ({ ...state, save_processing: true, });
const setSaveError = (state, { save_error }) => ({ const setSaveError = (state, { save_error }) => ({
...state, save_error, save_finished: false, save_processing: false ...state, save_error, save_finished: false, save_processing: false
}); });
const setSaveOverwrite = state => ({ const setSaveOverwrite = state => ({
...state, save_overwriting: true, save_finished: false, save_processing: false ...state, save_overwriting: true, save_finished: false, save_processing: false, save_error: TIPS.SAVE_OVERWRITE,
}); });
const setSaveSuccess = (state, { save_error }) => ({ const setSaveSuccess = (state, { save_error }) => ({
...state, save_overwriting: false, save_finished: true, save_processing: false, save_error ...state, save_overwriting: false, save_finished: true, save_processing: false, save_error
}); });
const resetSaveDialog = state => ({
...state, save_overwriting: false, save_finished: false, save_processing: false, save_error: '',
});
const HANDLERS = { const HANDLERS = {
[ACTIONS.SET_USER]: setUser, [ACTIONS.SET_USER]: setUser,
[ACTIONS.SET_EDITING]: setEditing, [ACTIONS.SET_EDITING]: setEditing,
@ -62,6 +67,7 @@ const HANDLERS = {
[ACTIONS.SET_SAVE_OVERWRITE]: setSaveOverwrite, [ACTIONS.SET_SAVE_OVERWRITE]: setSaveOverwrite,
[ACTIONS.SET_SAVE_SUCCESS]: setSaveSuccess, [ACTIONS.SET_SAVE_SUCCESS]: setSaveSuccess,
[ACTIONS.SEND_SAVE_REQUEST]: sendSaveRequest, [ACTIONS.SEND_SAVE_REQUEST]: sendSaveRequest,
[ACTIONS.RESET_SAVE_DIALOG]: resetSaveDialog,
}; };
export const INITIAL_STATE = { export const INITIAL_STATE = {
@ -73,7 +79,7 @@ export const INITIAL_STATE = {
distance: 0, distance: 0,
estimated: 0, estimated: 0,
activeSticker: null, activeSticker: null,
title: 0, title: '',
address: '', address: '',
changed: false, changed: false,

View file

@ -195,7 +195,7 @@ function* sendSaveRequestSaga({ title, address, force }) {
id, token, route, stickers, title, force, address id, token, route, stickers, title, force, address
}), }),
timeout: delay(10000), timeout: delay(10000),
cancel: take(ACTIONS.CANCEL_SAVE_REQUEST), cancel: take(ACTIONS.RESET_SAVE_DIALOG),
}); });
if (cancel) return yield put(setMode(MODES.NONE)); if (cancel) return yield put(setMode(MODES.NONE));

View file

@ -97,17 +97,19 @@
} }
&.disabled { &.disabled {
color: #999999;
svg { svg {
fill: #999999; fill: #999999;
} }
} }
&.highlighted { &.highlighted {
background: #555555; background: rgba(255, 255, 255, 0.1);
} }
&.cancel { &.cancel {
background: linear-gradient(270deg, #0f5871, #444444 60%); // background: linear-gradient(270deg, #0f5871, #444444 60%);
} }
&.primary { &.primary {