Refactoring: pull similar messages together

This commit is contained in:
IRBorisov 2024-06-06 23:11:53 +03:00
parent c786b54132
commit 8c38297de7
26 changed files with 135 additions and 68 deletions

View File

@ -3,6 +3,7 @@
import { createContext, useContext, useState } from 'react';
import { UserLevel } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
interface IAccessModeContext {
accessLevel: UserLevel;
@ -13,7 +14,7 @@ const AccessContext = createContext<IAccessModeContext | null>(null);
export const useAccessMode = () => {
const context = useContext(AccessContext);
if (!context) {
throw new Error('useAccessMode has to be used within <AccessModeState.Provider>');
throw new Error(contextOutsideScope('useAccessMode', 'AccessModeState'));
}
return context;
};

View File

@ -25,6 +25,7 @@ import {
IUserSignupData,
IUserUpdatePassword
} from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
import { useUsers } from './UsersContext';
@ -46,7 +47,7 @@ const AuthContext = createContext<IAuthContext | null>(null);
export const useAuth = () => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth has to be used within <AuthState.Provider>');
throw new Error(contextOutsideScope('useAuth', 'AuthState'));
}
return context;
};

View File

@ -20,6 +20,7 @@ import { matchLibraryItem, matchLibraryItemLocation } from '@/models/libraryAPI'
import { ILibraryFilter } from '@/models/miscellaneous';
import { IRSForm, IRSFormCloneData, IRSFormData } from '@/models/rsform';
import { RSFormLoader } from '@/models/RSFormLoader';
import { contextOutsideScope } from '@/utils/labels';
import { useAuth } from './AuthContext';
import { useConceptOptions } from './OptionsContext';
@ -46,7 +47,7 @@ const LibraryContext = createContext<ILibraryContext | null>(null);
export const useLibrary = (): ILibraryContext => {
const context = useContext(LibraryContext);
if (context === null) {
throw new Error('useLibrary has to be used within <LibraryState.Provider>');
throw new Error(contextOutsideScope('useLibrary', 'LibraryState'));
}
return context;
};

View File

