Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
a1354b6
feat: add definition widget for word page
azozulya Nov 14, 2023
7471053
refactor: put wordStatus to feature
azozulya Nov 14, 2023
83d8f7c
feat: add word entity
azozulya Nov 14, 2023
06901e9
fix: import urls
azozulya Nov 14, 2023
6e46e3a
feat: add definitions to word page
azozulya Nov 14, 2023
7f1fbc1
feat: add translation
azozulya Nov 14, 2023
7efb864
refactor: add styles to definition card
azozulya Nov 14, 2023
521f94c
refactor: move WordStatus to entities/word/ui
azozulya Nov 14, 2023
90b1975
fix: change color
azozulya Nov 14, 2023
b2f8ec0
feat: create Definition page
azozulya Nov 14, 2023
d6a2bb1
Merge branch 'develop' into feat/word-definition
azozulya Nov 14, 2023
ce38539
feat: add definition-page translation
azozulya Nov 14, 2023
2057639
feat: add EmptyCard widget, update definition page
azozulya Nov 14, 2023
c36b071
refactor: definitions widget and list
azozulya Nov 14, 2023
3cc341d
refactor: WordInfo to reuse at definitions page
azozulya Nov 14, 2023
99519d6
fix: change btn default styles, add color
azozulya Nov 14, 2023
2f41120
fix: add translation for popularity
azozulya Nov 16, 2023
32c3fa6
refactor: use Popularity UI in DefinitionWidget and page
azozulya Nov 16, 2023
4b34a19
fix: prettier fixes for translation files
azozulya Nov 16, 2023
a6a12c2
fix: small styles fixies
azozulya Nov 16, 2023
0bbf1b7
Merge branch 'develop' into feat/word-definition
azozulya Jan 18, 2024
bcc010b
refactor: change styles in ButtonIcon, CopyText, Popularity ui
azozulya Jan 21, 2024
92c6d35
feat: add widgetUI, change definition widget on the word page
azozulya Jan 21, 2024
7381169
feat: add translation
azozulya Jan 22, 2024
05cdb2f
refactor: widget -> ShadowBlock
azozulya Jan 22, 2024
2f91e9b
refactor: DefinitionWidget on the word page
azozulya Jan 22, 2024
cba9cde
refactor: Definition page
azozulya Jan 22, 2024
ca013b0
refactor: definition page, delete unused EmptyCart
azozulya Jan 23, 2024
0be4011
feat: add related examples to definition page
azozulya Feb 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions public/locales/de/definition-page.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"title": "Alle Definitionen",
"addDefinition": "Definition hinzufügen",
"emptyDefinitionMessage": "No definitions",
"relatedExamples": "Related examples"
}
6 changes: 6 additions & 0 deletions public/locales/de/popularity.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"popularity": "Popularität",
"high": "hoch",
"medium": "durchschnitt",
"low": "niedrig"
}
1 change: 1 addition & 0 deletions public/locales/de/word-profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"allAssociations": "Alle Verbände",
"definitions": "Definitionen",
"allDefinitions": "Alle Definitionen",
"relatedExamples": "Verwandte Beispiele",
"examples": "Beispiele",
"allExamples": "Alle Beispiele",
"forms": "Wortformen",
Expand Down
6 changes: 6 additions & 0 deletions public/locales/en/definition-page.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"title": "All Definitions",
"addDefinition": "Add Definition",
"emptyDefinitionMessage": "No definitions",
"relatedExamples": "Related examples"
}
6 changes: 6 additions & 0 deletions public/locales/en/popularity.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"popularity": "Popularity",
"high": "high",
"medium": "medium",
"low": "low"
}
1 change: 1 addition & 0 deletions public/locales/en/word-profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"allAssociations": "All associations",
"definitions": "Definitions",
"allDefinitions": "All definitions",
"relatedExamples": "Related examples",
"examples": "Examples",
"allExamples": "All examples",
"forms": "Word forms",
Expand Down
9 changes: 9 additions & 0 deletions public/locales/ru/definition-page.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"title_one": "{{count}} определение",
"title_few": "{{count}} определения",
"title_many": "{{count}} определений",
"title_other": "{{count}} определения",
"addDefinition": "Добавить определение",
"emptyDefinitionMessage": "Нет определений",
"relatedExamples": "связанные примеры"
}
6 changes: 6 additions & 0 deletions public/locales/ru/popularity.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"popularity": "Популярность",
"high": "высокая",
"medium": "средняя",
"low": "низкая"
}
1 change: 1 addition & 0 deletions public/locales/ru/word-profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"allAssociations": "Все ассоциации",
"definitions": "Определения",
"allDefinitions": "Все определения",
"relatedExamples": "Связанные примеры",
"examples": "Примеры",
"allExamples": "Все примеры",
"forms": "Формы слова",
Expand Down
9 changes: 5 additions & 4 deletions src/0_app/App.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
/* eslint-disable react-refresh/only-export-components */
import { Theme } from '@radix-ui/themes';
import { ThemeProvider, withProviders } from './provider';
import { Routing } from '../1_pages';
import { themeSelector } from '../4_entities/theme';
import { useAppSelector } from '../5_shared/model';
import { Routing } from '@pages/index';
import { themeSelector } from '@entities/theme';
import { useAppSelector } from '@shared/model';

