mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 19:16:41 +07:00
save: save reset
appearance: save button reacts to changes
This commit is contained in:
parent
8fcca6587e
commit
7a6776c61b
8 changed files with 36 additions and 18 deletions
|
@ -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 (
|
||||||
|
@ -130,14 +130,14 @@ class Component extends React.PureComponent<Props, void> {
|
||||||
|
|
||||||
<div className="control-bar">
|
<div className="control-bar">
|
||||||
<button
|
<button
|
||||||
className="highlighted cancel"
|
className="highlighted cancel"
|
||||||
onClick={this.props.stopEditing}
|
onClick={this.props.stopEditing}
|
||||||
>
|
>
|
||||||
<Icon icon="icon-cancel-1" />
|
<Icon icon="icon-cancel-1" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
className="primary"
|
className={classnames({ primary: changed, disabled: !changed })}
|
||||||
onClick={this.startSaveMode}
|
onClick={this.startSaveMode}
|
||||||
>
|
>
|
||||||
<span>СХОРОНИТЬ</span>
|
<span>СХОРОНИТЬ</span>
|
||||||
|
|
|
@ -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: 'У вас уже есть маршрут с таким именем. Можно перезаписать его или переименовать?'
|
||||||
};
|
};
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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 });
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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,
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue