1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00

refactored some common components

This commit is contained in:
Fedor Katurov 2023-11-20 22:29:13 +06:00
parent 5e9c111e0f
commit a9a220273f
67 changed files with 238 additions and 220 deletions

View file

@ -2,8 +2,8 @@ import React, { FC, MouseEventHandler, useEffect, useRef } from 'react';
import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock'; import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -8,7 +8,7 @@ import React, {
import classNames from 'classnames'; import classNames from 'classnames';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import { DivProps } from '~/utils/types'; import { DivProps } from '~/utils/types';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,9 +2,9 @@ import React, { FC } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { LoaderCircleInner } from '~/components/input/LoaderCircleInner';
import { SVGProps } from '~/utils/types'; import { SVGProps } from '~/utils/types';
import { LoaderCircleInner } from './components/LoaderCircleInner';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
interface IProps extends SVGProps { interface IProps extends SVGProps {

View file

@ -3,11 +3,11 @@ import React, { FC, useMemo } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Anchor } from '~/components/common/Anchor'; import { Anchor } from '~/components/common/Anchor';
import { MenuDots } from '~/components/common/MenuDots';
import { CellShade } from '~/components/flow/CellShade'; import { CellShade } from '~/components/flow/CellShade';
import { FlowCellImage } from '~/components/flow/FlowCellImage'; import { FlowCellImage } from '~/components/flow/FlowCellImage';
import { FlowCellMenu } from '~/components/flow/FlowCellMenu'; import { FlowCellMenu } from '~/components/flow/FlowCellMenu';
import { FlowCellText } from '~/components/flow/FlowCellText'; import { FlowCellText } from '~/components/flow/FlowCellText';
import { MenuDots } from '~/components/menu/MenuDots';
import { useClickOutsideFocus } from '~/hooks/dom/useClickOutsideFocus'; import { useClickOutsideFocus } from '~/hooks/dom/useClickOutsideFocus';
import { useWindowSize } from '~/hooks/dom/useWindowSize'; import { useWindowSize } from '~/hooks/dom/useWindowSize';
import { useFlowCellControls } from '~/hooks/flow/useFlowCellControls'; import { useFlowCellControls } from '~/hooks/flow/useFlowCellControls';

View file

@ -3,7 +3,7 @@ import React, { FC } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { Toggle } from '~/components/input/Toggle'; import { Toggle } from '~/components/input/Toggle';
import { FlowDisplayVariant } from '~/types'; import { FlowDisplayVariant } from '~/types';

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { Icon } from '~/components/common/Icon';
import { InfiniteScroll } from '~/components/common/InfiniteScroll'; import { InfiniteScroll } from '~/components/common/InfiniteScroll';
import { Icon } from '~/components/input/Icon';
import { INode } from '~/types'; import { INode } from '~/types';
import { FlowRecentItem } from '../FlowRecentItem'; import { FlowRecentItem } from '../FlowRecentItem';

View file

@ -6,8 +6,8 @@ import { Autoplay, EffectFade, Navigation } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/react'; import { Swiper, SwiperSlide } from 'swiper/react';
import SwiperClass from 'swiper/types/swiper-class'; import SwiperClass from 'swiper/types/swiper-class';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import { imagePresets, URLS } from '~/constants/urls'; import { imagePresets, URLS } from '~/constants/urls';
import { useWindowSize } from '~/hooks/dom/useWindowSize'; import { useWindowSize } from '~/hooks/dom/useWindowSize';
import { useNavigation } from '~/hooks/navigation/useNavigation'; import { useNavigation } from '~/hooks/navigation/useNavigation';

View file

@ -9,8 +9,8 @@ import React, {
import Tippy from '@tippyjs/react'; import Tippy from '@tippyjs/react';
import classnames from 'classnames'; import classnames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import { IIcon } from '~/types'; import { IIcon } from '~/types';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -1,22 +0,0 @@
import * as React from 'react';
import classNames from 'classnames';
const style = require('./style.scss');
interface IInfoProps {
text?: string;
children?: string;
level?: string;
}
export const Info: React.FunctionComponent<IInfoProps> = ({
text,
children,
level = 'normal',
}) => (
<div className={classNames(style.container, { [level]: true })}>
{
text || children || ''
}
</div>
);

View file

@ -1,28 +0,0 @@
@import 'src/styles/variables';
.container {
min-height: $info_height;
border-radius: $radius;
display: flex;
align-items: center;
justify-content: center;
font: $font_14_regular;
line-height: 1.2em;
padding: $gap;
background: $gray_90;
&:global(.danger) {
color: white;
background: $content_bg_danger;
}
&:global(.warning) {
color: white;
background: $content_bg_danger;
}
&:global(.primary) {
color: white;
background: $content_bg_danger;
}
}

View file

@ -10,7 +10,7 @@ import React, {
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { InputWrapper } from '~/components/input/InputWrapper'; import { InputWrapper } from '~/components/input/InputWrapper';
import { useTranslatedError } from '~/hooks/data/useTranslatedError'; import { useTranslatedError } from '~/hooks/data/useTranslatedError';
import { useFocusEvent } from '~/hooks/dom/useFocusEvent'; import { useFocusEvent } from '~/hooks/dom/useFocusEvent';
@ -50,17 +50,25 @@ const InputText: FC<InputTextProps> = ({
handler(target.value); handler(target.value);
}, },
[handler] [handler],
); );
const toggleRevealed = useCallback(() => setRevealed(!revealed), [setRevealed, revealed]); const toggleRevealed = useCallback(
() => setRevealed(!revealed),
[setRevealed, revealed],
);
const translatedError = useTranslatedError(error); const translatedError = useTranslatedError(error);
const type = props.type === 'password' && revealed ? 'text' : props.type; const type = props.type === 'password' && revealed ? 'text' : props.type;
return ( return (
<InputWrapper title={title} error={translatedError} focused={focused} notEmpty={!!value}> <InputWrapper
title={title}
error={translatedError}
focused={focused}
notEmpty={!!value}
>
<div <div
className={classNames(styles.input, { className={classNames(styles.input, {
[styles.has_error]: !!error, [styles.has_error]: !!error,
@ -83,7 +91,11 @@ const InputText: FC<InputTextProps> = ({
<div className={styles.suffix}> <div className={styles.suffix}>
{suffix} {suffix}
{props.type === 'password' && ( {props.type === 'password' && (
<Icon icon="eye" onClick={toggleRevealed} className={styles.reveal} /> <Icon
icon="eye"
onClick={toggleRevealed}
className={styles.reveal}
/>
)} )}
</div> </div>
)} )}

View file

@ -1,6 +1,6 @@
import React, { VFC } from 'react'; import React, { VFC } from 'react';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { InputText, InputTextProps } from '~/components/input/InputText'; import { InputText, InputTextProps } from '~/components/input/InputText';
interface SearchInputProps extends Omit<InputTextProps, 'prefix' | 'suffix'> {} interface SearchInputProps extends Omit<InputTextProps, 'prefix' | 'suffix'> {}

View file

@ -5,7 +5,7 @@ import classNames from 'classnames';
import { Filler } from '~/components/common/Filler'; import { Filler } from '~/components/common/Filler';
import { Grid } from '~/components/common/Grid'; import { Grid } from '~/components/common/Grid';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from '~/components/placeholders/Placeholder';
import { URLS } from '~/constants/urls'; import { URLS } from '~/constants/urls';
import { useNavigation } from '~/hooks/navigation/useNavigation'; import { useNavigation } from '~/hooks/navigation/useNavigation';

View file

@ -1,7 +1,7 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from 'react';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from '~/components/placeholders/Placeholder';
import { URLS } from '~/constants/urls'; import { URLS } from '~/constants/urls';
import { useNavigation } from '~/hooks/navigation/useNavigation'; import { useNavigation } from '~/hooks/navigation/useNavigation';

View file

@ -3,7 +3,7 @@ import React, { FC } from 'react';
import Tippy from '@tippyjs/react'; import Tippy from '@tippyjs/react';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from '~/components/placeholders/Placeholder';
import { NodeComponentProps } from '~/constants/node'; import { NodeComponentProps } from '~/constants/node';
import { useGotoNode } from '~/hooks/node/useGotoNode'; import { useGotoNode } from '~/hooks/node/useGotoNode';

View file

@ -2,7 +2,7 @@ import React, { memo, useCallback, useMemo } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { InputText } from '~/components/input/InputText'; import { InputText } from '~/components/input/InputText';
import { PlayerState } from '~/constants/player'; import { PlayerState } from '~/constants/player';
import { IFile } from '~/types'; import { IFile } from '~/types';
@ -17,11 +17,20 @@ type Props = {
onTitleChange?: (file_id: IFile['id'], title: string) => void; onTitleChange?: (file_id: IFile['id'], title: string) => void;
}; };
const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) => { const AudioPlayer = memo(
const { toPercent, file: currentFile, setFile, play, status, progress, pause } = useAudioPlayer(); ({ file, onDelete, isEditing, onTitleChange }: Props) => {
const {
toPercent,
file: currentFile,
setFile,
play,
status,
progress,
pause,
} = useAudioPlayer();
const onPlay = useCallback( const onPlay = useCallback(
async event => { async (event) => {
event.stopPropagation(); event.stopPropagation();
if (file.id !== currentFile?.id) { if (file.id !== currentFile?.id) {
@ -32,17 +41,17 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) =
status === PlayerState.PLAYING ? pause() : await play(); status === PlayerState.PLAYING ? pause() : await play();
}, },
[play, pause, setFile, file, currentFile, status] [play, pause, setFile, file, currentFile, status],
); );
const onSeek = useCallback( const onSeek = useCallback(
event => { (event) => {
event.stopPropagation(); event.stopPropagation();
const { clientX, target } = event; const { clientX, target } = event;
const { left, width } = target.getBoundingClientRect(); const { left, width } = target.getBoundingClientRect();
toPercent(((clientX - left) / width) * 100); toPercent(((clientX - left) / width) * 100);
}, },
[toPercent] [toPercent],
); );
const onDropClick = useCallback(() => { const onDropClick = useCallback(() => {
@ -55,10 +64,12 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) =
() => () =>
(file.metadata && (file.metadata &&
(file.metadata.title || (file.metadata.title ||
[file.metadata.id3artist, file.metadata.id3title].filter(el => el).join(' - '))) || [file.metadata.id3artist, file.metadata.id3title]
.filter((el) => el)
.join(' - '))) ||
file.orig_name || file.orig_name ||
'', '',
[file.metadata, file.orig_name] [file.metadata, file.orig_name],
); );
const onRename = useCallback( const onRename = useCallback(
@ -67,18 +78,18 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) =
onTitleChange(file.id, val); onTitleChange(file.id, val);
}, },
[onTitleChange, file.id] [onTitleChange, file.id],
); );
const stopPropagation = useCallback( const stopPropagation = useCallback(
event => { (event) => {
if (!isEditing) { if (!isEditing) {
return; return;
} }
event.stopPropagation(); event.stopPropagation();
}, },
[isEditing] [isEditing],
); );
const playing = currentFile?.id === file.id; const playing = currentFile?.id === file.id;
@ -95,8 +106,16 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) =
</div> </div>
)} )}
<div className={styles.playpause} onClick={onPlay} onMouseDown={stopPropagation}> <div
{playing && status === PlayerState.PLAYING ? <Icon icon="pause" /> : <Icon icon="play" />} className={styles.playpause}
onClick={onPlay}
onMouseDown={stopPropagation}
>
{playing && status === PlayerState.PLAYING ? (
<Icon icon="pause" />
) : (
<Icon icon="play" />
)}
</div> </div>
{isEditing ? ( {isEditing ? (
@ -124,6 +143,7 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) =
)} )}
</div> </div>
); );
}); },
);
export { AudioPlayer }; export { AudioPlayer };