// eslint-disable-next-line react-refresh/only-export-components
function App() {
const { theme } = useAppSelector(themeSelector);

Expand All @@ -17,4 +17,5 @@ function App() {
);
}

// eslint-disable-next-line react-refresh/only-export-components
export default withProviders(<App />);
21 changes: 21 additions & 0 deletions src/1_pages/Definitions/DefinitionsPage.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@import '@styles/colors';
@import '@styles/mixins/font';

.container {
padding-top: 37px;
}

h1 {
@include font-source-sans(34px, $dark, 400);
}

.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}

.word {
margin-bottom: 40px;
}
53 changes: 53 additions & 0 deletions src/1_pages/Definitions/DefinitionsPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom';
import { Button } from '@shared/ui';
import { wordApi } from '@entities/word/api/wordApi';
import { TDefinition } from '@entities/word/model/types';
import { WordPageStatus } from '@entities/word/ui';
import { DefinitionsList } from '@widgets/Definitions';
import SVGIconDefinitions from '@shared/assets/icons/sections/definitions.svg?react';
import SVGIconPlus from '@shared/assets/icons/actions/plus.svg?react';
import styles from './DefinitionsPage.module.scss';

const DefinitionPage = () => {
const { t } = useTranslation('definition-page');
const { slugWord: wordId } = useParams();
const [definitions, setDefinitions] = useState<TDefinition[] | null>([]);

useEffect(() => {
if (!wordId) return;
wordApi.getAllDefinitions(wordId).then((data: TDefinition[]) => setDefinitions(data));
}, [wordId]);

if (!definitions?.length) {
return (
<WordPageStatus title={t('emptyDefinitionMessage')} icon={<SVGIconDefinitions />}>
<Button size="small">
<SVGIconPlus />
{t('addDefinition')}
</Button>
<Button size="small">Тренировать</Button>
</WordPageStatus>
);
}

return (
<div className={styles.container}>
<WordPageStatus
title={t('title', { count: definitions?.length })}
icon={<SVGIconDefinitions />}
>
<Button theme={'transparent'} size="small">
<SVGIconPlus />
{t('addDefinition')}
</Button>
<Button size="small">Тренировать</Button>
</WordPageStatus>

{definitions?.length && <DefinitionsList items={definitions} />}
</div>
);
};