@ -4,6 +4,7 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'rea
import { useLocation, useNavigate } from 'react-router-dom';
import { globals } from '@/utils/constants';
import { contextOutsideScope } from '@/utils/labels';
interface INavigationContext {
push: (path: string, newTab?: boolean) => void;
@ -21,7 +22,7 @@ const NavigationContext = createContext<INavigationContext | null>(null);
export const useConceptNavigation = () => {
const context = useContext(NavigationContext);
if (!context) {
throw new Error('useConceptNavigation has to be used within <NavigationState.Provider>');
throw new Error(contextOutsideScope('useConceptNavigation', 'NavigationState'));
}
return context;
};

View File

@ -9,6 +9,7 @@ import { FontStyle } from '@/models/miscellaneous';
import { animationDuration } from '@/styling/animations';
import { darkT, IColorTheme, lightT } from '@/styling/color';
import { globals, storage } from '@/utils/constants';
import { contextOutsideScope } from '@/utils/labels';
interface IOptionsContext {
viewportHeight: string;
@ -45,7 +46,7 @@ const OptionsContext = createContext<IOptionsContext | null>(null);
export const useConceptOptions = () => {
const context = useContext(OptionsContext);
if (!context) {
throw new Error('useConceptTheme has to be used within <ThemeState.Provider>');
throw new Error(contextOutsideScope('useConceptTheme', 'ThemeState'));
}
return context;
};

View File

@ -18,6 +18,7 @@ import { AccessPolicy, ILibraryItem } from '@/models/library';
import { ILibraryUpdateData } from '@/models/library';
import { IOperationSchema } from '@/models/oss';
import { UserID } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
import { useAuth } from './AuthContext';
import { useLibrary } from './LibraryContext';
@ -48,7 +49,7 @@ const OssContext = createContext<IOssContext | null>(null);
export const useOSS = () => {
const context = useContext(OssContext);
if (context === null) {
throw new Error('useOSS has to be used within <OssState.Provider>');
throw new Error(contextOutsideScope('useOSS', 'OssState'));
}
return context;
};

View File

@ -48,6 +48,7 @@ import {
ITargetCst
} from '@/models/rsform';
import { UserID } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
import { useAuth } from './AuthContext';
import { useLibrary } from './LibraryContext';
@ -99,7 +100,7 @@ const RSFormContext = createContext<IRSFormContext | null>(null);
export const useRSForm = () => {
const context = useContext(RSFormContext);
if (context === null) {
throw new Error('useRSForm has to be used within <RSFormState.Provider>');
throw new Error(contextOutsideScope('useRSForm', 'RSFormState'));
}
return context;
};

View File

@ -5,6 +5,7 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'rea
import { DataCallback, getProfile, patchProfile } from '@/app/backendAPI';
import { ErrorData } from '@/components/info/InfoError';
import { IUserProfile, IUserUpdateData } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
import { useUsers } from './UsersContext';
@ -23,7 +24,7 @@ const ProfileContext = createContext<IUserProfileContext | null>(null);
export const useUserProfile = () => {
const context = useContext(ProfileContext);
if (!context) {
throw new Error('useUserProfile has to be used within <UserProfileState.Provider>');
throw new Error(contextOutsideScope('useUserProfile', 'UserProfileState'));
}
return context;
};

View File

@ -4,6 +4,7 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'rea
import { getActiveUsers } from '@/app/backendAPI';
import { IUserInfo } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
interface IUsersContext {
users: IUserInfo[];
@ -15,7 +16,7 @@ const UsersContext = createContext<IUsersContext | null>(null);
export const useUsers = (): IUsersContext => {
const context = useContext(UsersContext);
if (context === null) {
throw new Error('useUsers has to be used within <UsersState.Provider>');
throw new Error(contextOutsideScope('useUsers', 'UsersState'));
}
return context;
};

View File

@ -20,6 +20,7 @@ import { useConceptNavigation } from '@/context/NavigationContext';
import { AccessPolicy, ILibraryItem, LocationHead } from '@/models/library';
import { cloneTitle, combineLocation, validateLocation } from '@/models/libraryAPI';
import { ConstituentaID, IRSFormCloneData } from '@/models/rsform';
import { information } from '@/utils/labels';
interface DlgCloneLibraryItemProps extends Pick<ModalProps, 'hideWindow'> {
base: ILibraryItem;
@ -62,7 +63,7 @@ function DlgCloneLibraryItem({ hideWindow, base, initialLocation, selected, tota
data.items = selected;
}
cloneItem(base.id, data, newSchema => {
toast.success(`Копия создана: ${newSchema.alias}`);
toast.success(information.cloneComplete(newSchema.alias));
router.push(urls.schema(newSchema.id));
});
}

View File

@ -16,6 +16,7 @@ import { Grammeme, ITextRequest, IWordForm, IWordFormPlain } from '@/models/lang
import { parseGrammemes, wordFormEquals } from '@/models/languageAPI';
import { HelpTopic } from '@/models/miscellaneous';
import { IConstituenta, TermForm } from '@/models/rsform';
import { prompts } from '@/utils/labels';
import { IGrammemeOption, SelectorGrammemes, SelectorGrammemesList } from '@/utils/selectors';
import WordFormsTable from './WordFormsTable';
@ -92,7 +93,7 @@ function DlgEditWordForms({ hideWindow, target, onSave }: DlgEditWordFormsProps)
function handleGenerateLexeme() {
if (forms.length > 0) {
if (!window.confirm('Данное действие приведет к перезаписи словоформ при совпадении граммем. Продолжить?')) {
if (!window.confirm(prompts.generateWordforms)) {
return;
}
}

View File

@ -25,6 +25,7 @@ import { AccessPolicy, LibraryItemType, LocationHead } from '@/models/library';
import { ILibraryCreateData } from '@/models/library';
import { combineLocation, validateLocation } from '@/models/libraryAPI';
import { EXTEOR_TRS_FILE, limits, patterns } from '@/utils/constants';
import { information } from '@/utils/labels';
function FormCreateItem() {
const router = useConceptNavigation();
@ -78,7 +79,7 @@ function FormCreateItem() {
fileName: file?.name
};
createItem(data, newItem => {
toast.success('Схема успешно создана');
toast.success(information.newLibraryItem);
if (itemType == LibraryItemType.RSFORM) {
router.push(urls.schema(newItem.id));
} else {

View File

@ -12,6 +12,7 @@ import { useOSS } from '@/context/OssContext';
import { ILibraryUpdateData, LibraryItemType } from '@/models/library';
import AccessToolbar from '@/pages/RSFormPage/EditorRSFormCard/AccessToolbar';
import { limits, patterns } from '@/utils/constants';
import { information } from '@/utils/labels';
import { useOssEdit } from '../OssEditContext';
@ -81,7 +82,7 @@ function FormOSS({ id, isModified, setIsModified }: FormOSSProps) {
visible: visible,
read_only: readOnly
};
update(data, () => toast.success('Изменения сохранены'));
update(data, () => toast.success(information.changesSaved));
};
return (

View File

@ -13,6 +13,7 @@ import DlgEditEditors from '@/dialogs/DlgEditEditors';
import { AccessPolicy } from '@/models/library';
import { IOperationSchema } from '@/models/oss';
import { UserID, UserLevel } from '@/models/user';
import { information } from '@/utils/labels';
interface IOssEditContext {
schema?: IOperationSchema;
@ -84,7 +85,7 @@ export const OssEditState = ({ children }: OssEditStateProps) => {
if (!model.schema) {
return;
}
model.setLocation(newLocation, () => toast.success('Схема перемещена'));
model.setLocation(newLocation, () => toast.success(information.moveComplete));
},
[model]
);
@ -102,35 +103,35 @@ export const OssEditState = ({ children }: OssEditStateProps) => {
const url = currentRef.includes('?') ? currentRef + '&share' : currentRef + '?share';
navigator.clipboard
.writeText(url)
.then(() => toast.success(`Ссылка скопирована: ${url}`))
.then(() => toast.success(information.linkReady))
.catch(console.error);
}, []);
const toggleSubscribe = useCallback(() => {
if (model.isSubscribed) {
model.unsubscribe(() => toast.success('Отслеживание отключено'));
model.unsubscribe(() => toast.success(information.unsubscribed));
} else {
model.subscribe(() => toast.success('Отслеживание включено'));
model.subscribe(() => toast.success(information.subscribed));
}
}, [model]);
const setOwner = useCallback(
(newOwner: UserID) => {
model.setOwner(newOwner, () => toast.success('Владелец обновлен'));
model.setOwner(newOwner, () => toast.success(information.changesSaved));
},
[model]
);
const setAccessPolicy = useCallback(
(newPolicy: AccessPolicy) => {
model.setAccessPolicy(newPolicy, () => toast.success('Политика доступа изменена'));
model.setAccessPolicy(newPolicy, () => toast.success(information.changesSaved));
},
[model]
);
const setEditors = useCallback(
(newEditors: UserID[]) => {
model.setEditors(newEditors, () => toast.success('Редакторы обновлены'));
model.setEditors(newEditors, () => toast.success(information.changesSaved));
},
[model]
);

View File

@ -17,6 +17,7 @@ import { useBlockNavigation, useConceptNavigation } from '@/context/NavigationCo
import { useConceptOptions } from '@/context/OptionsContext';
import { useOSS } from '@/context/OssContext';
import useQueryStrings from '@/hooks/useQueryStrings';
import { information, prompts } from '@/utils/labels';
import EditorRSForm from './EditorOssCard';
import EditorTermGraph from './EditorOssGraph';
@ -84,11 +85,11 @@ function OssTabs() {
}
const onDestroySchema = useCallback(() => {
if (!schema || !window.confirm('Вы уверены, что хотите удалить данную схему?')) {
if (!schema || !window.confirm(prompts.deleteLibraryItem)) {
return;
}
destroyItem(schema.id, () => {
toast.success('Схема удалена');
toast.success(information.itemDestroyed);
router.push(urls.library);
});
}, [schema, destroyItem, router]);

View File

@ -13,7 +13,7 @@ import BadgeHelp from '@/components/info/BadgeHelp';
import MiniButton from '@/components/ui/MiniButton';
import Overlay from '@/components/ui/Overlay';
import { HelpTopic } from '@/models/miscellaneous';
import { messages, prepareTooltip } from '@/utils/labels';
import { prepareTooltip, tooltips } from '@/utils/labels';
interface ConstituentaToolbarProps {
disabled: boolean;
@ -66,7 +66,7 @@ function ConstituentaToolbar({
onClick={onCreate}
/>
<MiniButton
titleHtml={modified ? messages.unsaved : prepareTooltip('Клонировать конституенту', 'Alt + V')}
titleHtml={modified ? tooltips.unsaved : prepareTooltip('Клонировать конституенту', 'Alt + V')}
icon={<IconClone size='1.25rem' className='icon-green' />}
disabled={disabled || modified}
onClick={onClone}

View File

@ -4,7 +4,7 @@ import { IconEdit } from '@/components/Icons';
import MiniButton from '@/components/ui/MiniButton';
import Overlay from '@/components/ui/Overlay';
import { IConstituenta } from '@/models/rsform';
import { messages } from '@/utils/labels';
import { tooltips } from '@/utils/labels';
interface ControlsOverlayProps {
constituenta?: IConstituenta;
@ -21,7 +21,7 @@ function ControlsOverlay({ constituenta, disabled, modified, processing, onRenam
<Overlay position='top-1 left-[4.7rem]' className='flex select-none'>
{!disabled || processing ? (
<MiniButton
title={modified ? messages.unsaved : `Редактировать словоформы термина`}
title={modified ? tooltips.unsaved : `Редактировать словоформы термина`}
noHover
onClick={onEditTerm}
icon={<IconEdit size='1rem' className='icon-primary' />}
@ -42,7 +42,7 @@ function ControlsOverlay({ constituenta, disabled, modified, processing, onRenam
{!disabled || processing ? (
<MiniButton
noHover
title={modified ? messages.unsaved : 'Переименовать конституенту'}
title={modified ? tooltips.unsaved : 'Переименовать конституенту'}
onClick={onRename}
icon={<IconEdit size='1rem' className='icon-primary' />}
disabled={modified}

View File

@ -13,7 +13,7 @@ import AnimateFade from '@/components/wrap/AnimateFade';
import { useRSForm } from '@/context/RSFormContext';
import { CstType, IConstituenta, ICstUpdateData } from '@/models/rsform';
import { isBaseSet, isBasicConcept, isFunctional } from '@/models/rsformAPI';
import { labelCstTypification } from '@/utils/labels';
import { information, labelCstTypification } from '@/utils/labels';
import EditorRSExpression from '../EditorRSExpression';
import ControlsOverlay from './ControlsOverlay';
@ -119,7 +119,7 @@ function FormConstituenta({
definition_raw: textDefinition,
convention: convention
};
cstUpdate(data, () => toast.success('Изменения сохранены'));
cstUpdate(data, () => toast.success(information.changesSaved));
}
return (

View File

@ -19,7 +19,7 @@ import { getDefinitionPrefix } from '@/models/rsformAPI';
import { IExpressionParse, IRSErrorDescription, SyntaxTree } from '@/models/rslang';
import { TokenID } from '@/models/rslang';
import { storage } from '@/utils/constants';
import { labelTypification } from '@/utils/labels';
import { errors, labelTypification } from '@/utils/labels';
import ExpressionToolbar from './ExpressionToolbar';
import ParsingResult from './ParsingResult';
@ -131,7 +131,7 @@ function EditorRSExpression({
function handleShowAST() {
handleCheckExpression(parse => {
if (!parse.astText) {
toast.error('Невозможно построить дерево разбора');
toast.error(errors.astFailed);
} else {
setSyntaxTree(parse.ast);
setExpression(getDefinitionPrefix(activeCst!) + value);

View File

@ -13,6 +13,7 @@ import TextInput from '@/components/ui/TextInput';
import { useRSForm } from '@/context/RSFormContext';
import { ILibraryUpdateData, LibraryItemType } from '@/models/library';
import { limits, patterns } from '@/utils/constants';
import { information } from '@/utils/labels';
import { useRSEdit } from '../RSEditContext';
import AccessToolbar from './AccessToolbar';
@ -84,7 +85,7 @@ function FormRSForm({ id, isModified, setIsModified }: FormRSFormProps) {
visible: visible,
read_only: readOnly
};
update(data, () => toast.success('Изменения сохранены'));
update(data, () => toast.success(information.changesSaved));
};
return (

View File

@ -43,6 +43,7 @@ import {
import { generateAlias } from '@/models/rsformAPI';
import { UserID, UserLevel } from '@/models/user';
import { EXTEOR_TRS_FILE } from '@/utils/constants';
import { information, prompts } from '@/utils/labels';
import { promptUnsaved } from '@/utils/utils';
interface IRSEditContext {
@ -189,14 +190,11 @@ export const RSEditState = ({
}, [isModified]);
const restoreVersion = useCallback(() => {
if (
!model.versionID ||
!window.confirm('При восстановлении архивной версии актуальная схему будет заменена. Продолжить?')
) {
if (!model.versionID || !window.confirm(prompts.restoreArchive)) {
return;
}
model.versionRestore(model.versionID, () => {
toast.success('Загрузка версии завершена');
toast.success(information.versionRestored);
viewVersion(undefined);
});
}, [model, viewVersion]);
@ -223,7 +221,7 @@ export const RSEditState = ({
}
data.alias = data.alias || generateAlias(data.cst_type, model.schema);
model.cstCreate(data, newCst => {
toast.success(`Конституента добавлена: ${newCst.alias}`);
toast.success(information.newConstituent(newCst.alias));
setSelected([newCst.id]);
if (onCreateCst) onCreateCst(newCst);
});
@ -233,14 +231,15 @@ export const RSEditState = ({
const handleRenameCst = useCallback(
(data: ICstRenameData) => {
model.cstRename(data, () => toast.success(`Переименование: ${renameInitialData!.alias} -> ${data.alias}`));
const oldAlias = renameInitialData!.alias;
model.cstRename(data, () => toast.success(information.renameComplete(oldAlias, data.alias)));
},
[model, renameInitialData]
);
const handleSubstituteCst = useCallback(
(data: ICstSubstituteData) => {
model.cstSubstitute(data, () => toast.success('Отождествление завершено'));
model.cstSubstitute(data, () => toast.success(information.substituteSingle));
},
[model]
);
@ -259,7 +258,7 @@ export const RSEditState = ({
const nextActive = isEmpty ? undefined : getNextActiveOnDelete(activeCst?.id, model.schema.items, deleted);
model.cstDelete(data, () => {
toast.success(`Конституенты удалены: ${deletedNames}`);
toast.success(information.constituentsDestroyed(deletedNames));
setSelected(nextActive ? [nextActive] : []);
if (onDeleteCst) onDeleteCst(nextActive);
});
@ -276,7 +275,7 @@ export const RSEditState = ({
id: activeCst.id,
term_forms: forms
};
model.cstUpdate(data, () => toast.success('Изменения сохранены'));
model.cstUpdate(data, () => toast.success(information.changesSaved));
},
[model, activeCst]
);
@ -287,7 +286,7 @@ export const RSEditState = ({
return;
}
model.versionCreate(data, newVersion => {
toast.success('Версия создана');
toast.success(information.newVersion(data.version));
viewVersion(newVersion);
});
},
@ -300,7 +299,7 @@ export const RSEditState = ({
return;
}
model.versionDelete(versionID, () => {
toast.success('Версия удалена');
toast.success(information.versionDestroyed);
if (String(versionID) === model.versionID) {
viewVersion(undefined);
}
@ -314,7 +313,7 @@ export const RSEditState = ({
if (!model.schema) {
return;
}
model.versionUpdate(versionID, data, () => toast.success('Версия обновлена'));
model.versionUpdate(versionID, data, () => toast.success(information.changesSaved));
},
[model]
);
@ -324,7 +323,7 @@ export const RSEditState = ({
if (!model.schema) {
return;
}
model.setLocation(newLocation, () => toast.success('Схема перемещена'));
model.setLocation(newLocation, () => toast.success(information.moveComplete));
},
[model]
);
@ -337,7 +336,7 @@ export const RSEditState = ({
const oldCount = model.schema.items.length;
model.inlineSynthesis(data, newSchema => {
setSelected([]);
toast.success(`Конституенты добавлены: ${newSchema['items'].length - oldCount}`);
toast.success(information.addedConstituents(newSchema['items'].length - oldCount));
});
},
[model, setSelected]
@ -463,8 +462,8 @@ export const RSEditState = ({
setShowEditTerm(true);
}, [isModified, activeCst]);
const reindex = useCallback(() => model.resetAliases(() => toast.success('Имена конституент обновлены')), [model]);
const reorder = useCallback(() => model.restoreOrder(() => toast.success('Конституенты упорядочены')), [model]);
const reindex = useCallback(() => model.resetAliases(() => toast.success(information.reindexComplete)), [model]);
const reorder = useCallback(() => model.restoreOrder(() => toast.success(information.reorderComplete)), [model]);
const canProduceStructure = useMemo(() => {
return (
@ -486,7 +485,7 @@ export const RSEditState = ({
target: activeCst.id
};
model.produceStructure(data, cstList => {
toast.success(`Добавлены конституенты: ${cstList.length}`);
toast.success(information.addedConstituents(cstList.length));
if (cstList.length !== 0) {
setSelected(cstList);
}
@ -535,35 +534,35 @@ export const RSEditState = ({
const url = currentRef.includes('?') ? currentRef + '&share' : currentRef + '?share';
navigator.clipboard
.writeText(url)
.then(() => toast.success(`Ссылка скопирована: ${url}`))
.then(() => toast.success(information.linkReady))
.catch(console.error);
}, []);
const toggleSubscribe = useCallback(() => {
if (model.isSubscribed) {
model.unsubscribe(() => toast.success('Отслеживание отключено'));
model.unsubscribe(() => toast.success(information.unsubscribed));
} else {
model.subscribe(() => toast.success('Отслеживание включено'));
model.subscribe(() => toast.success(information.subscribed));
}
}, [model]);
const setOwner = useCallback(
(newOwner: UserID) => {
model.setOwner(newOwner, () => toast.success('Владелец обновлен'));
model.setOwner(newOwner, () => toast.success(information.changesSaved));
},
[model]
);
const setAccessPolicy = useCallback(
(newPolicy: AccessPolicy) => {
model.setAccessPolicy(newPolicy, () => toast.success('Политика доступа изменена'));
model.setAccessPolicy(newPolicy, () => toast.success(information.changesSaved));
},
[model]
);
const setEditors = useCallback(
(newEditors: UserID[]) => {
model.setEditors(newEditors, () => toast.success('Редакторы обновлены'));
model.setEditors(newEditors, () => toast.success(information.changesSaved));
},
[model]
);

View File

@ -20,7 +20,7 @@ import { useRSForm } from '@/context/RSFormContext';
import useQueryStrings from '@/hooks/useQueryStrings';
import { ConstituentaID, IConstituenta, IConstituentaMeta } from '@/models/rsform';
import { PARAMETER, prefixes } from '@/utils/constants';
import { labelVersion } from '@/utils/labels';
import { information, labelVersion, prompts } from '@/utils/labels';
import EditorConstituenta from './EditorConstituenta';
import EditorRSForm from './EditorRSFormCard';
@ -173,11 +173,11 @@ function RSTabs() {
);
const onDestroySchema = useCallback(() => {
if (!schema || !window.confirm('Вы уверены, что хотите удалить данную схему?')) {
if (!schema || !window.confirm(prompts.deleteLibraryItem)) {
return;
}
destroyItem(schema.id, () => {
toast.success('Схема удалена');
toast.success(information.itemDestroyed);
router.push(urls.library);
});
}, [schema, destroyItem, router]);

View File

@ -13,6 +13,7 @@ import TextInput from '@/components/ui/TextInput';
import { useAuth } from '@/context/AuthContext';
import { useConceptNavigation } from '@/context/NavigationContext';
import { IUserUpdatePassword } from '@/models/user';
import { errors, information } from '@/utils/labels';
function EditorPassword() {
const router = useConceptNavigation();
@ -37,7 +38,7 @@ function EditorPassword() {
function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
event.preventDefault();
if (newPassword !== newPasswordRepeat) {
toast.error('Пароли не совпадают');
toast.error(errors.passwordsMismatch);
return;
}
const data: IUserUpdatePassword = {
@ -45,7 +46,7 @@ function EditorPassword() {
new_password: newPassword
};
updatePassword(data, () => {
toast.success('Изменения сохранены');
toast.success(information.changesSaved);
router.push(urls.login);
});
}

View File

@ -11,6 +11,7 @@ import TextInput from '@/components/ui/TextInput';
import { useBlockNavigation } from '@/context/NavigationContext';
import { useUserProfile } from '@/context/UserProfileContext';
import { IUserUpdateData } from '@/models/user';
import { information } from '@/utils/labels';
function EditorProfile() {
const { updateUser, user, errorProcessing, processing } = useUserProfile();
@ -45,7 +46,7 @@ function EditorProfile() {
first_name: first_name,
last_name: last_name
};
updateUser(data, () => toast.success('Изменения сохранены'));
updateUser(data, () => toast.success(information.changesSaved));
}
return (

View File

@ -852,9 +852,59 @@ export function describeLibraryItemType(itemType: LibraryItemType): string {
}
/**
* UI shared messages.
* UI info descriptors.
*/
export const messages = {
unsaved: 'Сохраните или отмените изменения',
promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?'
export const information = {
changesSaved: 'Изменения сохранены',
subscribed: 'Отслеживание отключено',
unsubscribed: 'Отслеживание выключено',
substituteSingle: 'Отождествление завершено',
reorderComplete: 'Упорядочение завершено',
reindexComplete: 'Имена конституент обновлены',
moveComplete: 'Перемещение завершено',
linkReady: 'Ссылка скопирована',
versionRestored: 'Загрузка версии завершена',
cloneComplete: (alias: string) => `Копия создана: ${alias}`,
addedConstituents: (count: number) => `Добавлены конституенты: ${count}`,
newLibraryItem: 'Схема успешно создана',
newConstituent: (alias: string) => `Конституента добавлена: ${alias}`,
newVersion: (version: string) => `Версия создана: ${version}`,
renameComplete: (oldAlias: string, newAlias: string) => `Переименование: ${oldAlias} -> ${newAlias}`,
versionDestroyed: 'Версия удалена',
itemDestroyed: 'Схема удалена',
constituentsDestroyed: (aliases: string) => `Конституенты удалены: ${aliases}`
};
/**
* UI error descriptors.
*/
export const errors = {
astFailed: 'Невозможно построить дерево разбора',
passwordsMismatch: 'Пароли не совпадают'
};
/**
* UI tooltip descriptors.
*/
export const tooltips = {
unsaved: 'Сохраните или отмените изменения'
};
/**
* UI prompt messages.
*/
export const prompts = {
promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?',
deleteLibraryItem: 'Вы уверены, что хотите удалить данную схему?',
generateWordforms: 'Данное действие приведет к перезаписи словоформ при совпадении граммем. Продолжить?',
restoreArchive: 'При восстановлении архивной версии актуальная схему будет заменена. Продолжить?'
};
// ============== INTERNAL LABELS FOR DEVELOPERS TEXT ================
export function contextOutsideScope(contextName: string, contextState: string): string {
return `${contextName} has to be used within <${contextState}.Provider>`;
}

View File

@ -4,7 +4,7 @@
import { AxiosHeaderValue, AxiosResponse } from 'axios';
import { messages } from './labels';
import { prompts } from './labels';
/**
* Checks if arguments is Node.
@ -102,7 +102,7 @@ export function convertBase64ToBlob(base64String: string): Uint8Array {
* Prompt user of confirming discarding changes before continue.
*/
export function promptUnsaved(): boolean {
return window.confirm(messages.promptUnsaved);
return window.confirm(prompts.promptUnsaved);
}
/**