View file

@ -8,9 +8,9 @@ import React, {
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/common/Icon';
import { ImageWithSSRLoad } from '~/components/common/ImageWithSSRLoad'; import { ImageWithSSRLoad } from '~/components/common/ImageWithSSRLoad';
import { Icon } from '~/components/input/Icon'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import { LoaderCircle } from '~/components/input/LoaderCircle';
import { DEFAULT_DOMINANT_COLOR } from '~/constants/node'; import { DEFAULT_DOMINANT_COLOR } from '~/constants/node';
import { imagePresets } from '~/constants/urls'; import { imagePresets } from '~/constants/urls';
import { useResizeHandler } from '~/hooks/dom/useResizeHandler'; import { useResizeHandler } from '~/hooks/dom/useResizeHandler';

View file

@ -1,6 +1,6 @@
import React, { useCallback, useState, VFC } from 'react'; import React, { useCallback, useState, VFC } from 'react';
import { MenuDots } from '~/components/common/MenuDots'; import { MenuDots } from '~/components/menu/MenuDots';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,7 +2,7 @@ import React, { PropsWithChildren } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from '~/components/placeholders/Placeholder';
import { DivProps } from '~/utils/types'; import { DivProps } from '~/utils/types';

View file

@ -4,7 +4,7 @@ import { Placement } from '@popperjs/core';
import classNames from 'classnames'; import classNames from 'classnames';
import { usePopper } from 'react-popper'; import { usePopper } from 'react-popper';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { useFocusEvent } from '~/hooks/dom/useFocusEvent'; import { useFocusEvent } from '~/hooks/dom/useFocusEvent';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,7 +2,7 @@ import React, { FC } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { ButtonProps } from '~/utils/types'; import { ButtonProps } from '~/utils/types';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
@ -10,7 +10,11 @@ interface MenuItemWithIconProps {
onClick?: () => void; onClick?: () => void;
} }
const MenuItemWithIcon: FC<MenuItemWithIconProps> = ({ children, icon, onClick }) => ( const MenuItemWithIcon: FC<MenuItemWithIconProps> = ({
children,
icon,
onClick,
}) => (
<button className={styles.item} onClick={onClick}> <button className={styles.item} onClick={onClick}>
{icon && ( {icon && (
<div className={styles.icon}> <div className={styles.icon}>

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { Icon } from '~/components/common/Icon';
import { WithDescription } from '~/components/common/WithDescription'; import { WithDescription } from '~/components/common/WithDescription';
import { Icon } from '~/components/input/Icon';
interface BacklinkProps { interface BacklinkProps {
icon?: string; icon?: string;

View file

@ -2,7 +2,7 @@ import React, { VFC } from 'react';
import Tippy from '@tippyjs/react'; import Tippy from '@tippyjs/react';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { MenuButton } from '~/components/menu/MenuButton'; import { MenuButton } from '~/components/menu/MenuButton';
import { MenuItemWithIcon } from '~/components/menu/MenuItemWithIcon'; import { MenuItemWithIcon } from '~/components/menu/MenuItemWithIcon';
import { SeparatedMenu } from '~/components/menu/SeparatedMenu'; import { SeparatedMenu } from '~/components/menu/SeparatedMenu';

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,7 +2,7 @@ import React, { FC } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,9 +2,9 @@ import { FC, memo, useEffect, useMemo, useRef, useState } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/common/Icon';
import { ImageWithSSRLoad } from '~/components/common/ImageWithSSRLoad'; import { ImageWithSSRLoad } from '~/components/common/ImageWithSSRLoad';
import { Square } from '~/components/common/Square'; import { Square } from '~/components/common/Square';
import { Icon } from '~/components/input/Icon';
import { imagePresets } from '~/constants/urls'; import { imagePresets } from '~/constants/urls';
import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString'; import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString';
import { useGotoNode } from '~/hooks/node/useGotoNode'; import { useGotoNode } from '~/hooks/node/useGotoNode';

View file

@ -1,6 +1,6 @@
import React, { useMemo, VFC } from 'react'; import React, { useMemo, VFC } from 'react';
import { CornerMenu } from '~/components/common/CornerMenu'; import { CornerMenu } from '~/components/menu/CornerMenu';
interface NoteMenuProps { interface NoteMenuProps {
onEdit: () => void; onEdit: () => void;
@ -16,7 +16,7 @@ const NoteMenu: VFC<NoteMenuProps> = ({ onEdit, onDelete }) => {
}, },
{ title: 'Удалить', action: onDelete }, { title: 'Удалить', action: onDelete },
], ],
[onEdit, onDelete] [onEdit, onDelete],
); );
return <CornerMenu actions={actions} />; return <CornerMenu actions={actions} />;

View file

@ -2,7 +2,7 @@ import React, { FC, useCallback } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,7 +2,7 @@ import React, { FC, useCallback } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,8 +2,8 @@ import React, { FC, useCallback } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { ArcProgress } from '~/components/input/ArcProgress'; import { ArcProgress } from '~/components/common/ArcProgress';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
@ -16,7 +16,13 @@ interface IProps {
uploading?: boolean; uploading?: boolean;
} }
const AudioUpload: FC<IProps> = ({ title, progress, uploading, id, onDrop }) => { const AudioUpload: FC<IProps> = ({
title,
progress,
uploading,
id,
onDrop,
}) => {
const onDropFile = useCallback(() => { const onDropFile = useCallback(() => {
if (!id || !onDrop) return; if (!id || !onDrop) return;
onDrop(id); onDrop(id);

View file

@ -2,8 +2,8 @@ import React, { FC, useCallback } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { ArcProgress } from '~/components/input/ArcProgress'; import { ArcProgress } from '~/components/common/ArcProgress';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { IFile } from '~/types'; import { IFile } from '~/types';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
@ -17,7 +17,13 @@ interface IProps {
uploading?: boolean; uploading?: boolean;
} }
const ImageUpload: FC<IProps> = ({ thumb, progress, uploading, id, onDrop }) => { const ImageUpload: FC<IProps> = ({
thumb,
progress,
uploading,
id,
onDrop,
}) => {
const onDropFile = useCallback(() => { const onDropFile = useCallback(() => {
if (!id || !onDrop) return; if (!id || !onDrop) return;
onDrop(id); onDrop(id);
@ -32,7 +38,12 @@ const ImageUpload: FC<IProps> = ({ thumb, progress, uploading, id, onDrop }) =>
)} )}
<div className={classNames(styles.thumb_wrap, { uploading: uploading })}> <div className={classNames(styles.thumb_wrap, { uploading: uploading })}>
{thumb && <div className={styles.thumb} style={{ backgroundImage: `url("${thumb}")` }} />} {thumb && (
<div
className={styles.thumb}
style={{ backgroundImage: `url("${thumb}")` }}
/>
)}
{uploading && ( {uploading && (
<div className={styles.progress}> <div className={styles.progress}>
<ArcProgress size={72} progress={progress} /> <ArcProgress size={72} progress={progress} />

View file

@ -4,7 +4,7 @@ import classnames from 'classnames';
import classNames from 'classnames'; import classNames from 'classnames';
import Dropzone from 'react-dropzone'; import Dropzone from 'react-dropzone';
import { DropHereIcon } from '~/components/input/DropHereIcon'; import { DropHereIcon } from '~/components/common/DropHereIcon';
import { useDragDetector } from '~/hooks/dom/useDragDetector'; import { useDragDetector } from '~/hooks/dom/useDragDetector';
import { DivProps } from '~/utils/types'; import { DivProps } from '~/utils/types';

View file

@ -4,7 +4,7 @@ import TelegramLoginButton, {
TelegramUser, TelegramUser,
} from '@v9v/ts-react-telegram-login'; } from '@v9v/ts-react-telegram-login';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -1,8 +1,8 @@
import React, { VFC } from 'react'; import React, { VFC } from 'react';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/common/Icon';
import { Button } from '~/components/input/Button'; import { Button } from '~/components/input/Button';
import { Icon } from '~/components/input/Icon';
import { ERROR_LITERAL, ERRORS } from '~/constants/errors'; import { ERROR_LITERAL, ERRORS } from '~/constants/errors';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -1,8 +1,8 @@
import React, { VFC } from 'react'; import React, { VFC } from 'react';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/common/Icon';
import { Button } from '~/components/input/Button'; import { Button } from '~/components/input/Button';
import { Icon } from '~/components/input/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -1,8 +1,8 @@
import React, { VFC } from 'react'; import React, { VFC } from 'react';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/common/Icon';
import { Button } from '~/components/input/Button'; import { Button } from '~/components/input/Button';
import { Icon } from '~/components/input/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -1,7 +1,7 @@
import { FC, ReactNode } from 'react'; import { FC, ReactNode } from 'react';
import { Icon } from '~/components/common/Icon';
import { WithDescription } from '~/components/common/WithDescription'; import { WithDescription } from '~/components/common/WithDescription';
import { Icon } from '~/components/input/Icon';
interface Props { interface Props {
icon: string; icon: string;

View file

@ -1,7 +1,7 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from 'react';
import { Icon } from '~/components/common/Icon';
import { Button } from '~/components/input/Button'; import { Button } from '~/components/input/Button';
import { Icon } from '~/components/input/Icon';
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from '~/types/node';

View file

@ -1,7 +1,7 @@
import React, { ChangeEvent, FC, useCallback } from 'react'; import React, { ChangeEvent, FC, useCallback } from 'react';
import { Icon } from '~/components/common/Icon';
import { Button } from '~/components/input/Button'; import { Button } from '~/components/input/Button';
import { Icon } from '~/components/input/Icon';
import { UploadType } from '~/constants/uploads'; import { UploadType } from '~/constants/uploads';
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from '~/types/node';

View file

@ -1,6 +1,6 @@
import React, { ChangeEvent, FC, useCallback, useEffect } from 'react'; import React, { ChangeEvent, FC, useCallback, useEffect } from 'react';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { UploadSubject, UploadTarget, UploadType } from '~/constants/uploads'; import { UploadSubject, UploadTarget, UploadType } from '~/constants/uploads';
import { imagePresets } from '~/constants/urls'; import { imagePresets } from '~/constants/urls';
import { useUploader } from '~/hooks/data/useUploader'; import { useUploader } from '~/hooks/data/useUploader';

View file

@ -2,8 +2,8 @@ import React, { FC, useCallback } from 'react';
import { observer } from 'mobx-react-lite'; import { observer } from 'mobx-react-lite';
import { LoaderCircle } from '~/components/common/LoaderCircle';
import { ModalWrapper } from '~/components/common/ModalWrapper'; import { ModalWrapper } from '~/components/common/ModalWrapper';
import { LoaderCircle } from '~/components/input/LoaderCircle';
import { EditorDialog } from '~/containers/dialogs/EditorDialog'; import { EditorDialog } from '~/containers/dialogs/EditorDialog';
import { useLoadNode } from '~/hooks/node/useLoadNode'; import { useLoadNode } from '~/hooks/node/useLoadNode';
import { useUpdateNode } from '~/hooks/node/useUpdateNode'; import { useUpdateNode } from '~/hooks/node/useUpdateNode';

View file

@ -1,6 +1,6 @@
import React, { VFC } from 'react'; import React, { VFC } from 'react';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -3,10 +3,10 @@ import React, { FC, FormEvent, useCallback, useMemo } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/common/Icon';
import { Superpower } from '~/components/common/Superpower'; import { Superpower } from '~/components/common/Superpower';
import { FlowRecent } from '~/components/flow/FlowRecent'; import { FlowRecent } from '~/components/flow/FlowRecent';
import { FlowSearchResults } from '~/components/flow/FlowSearchResults'; import { FlowSearchResults } from '~/components/flow/FlowSearchResults';
import { Icon } from '~/components/input/Icon';
import { InputText } from '~/components/input/InputText'; import { InputText } from '~/components/input/InputText';
import { Toggle } from '~/components/input/Toggle'; import { Toggle } from '~/components/input/Toggle';
import { experimentalFeatures } from '~/constants/features'; import { experimentalFeatures } from '~/constants/features';

View file

@ -2,7 +2,7 @@ import React, { FC, useCallback, useState } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { Dialog } from '~/constants/modal'; import { Dialog } from '~/constants/modal';
import { useShowModal } from '~/hooks/modal/useShowModal'; import { useShowModal } from '~/hooks/modal/useShowModal';
@ -23,7 +23,7 @@ const SubmitBar: FC<SubmitBarProps> = ({ isLab }) => {
(type: string) => () => { (type: string) => () => {
showModal({ type, isInLab: !!isLab }); showModal({ type, isInLab: !!isLab });
}, },
[isLab, showModal] [isLab, showModal],
); );
const icon = isLab ? 'lab' : 'plus'; const icon = isLab ? 'lab' : 'plus';
@ -48,7 +48,12 @@ const SubmitBar: FC<SubmitBarProps> = ({ isLab }) => {
</button> </button>
</div> </div>
<button className={styles.button} onFocus={onFocus} onBlur={onBlur} type="button"> <button
className={styles.button}
onFocus={onFocus}
onBlur={onBlur}
type="button"
>
<Icon icon={icon} /> <Icon icon={icon} />
</button> </button>
</div> </div>

View file

@ -1,19 +1,18 @@
import React, { FC, memo, useMemo } from 'react'; import React, { FC, memo, useMemo } from 'react';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { ICommentBlockProps } from '~/constants/comment'; import { ICommentBlockProps } from '~/constants/comment';
import { useYoutubeMetadata } from '~/hooks/metadata/useYoutubeMetadata'; import { useYoutubeMetadata } from '~/hooks/metadata/useYoutubeMetadata';
import { getYoutubeThumb } from '~/utils/dom'; import { getYoutubeThumb } from '~/utils/dom';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
type Props = ICommentBlockProps & {}; type Props = ICommentBlockProps & {};
const CommentEmbedBlock: FC<Props> = memo(({ block }) => { const CommentEmbedBlock: FC<Props> = memo(({ block }) => {
const id = useMemo(() => { const id = useMemo(() => {
const match = block.content.match( const match = block.content.match(
/https?:\/\/(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch)?(?:\?v=)?([\w\-=]+)/ /https?:\/\/(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch)?(?:\?v=)?([\w\-=]+)/,
); );
return (match && match[1]) || ''; return (match && match[1]) || '';
@ -21,7 +20,10 @@ const CommentEmbedBlock: FC<Props> = memo(({ block }) => {
const url = useMemo(() => `https://youtube.com/watch?v=${id}`, [id]); const url = useMemo(() => `https://youtube.com/watch?v=${id}`, [id]);
const preview = useMemo(() => getYoutubeThumb(block.content), [block.content]); const preview = useMemo(
() => getYoutubeThumb(block.content),
[block.content],
);
const metadata = useYoutubeMetadata(id); const metadata = useYoutubeMetadata(id);
const title = metadata?.metadata?.title || ''; const title = metadata?.metadata?.title || '';

View file

@ -3,7 +3,7 @@ import { FC } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Hoverable } from '~/components/common/Hoverable'; import { Hoverable } from '~/components/common/Hoverable';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { imagePresets } from '~/constants/urls'; import { imagePresets } from '~/constants/urls';
import { IFile } from '~/types'; import { IFile } from '~/types';
import { getURL } from '~/utils/dom'; import { getURL } from '~/utils/dom';

View file

@ -2,7 +2,7 @@ import React, { FC } from 'react';
import classnames from 'classnames'; import classnames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -1,6 +1,6 @@
import React, { FC, useMemo } from 'react'; import React, { FC, useMemo } from 'react';
import { CornerMenu } from '~/components/common/CornerMenu'; import { CornerMenu } from '~/components/menu/CornerMenu';
interface IProps { interface IProps {
onEdit: () => void; onEdit: () => void;
@ -16,7 +16,7 @@ const CommentMenu: FC<IProps> = ({ onEdit, onDelete }) => {
}, },
{ title: 'Удалить', action: onDelete }, { title: 'Удалить', action: onDelete },
], ],
[onEdit, onDelete] [onEdit, onDelete],
); );
return <CornerMenu actions={actions} />; return <CornerMenu actions={actions} />;

View file

@ -3,9 +3,9 @@ import { FC, useCallback, useEffect } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { isAfter, parseISO } from 'date-fns'; import { isAfter, parseISO } from 'date-fns';
import { LoaderScreen } from '~/components/common/LoaderScreen';
import { Button } from '~/components/input/Button'; import { Button } from '~/components/input/Button';
import { InputRow } from '~/components/input/InputRow'; import { InputRow } from '~/components/input/InputRow';
import { LoaderScreen } from '~/components/input/LoaderScreen';
import { NotificationComment } from '~/components/notifications/NotificationComment'; import { NotificationComment } from '~/components/notifications/NotificationComment';
import { NotificationNode } from '~/components/notifications/NotificationNode'; import { NotificationNode } from '~/components/notifications/NotificationNode';
import { useNotificationsList } from '~/hooks/notifications/useNotificationsList'; import { useNotificationsList } from '~/hooks/notifications/useNotificationsList';

View file

@ -1,6 +1,6 @@
import React, { useCallback, VFC } from 'react'; import React, { useCallback, VFC } from 'react';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/common/Icon';
import { PlayerState } from '~/constants/player'; import { PlayerState } from '~/constants/player';
import { IFile } from '~/types'; import { IFile } from '~/types';
import { PlayerProgress } from '~/types/player'; import { PlayerProgress } from '~/types/player';
@ -33,13 +33,13 @@ const PlayerBar: VFC<Props> = ({
}, [playerPlay, playerPause, status]); }, [playerPlay, playerPause, status]);
const onSeek = useCallback( const onSeek = useCallback(
event => { (event) => {
event.stopPropagation(); event.stopPropagation();
const { clientX, target } = event; const { clientX, target } = event;
const { left, width } = target.getBoundingClientRect(); const { left, width } = target.getBoundingClientRect();
playerSeek(((clientX - left) / width) * 100); playerSeek(((clientX - left) / width) * 100);
}, },
[playerSeek] [playerSeek],
); );
if (status === PlayerState.UNSET) return null; if (status === PlayerState.UNSET) return null;
@ -47,21 +47,29 @@ const PlayerBar: VFC<Props> = ({
const metadata: IFile['metadata'] = path(['metadata'], file); const metadata: IFile['metadata'] = path(['metadata'], file);
const title = const title =
metadata && metadata &&
(metadata.title || [metadata.id3artist, metadata.id3title].filter(el => !!el).join(' - ')); (metadata.title ||
[metadata.id3artist, metadata.id3title].filter((el) => !!el).join(' - '));
return ( return (
<div className={styles.place}> <div className={styles.place}>
<div className={styles.wrap}> <div className={styles.wrap}>
<div className={styles.status}> <div className={styles.status}>
<div className={styles.playpause} onClick={onClick}> <div className={styles.playpause} onClick={onClick}>
{status === PlayerState.PLAYING ? <Icon icon="pause" /> : <Icon icon="play" />} {status === PlayerState.PLAYING ? (
<Icon icon="pause" />
) : (
<Icon icon="play" />
)}
</div> </div>
<div className={styles.info}> <div className={styles.info}>
<div className={styles.title}>{title}</div> <div className={styles.title}>{title}</div>
<div className={styles.progress} onClick={onSeek}> <div className={styles.progress} onClick={onSeek}>
<div className={styles.bar} style={{ width: `${progress.progress}%` }} /> <div
className={styles.bar}
style={{ width: `${progress.progress}%` }}
/>
</div> </div>
</div> </div>

View file

@ -1,8 +1,8 @@
import React, { FC, Fragment } from 'react'; import React, { FC, Fragment } from 'react';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/common/Icon';
import { Button } from '~/components/input/Button'; import { Button } from '~/components/input/Button';
import { Icon } from '~/components/input/Icon';
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from '~/components/placeholders/Placeholder';
import { SOCIAL_ICONS } from '~/constants/auth/socials'; import { SOCIAL_ICONS } from '~/constants/auth/socials';
import { useOAuth } from '~/hooks/auth/useOAuth'; import { useOAuth } from '~/hooks/auth/useOAuth';

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from '~/components/common/LoaderCircle';
import styles from './styles.module.scss'; import styles from './styles.module.scss';

View file

@ -2,9 +2,9 @@ import React, { VFC } from 'react';
import { Filler } from '~/components/common/Filler'; import { Filler } from '~/components/common/Filler';
import { Group } from '~/components/common/Group'; import { Group } from '~/components/common/Group';
import { Icon } from '~/components/common/Icon';
import { Padder } from '~/components/common/Padder'; import { Padder } from '~/components/common/Padder';
import { FlowRecentItem } from '~/components/flow/FlowRecentItem'; import { FlowRecentItem } from '~/components/flow/FlowRecentItem';
import { Icon } from '~/components/input/Icon';
import { InputText } from '~/components/input/InputText'; import { InputText } from '~/components/input/InputText';
import { HorizontalMenu } from '~/components/menu/HorizontalMenu'; import { HorizontalMenu } from '~/components/menu/HorizontalMenu';
import { useFlowStore } from '~/store/flow/useFlowStore'; import { useFlowStore } from '~/store/flow/useFlowStore';

View file

@ -1,7 +1,7 @@
import { useMemo, VFC } from 'react'; import { useMemo, VFC } from 'react';
import { Icon } from '~/components/common/Icon';
import { InfiniteScroll } from '~/components/common/InfiniteScroll'; import { InfiniteScroll } from '~/components/common/InfiniteScroll';
import { Icon } from '~/components/input/Icon';
import { SidebarStack } from '~/components/sidebar/SidebarStack'; import { SidebarStack } from '~/components/sidebar/SidebarStack';
import { SidebarStackCard } from '~/components/sidebar/SidebarStackCard'; import { SidebarStackCard } from '~/components/sidebar/SidebarStackCard';
import { SidebarWrapper } from '~/components/sidebar/SidebarWrapper'; import { SidebarWrapper } from '~/components/sidebar/SidebarWrapper';