export default DefinitionPage;
1 change: 1 addition & 0 deletions src/1_pages/Definitions/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './DefinitionsPage';
24 changes: 22 additions & 2 deletions src/1_pages/Word/Word.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,36 @@
import { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';
import { IWord } from '@entities/word/model/types';
import { wordApi } from '@entities/word/api/wordApi';
import { DefinitionsWidget } from '@widgets/Definitions';
import WordInfo from '@widgets/WordMainInfo/WordInfo';
import WordCollection from '@widgets/WordCollection';
import Associations from '@widgets/Associations';
import Synonyms from '@widgets/SynonymsAntonyms/Synonyms';
import Antonyms from '@widgets/SynonymsAntonyms/Antonyms';
import Associations from '@widgets/Associations';
import WordCollection from '@widgets/WordCollection';
import styles from './Word.module.scss';

const Word = () => {
const { slugWord: wordId } = useParams();
const [word, setWord] = useState<IWord | null>(null);

useEffect(() => {
if (!wordId) return;
wordApi
.getWordById(wordId)
.then((data: IWord) =>
setWord((prevState) => (prevState ? { ...prevState, ...data } : data))
);
}, [wordId]);

return (
<div className={styles.container}>
<WordInfo />
<WordCollection />
<Associations />
{word?.definitions && wordId && (
<DefinitionsWidget count={'10'} items={word?.definitions} wordId={wordId} />
)}
<Synonyms />
<Antonyms />
</div>
Expand Down
9 changes: 6 additions & 3 deletions src/1_pages/index.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import { lazy } from 'react';
import { Route, Routes } from 'react-router-dom';
import MainLayout from '@widgets/MainLayout/MainLayout';
import {
ABOUT_ROUTE,
ALL_DEFINITIONS,
COLLECT_ROUTE,
EXERCISES_ROUTE,
FAVOR_ROUTE,
LANGS_ROUTE,
MAIN_ROUTE,
VOCAB_ROUTE,
WORD_ROUTE,
} from '../5_shared/lib/routes';
} from '@shared/lib/routes';
import MainLayout from '@widgets/MainLayout/MainLayout';

const Vocabulary = lazy(() => import('@pages/Vocabulary'));
const Word = lazy(() => import('@pages/Word'));
const NotFoundPage = lazy(() => import('@/1_pages/NotFoundPage/NotFoundPage'));
const NotFoundPage = lazy(() => import('@pages/NotFoundPage/NotFoundPage'));
const DefinitionsPage = lazy(() => import('@pages/Definitions'));

export const Routing = () => {
return (
Expand All @@ -28,6 +30,7 @@ export const Routing = () => {
<Route path={LANGS_ROUTE} element={<>Languages</>} />
<Route path={EXERCISES_ROUTE} element={<>Exercises</>} />
<Route path={WORD_ROUTE} element={<Word />} />
<Route path={WORD_ROUTE + ALL_DEFINITIONS} element={<DefinitionsPage />} />
<Route path={ABOUT_ROUTE} element={<>About</>} />
<Route path="*" element={<NotFoundPage />} />
</Route>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
@use '@styles/colors';
@import '@styles/mixins/font';

.definition {
margin-bottom: 1.6rem;
}

.inner {
display: flex;
justify-content: space-between;
align-items: center;
gap: 2.1rem;
}

.index {
@include font-source-sans(2rem, $neutral-text-middle-color, 500, 1.5);
margin: 0;
}

.content {
flex-grow: 1;
display: flex;
flex-direction: column;
gap: 0.7rem;
margin: 0;
@include font-source-sans(1rem, $neutral-text-main-color, 500, 1.25);
}

.copy {
margin: 0;
}

.translateTitle {
color: $neutrals-600;
}

.translate {
flex-grow: 1;
font-size: 1rem;
font-weight: 400;
line-height: 1.25;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { Examples } from './elements/Examples';
import { TDefinition } from '@entities/word/model/types';
import { CopyText, Popularity, ShadowBlock } from '@shared/ui';
import styles from './DefinitionItem.module.scss';

type TProps = {
item: TDefinition;
index: number;
};

export const DefinitionItem = ({ item, index }: TProps) => {
const { text, popularity, translation, examples } = item;

return (
<li className={styles.definition}>
<ShadowBlock bgColor="dark">
<div className={styles.inner}>
<p className={styles.index}>{index}</p>
<p className={styles.content}>
{text}
{popularity && <Popularity popularity={popularity} />}
</p>
<p className={styles.copy}>
<CopyText text={text} />
</p>
</div>
{translation && (
<div className={styles.inner}>
<p className={styles.translateTitle}>Перевод</p>
<p className={styles.translate}>{translation}</p>
<p className={styles.copy}>
<CopyText text={text} />
</p>
</div>
)}

{examples && <Examples list={examples} />}
</ShadowBlock>
</li>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
@import '@styles/mixins/font';

.list {
margin-top: 0.8rem;
}

.item {
display: flex;
gap: 2rem;
align-items: center;
justify-content: space-between;
margin-bottom: 0.75rem;
font-size: 0.875rem;
line-height: 1;
}

.marginTop {
margin-top: 1rem;
}

.header {
display: flex;
align-items: center;
gap: 1rem;
margin: 0;
}

.title {
display: flex;
align-items: center;
gap: 0.3rem;
@include font-source-sans(0.625rem, $neutrals-900, 400, 0.75);
text-transform: uppercase;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { useTranslation } from 'react-i18next';
import { CopyText, ShadowBlock } from '@shared/ui';
import SVGIconLink from '@shared/assets/icons/actions/link.svg?react';
import SVGIconArrow from '@shared/assets/icons/arrows/expand-filled.svg?react';
import styles from './Examples.module.scss';

type TExamples = {
list: string[];
};

export const Examples = ({ list }: TExamples) => {
const { t } = useTranslation('definition-page');

return (
<ShadowBlock addClass={styles.marginTop}>
<p className={styles.header}>
<SVGIconArrow />
<span className={styles.title}>
<SVGIconLink /> {t('relatedExamples')}
</span>
</p>
<ul className={styles.list}>
{list.map((item) => (
<li key={crypto.randomUUID()} className={styles.item}>
<span>{item}</span>
<CopyText text={item} />
</li>
))}
</ul>
</ShadowBlock>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { DefinitionItem } from './DefinitionItem';
Loading