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

removed player reducer, migrated to CRA 5

This commit is contained in:
Fedor Katurov 2022-01-07 18:32:22 +07:00
parent 88f8fe21f7
commit 558e8f8a4f
211 changed files with 7131 additions and 10318 deletions

View file

@ -1,5 +1,4 @@
const CracoAlias = require('craco-alias'); const CracoAlias = require('craco-alias');
const fastRefreshCracoPlugin = require('craco-fast-refresh');
module.exports = { module.exports = {
webpack: { webpack: {
@ -9,6 +8,19 @@ module.exports = {
output: { output: {
publicPath: '/', publicPath: '/',
}, },
rules: [
{
test: /\.(svg)$/,
use: [
{
loader: 'file-loader',
options: {
name: 'images/[hash]-[name].[ext]',
},
},
],
},
],
}, },
eslint: { eslint: {
enable: false, enable: false,
@ -48,7 +60,6 @@ module.exports = {
}, },
}, },
plugins: [ plugins: [
{ plugin: fastRefreshCracoPlugin },
{ {
plugin: CracoAlias, plugin: CracoAlias,
options: { options: {

View file

@ -16,6 +16,7 @@
"color2k": "^1.2.4", "color2k": "^1.2.4",
"connected-react-router": "^6.5.2", "connected-react-router": "^6.5.2",
"date-fns": "^2.4.1", "date-fns": "^2.4.1",
"file-loader": "^6.2.0",
"flexbin": "^0.2.0", "flexbin": "^0.2.0",
"formik": "^2.2.6", "formik": "^2.2.6",
"insane": "^2.6.2", "insane": "^2.6.2",
@ -36,10 +37,10 @@
"react-redux": "^7.2.2", "react-redux": "^7.2.2",
"react-router": "^5.1.2", "react-router": "^5.1.2",
"react-router-dom": "^5.1.2", "react-router-dom": "^5.1.2",
"react-scripts": "3.4.4", "react-scripts": "^5.0.0",
"react-sortable-hoc": "^2.0.0", "react-sortable-hoc": "^2.0.0",
"react-sticky-box": "^0.9.3", "react-sticky-box": "^0.9.3",
"redux": "^4.0.1", "redux": "^4.1.2",
"redux-persist": "^5.10.0", "redux-persist": "^5.10.0",
"redux-saga": "^1.1.1", "redux-saga": "^1.1.1",
"sticky-sidebar": "^3.3.1", "sticky-sidebar": "^3.3.1",
@ -47,7 +48,6 @@
"swr": "^1.0.1", "swr": "^1.0.1",
"throttle-debounce": "^2.1.0", "throttle-debounce": "^2.1.0",
"typescript": "^4.0.5", "typescript": "^4.0.5",
"typograf": "^6.11.3",
"uuid4": "^1.1.4", "uuid4": "^1.1.4",
"web-vitals": "^0.2.4", "web-vitals": "^0.2.4",
"yup": "^0.32.9" "yup": "^0.32.9"
@ -55,8 +55,8 @@
"scripts": { "scripts": {
"start": "craco start", "start": "craco start",
"build": "craco build", "build": "craco build",
"test": "craco test", "ts-check": "tsc -p tsconfig.json --noEmit",
"ts-check": "tsc -p tsconfig.json --noEmit" "lint": "eslint . --ext .js,.jsx,.ts,.tsx"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
@ -76,7 +76,7 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@craco/craco": "5.8.0", "@craco/craco": "^6.4.3",
"@types/classnames": "^2.2.7", "@types/classnames": "^2.2.7",
"@types/marked": "^1.2.2", "@types/marked": "^1.2.2",
"@types/node": "^11.13.22", "@types/node": "^11.13.22",
@ -84,8 +84,7 @@
"@types/react-redux": "^7.1.11", "@types/react-redux": "^7.1.11",
"@types/throttle-debounce": "^2.1.0", "@types/throttle-debounce": "^2.1.0",
"@types/yup": "^0.29.11", "@types/yup": "^0.29.11",
"craco-alias": "^2.1.1", "craco-alias": "^2.3.1",
"craco-fast-refresh": "^1.0.2",
"prettier": "^1.18.2" "prettier": "^1.18.2"
} }
} }

View file

@ -1,6 +1,6 @@
import { api, cleanResult } from '~/utils/api'; import { api, cleanResult } from '~/utils/api';
import { API } from '~/constants/api'; import { API } from '~/constants/api';
import { ApiGetEmbedYoutubeResult } from '~/redux/player/types'; import { ApiGetEmbedYoutubeResult } from '~/api/metadata/types';
export const apiGetEmbedYoutube = (ids: string[]) => export const apiGetEmbedYoutube = (ids: string[]) =>
api api

View file

@ -0,0 +1,3 @@
import { EmbedMetadata } from '~/types/metadata';
export type ApiGetEmbedYoutubeResult = { items: Record<string, EmbedMetadata> };

View file

@ -1,12 +1,13 @@
import React, { useCallback, useEffect, useState, VFC } from 'react'; import React, { useCallback, VFC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { PlayerState } from '~/redux/player/constants'; import { PlayerState } from "~/constants/player";
import { path } from 'ramda'; import { path } from "ramda";
import { IPlayerProgress, Player } from '~/utils/player'; import { IFile } from "~/redux/types";
import { IFile } from '~/redux/types'; import { PlayerProgress } from "~/types/player";
interface Props { interface Props {
progress: PlayerProgress;
status: PlayerState; status: PlayerState;
file?: IFile; file?: IFile;
playerPlay: () => void; playerPlay: () => void;
@ -21,41 +22,24 @@ const PlayerBar: VFC<Props> = ({
playerPause, playerPause,
playerSeek, playerSeek,
playerStop, playerStop,
progress,
file, file,
}) => { }) => {
const [progress, setProgress] = useState<IPlayerProgress>({ progress: 0, current: 0, total: 0 });
const onClick = useCallback(() => { const onClick = useCallback(() => {
if (status === PlayerState.PLAYING) return playerPause(); if (status === PlayerState.PLAYING) return playerPause();
return playerPlay(); return playerPlay();
}, [playerPlay, playerPause, status]); }, [playerPlay, playerPause, status]);
const onProgress = useCallback(
({ detail }: { detail: IPlayerProgress }) => {
if (!detail || !detail.total) return;
setProgress(detail);
},
[setProgress]
);
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); playerSeek(((clientX - left) / width) * 100);
}, },
[playerSeek] [playerSeek]
); );
useEffect(() => {
Player.on('playprogress', onProgress);
return () => {
Player.off('playprogress', onProgress);
};
}, [onProgress]);
if (status === PlayerState.UNSET) return null; if (status === PlayerState.UNSET) return null;
const metadata: IFile['metadata'] = path(['metadata'], file); const metadata: IFile['metadata'] = path(['metadata'], file);

View file

@ -1,9 +1,9 @@
import React, { FC, useCallback, useState } from 'react'; import React, { FC, useCallback, useState } from "react";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { Link } from 'react-router-dom'; import { Link } from "react-router-dom";
import classNames from 'classnames'; import classNames from "classnames";
import { useRouteMatch } from 'react-router'; import { useRouteMatch } from "react-router";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface Props { interface Props {
isLab?: boolean; isLab?: boolean;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
interface Props { interface Props {
icon: string; icon: string;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { BorisContactItem } from '~/components/boris/BorisContactItem'; import { BorisContactItem } from "~/components/boris/BorisContactItem";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface Props {} interface Props {}

View file

@ -1,11 +1,11 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from '~/layouts/BorisLayout/styles.module.scss'; import styles from "~/layouts/BorisLayout/styles.module.scss";
import { BorisSuperpowers } from '~/components/boris/BorisSuperpowers'; import { BorisSuperpowers } from "~/components/boris/BorisSuperpowers";
import { BorisContacts } from '~/components/boris/BorisContacts'; import { BorisContacts } from "~/components/boris/BorisContacts";
import { BorisStats } from '~/components/boris/BorisStats'; import { BorisStats } from "~/components/boris/BorisStats";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { IUser } from '~/redux/auth/types'; import { IUser } from "~/redux/auth/types";
import { BorisUsageStats } from '~/types/boris'; import { BorisUsageStats } from "~/types/boris";
interface Props { interface Props {
user: IUser; user: IUser;

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { BorisUsageStats } from '~/types/boris'; import { BorisUsageStats } from "~/types/boris";
import { BorisStatsGit } from '../BorisStatsGit'; import { BorisStatsGit } from "../BorisStatsGit";
import { BorisStatsBackend } from '../BorisStatsBackend'; import { BorisStatsBackend } from "../BorisStatsBackend";
interface IProps { interface IProps {
stats: BorisUsageStats; stats: BorisUsageStats;

View file

@ -1,9 +1,9 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { StatBackend } from '~/types/boris'; import { StatBackend } from "~/types/boris";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { sizeOf } from '~/utils/dom'; import { sizeOf } from "~/utils/dom";
import { StatsRow } from '~/components/common/StatsRow'; import { StatsRow } from "~/components/common/StatsRow";
import { SubTitle } from '~/components/common/SubTitle'; import { SubTitle } from "~/components/common/SubTitle";
interface IProps { interface IProps {
stats: StatBackend; stats: StatBackend;

View file

@ -1,8 +1,8 @@
import React, { FC, useMemo } from 'react'; import React, { FC, useMemo } from "react";
import { GithubIssue } from '~/types/boris'; import { GithubIssue } from "~/types/boris";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from "~/components/placeholders/Placeholder";
import { BorisStatsGitCard } from '../BorisStatsGitCard'; import { BorisStatsGitCard } from "../BorisStatsGitCard";
interface IProps { interface IProps {
issues: GithubIssue[]; issues: GithubIssue[];

View file

@ -1,8 +1,8 @@
import React, { FC, useMemo } from 'react'; import React, { FC, useMemo } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { getPrettyDate } from '~/utils/dom'; import { getPrettyDate } from "~/utils/dom";
import { GithubIssue } from '~/types/boris'; import { GithubIssue } from "~/types/boris";
import classNames from 'classnames'; import classNames from "classnames";
interface IProps { interface IProps {
data: GithubIssue; data: GithubIssue;

View file

@ -1,6 +1,6 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Toggle } from '~/components/input/Toggle'; import { Toggle } from "~/components/input/Toggle";
interface IProps { interface IProps {
active?: boolean; active?: boolean;

View file

@ -1,10 +1,10 @@
import React, { FC, useState } from 'react'; import React, { FC, useState } from "react";
import { Card } from '~/components/containers/Card'; import { Card } from "~/components/containers/Card";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import markdown from '~/styles/common/markdown.module.scss'; import markdown from "~/styles/common/markdown.module.scss";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
import { InputText } from '~/components/input/InputText'; import { InputText } from "~/components/input/InputText";
interface IProps {} interface IProps {}

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { useShallowSelect } from '~/hooks/data/useShallowSelect'; import { useShallowSelect } from "~/hooks/data/useShallowSelect";
import { selectAuthIsTester, selectUser } from '~/redux/auth/selectors'; import { selectAuthIsTester, selectUser } from "~/redux/auth/selectors";
interface IProps {} interface IProps {}

View file

@ -1,11 +1,11 @@
import React, { FC, HTMLAttributes, memo } from 'react'; import React, { FC, HTMLAttributes, memo } from "react";
import { CommentWrapper } from '~/components/containers/CommentWrapper'; import { CommentWrapper } from "~/components/containers/CommentWrapper";
import { IComment, ICommentGroup, IFile } from '~/redux/types'; import { IComment, ICommentGroup, IFile } from "~/redux/types";
import { CommentContent } from '~/components/comment/CommentContent'; import { CommentContent } from "~/components/comment/CommentContent";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { CommendDeleted } from '../../node/CommendDeleted'; import { CommendDeleted } from "../../node/CommendDeleted";
import classNames from 'classnames'; import classNames from "classnames";
import { NEW_COMMENT_CLASSNAME } from '~/constants/comment'; import { NEW_COMMENT_CLASSNAME } from "~/constants/comment";
type IProps = HTMLAttributes<HTMLDivElement> & { type IProps = HTMLAttributes<HTMLDivElement> & {
nodeId: number; nodeId: number;

View file

@ -1,10 +1,10 @@
import React, { FC, useCallback, useState } from 'react'; import React, { FC, useCallback, useState } from "react";
import { IUser } from '~/redux/auth/types'; import { IUser } from "~/redux/auth/types";
import { Avatar } from '~/components/common/Avatar'; import { Avatar } from "~/components/common/Avatar";
import { path } from 'ramda'; import { path } from "ramda";
import { Manager, Popper, Reference } from 'react-popper'; import { Manager, Popper, Reference } from "react-popper";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { useRandomPhrase } from '~/constants/phrases'; import { useRandomPhrase } from "~/constants/phrases";
interface Props { interface Props {
user: IUser; user: IUser;

View file

@ -1,18 +1,18 @@
import React, { createElement, FC, Fragment, memo, useCallback, useMemo, useState } from 'react'; import React, { createElement, FC, Fragment, memo, useCallback, useMemo, useState } from "react";
import { IComment, IFile } from '~/redux/types'; import { IComment, IFile } from "~/redux/types";
import { append, assocPath, path } from 'ramda'; import { append, assocPath, path } from "ramda";
import { formatCommentText, getPrettyDate, getURL } from '~/utils/dom'; import { formatCommentText, getPrettyDate, getURL } from "~/utils/dom";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { UploadType } from '~/constants/uploads'; import { UploadType } from "~/constants/uploads";
import reduce from 'ramda/es/reduce'; import reduce from "ramda/es/reduce";
import { AudioPlayer } from '~/components/media/AudioPlayer'; import { AudioPlayer } from "~/components/media/AudioPlayer";
import classnames from 'classnames'; import classnames from "classnames";
import classNames from 'classnames'; import classNames from "classnames";
import { PRESETS } from '~/constants/urls'; import { PRESETS } from "~/constants/urls";
import { COMMENT_BLOCK_RENDERERS } from '~/constants/comment'; import { COMMENT_BLOCK_RENDERERS } from "~/constants/comment";
import { CommentMenu } from '../CommentMenu'; import { CommentMenu } from "../CommentMenu";
import { CommentForm } from '~/components/comment/CommentForm'; import { CommentForm } from "~/components/comment/CommentForm";
interface IProps { interface IProps {
nodeId: number; nodeId: number;

View file

@ -1,75 +1,45 @@
import React, { FC, memo, useEffect, useMemo } from 'react'; import React, { FC, memo, useMemo } from "react";
import { ICommentBlockProps } from '~/constants/comment'; import { ICommentBlockProps } from "~/constants/comment";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { getYoutubeThumb } from '~/utils/dom'; import { getYoutubeThumb } from "~/utils/dom";
import { selectPlayer } from '~/redux/player/selectors'; import { Icon } from "~/components/input/Icon";
import { connect } from 'react-redux'; import { useYoutubeMetadata } from "~/hooks/metadata/useYoutubeMetadata";
import * as PLAYER_ACTIONS from '~/redux/player/actions';
import { Icon } from '~/components/input/Icon';
import { path } from 'ramda';
const mapStateToProps = state => ({ type Props = ICommentBlockProps & {};
youtubes: selectPlayer(state).youtubes,
});
const mapDispatchToProps = { const CommentEmbedBlock: FC<Props> = memo(({ block }) => {
playerGetYoutubeInfo: PLAYER_ACTIONS.playerGetYoutubeInfo, const id = useMemo(() => {
}; const match = block.content.match(
/https?:\/\/(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch)?(?:\?v=)?([\w\-\=]+)/
);
type Props = ReturnType<typeof mapStateToProps> & return (match && match[1]) || '';
typeof mapDispatchToProps & }, [block.content]);
ICommentBlockProps & {};
const CommentEmbedBlockUnconnected: FC<Props> = memo( const url = useMemo(() => `https://youtube.com/watch?v=${id}`, [id]);
({ block, youtubes, playerGetYoutubeInfo }) => {
const id = useMemo(() => {
const match = block.content.match(
/https?:\/\/(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch)?(?:\?v=)?([\w\-\=]+)/
);
return (match && match[1]) || ''; const preview = useMemo(() => getYoutubeThumb(block.content), [block.content]);
}, [block.content]);
const url = useMemo(() => `https://youtube.com/watch?v=${id}`, [id]); const metadata = useYoutubeMetadata(id);
const title = metadata?.metadata?.title || '';
const preview = useMemo(() => getYoutubeThumb(block.content), [block.content]); return (
<div className={styles.embed}>
<a href={url} target="_blank" rel="noreferrer" />
useEffect(() => { <div className={styles.preview}>
if (!id) return; <div style={{ backgroundImage: `url("${preview}")` }}>
playerGetYoutubeInfo(id); <div className={styles.backdrop}>
}, [id, playerGetYoutubeInfo]); <div className={styles.play}>
<Icon icon="play" size={32} />
const title = useMemo<string>(() => {
if (!id) {
return block.content;
}
return path([id, 'metadata', 'title'], youtubes) || block.content;
}, [id, youtubes, block.content]);
return (
<div className={styles.embed}>
<a href={url} target="_blank" />
<div className={styles.preview}>
<div style={{ backgroundImage: `url("${preview}")` }}>
<div className={styles.backdrop}>
<div className={styles.play}>
<Icon icon="play" size={32} />
</div>
<div className={styles.title}>{title}</div>
</div> </div>
<div className={styles.title}>{title}</div>
</div> </div>
</div> </div>
</div> </div>
); </div>
} );
); });
const CommentEmbedBlock = connect(
mapStateToProps,
mapDispatchToProps
)(CommentEmbedBlockUnconnected);
export { CommentEmbedBlock }; export { CommentEmbedBlock };

View file

@ -1,23 +1,23 @@
import React, { FC, useCallback, useState } from 'react'; import React, { FC, useCallback, useState } from "react";
import { useCommentFormFormik } from '~/hooks/comments/useCommentFormFormik'; import { useCommentFormFormik } from "~/hooks/comments/useCommentFormFormik";
import { FormikProvider } from 'formik'; import { FormikProvider } from "formik";
import { LocalCommentFormTextarea } from '~/components/comment/LocalCommentFormTextarea'; import { LocalCommentFormTextarea } from "~/components/comment/LocalCommentFormTextarea";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
import { UploadSubject, UploadTarget } from '~/constants/uploads'; import { UploadSubject, UploadTarget } from "~/constants/uploads";
import { CommentFormAttachButtons } from '~/components/comment/CommentFormAttachButtons'; import { CommentFormAttachButtons } from "~/components/comment/CommentFormAttachButtons";
import { CommentFormFormatButtons } from '~/components/comment/CommentFormFormatButtons'; import { CommentFormFormatButtons } from "~/components/comment/CommentFormFormatButtons";
import { CommentFormAttaches } from '~/components/comment/CommentFormAttaches'; import { CommentFormAttaches } from "~/components/comment/CommentFormAttaches";
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from "~/components/input/LoaderCircle";
import { IComment, INode } from '~/redux/types'; import { IComment, INode } from "~/redux/types";
import { EMPTY_COMMENT } from '~/constants/node'; import { EMPTY_COMMENT } from "~/constants/node";
import { UploadDropzone } from '~/components/upload/UploadDropzone'; import { UploadDropzone } from "~/components/upload/UploadDropzone";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { ERROR_LITERAL } from '~/constants/errors'; import { ERROR_LITERAL } from "~/constants/errors";
import { useInputPasteUpload } from '~/hooks/dom/useInputPasteUpload'; import { useInputPasteUpload } from "~/hooks/dom/useInputPasteUpload";
import { Filler } from '~/components/containers/Filler'; import { Filler } from "~/components/containers/Filler";
import { useUploader } from '~/hooks/data/useUploader'; import { useUploader } from "~/hooks/data/useUploader";
import { UploaderContextProvider } from '~/utils/context/UploaderContextProvider'; import { UploaderContextProvider } from "~/utils/context/UploaderContextProvider";
import { observer } from 'mobx-react-lite'; import { observer } from "mobx-react-lite";
interface IProps { interface IProps {
comment?: IComment; comment?: IComment;

View file

@ -1,7 +1,7 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { ButtonGroup } from '~/components/input/ButtonGroup'; import { ButtonGroup } from "~/components/input/ButtonGroup";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
import { COMMENT_FILE_TYPES } from '~/constants/uploads'; import { COMMENT_FILE_TYPES } from "~/constants/uploads";
interface IProps { interface IProps {
onUpload: (files: File[]) => void; onUpload: (files: File[]) => void;

View file

@ -1,8 +1,8 @@
import React, { FC, useCallback, useEffect } from 'react'; import React, { FC, useCallback, useEffect } from "react";
import { ButtonGroup } from '~/components/input/ButtonGroup'; import { ButtonGroup } from "~/components/input/ButtonGroup";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
import { useFormatWrapper, wrapTextInsideInput } from '~/hooks/dom/useFormatWrapper'; import { useFormatWrapper, wrapTextInsideInput } from "~/hooks/dom/useFormatWrapper";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface IProps { interface IProps {
element: HTMLTextAreaElement; element: HTMLTextAreaElement;

View file

@ -1,5 +1,5 @@
import React, { FC, useCallback, useState } from 'react'; import React, { FC, useCallback, useState } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface IProps { interface IProps {
onEdit: () => void; onEdit: () => void;

View file

@ -1,9 +1,9 @@
import React, { FC, useMemo } from 'react'; import React, { FC, useMemo } from "react";
import { ICommentBlockProps } from '~/constants/comment'; import { ICommentBlockProps } from "~/constants/comment";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
import markdown from '~/styles/common/markdown.module.scss'; import markdown from "~/styles/common/markdown.module.scss";
import { formatText } from '~/utils/dom'; import { formatText } from "~/utils/dom";
interface IProps extends ICommentBlockProps {} interface IProps extends ICommentBlockProps {}

View file

@ -1,12 +1,7 @@
import React, { import React, { forwardRef, KeyboardEventHandler, TextareaHTMLAttributes, useCallback } from "react";
forwardRef, import { Textarea } from "~/components/input/Textarea";
KeyboardEventHandler, import { useCommentFormContext } from "~/hooks/comments/useCommentFormFormik";
TextareaHTMLAttributes, import { useRandomPhrase } from "~/constants/phrases";
useCallback,
} from 'react';
import { Textarea } from '~/components/input/Textarea';
import { useCommentFormContext } from '~/hooks/comments/useCommentFormFormik';
import { useRandomPhrase } from '~/constants/phrases';
interface IProps extends TextareaHTMLAttributes<HTMLTextAreaElement> { interface IProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
isLoading?: boolean; isLoading?: boolean;

View file

@ -1,10 +1,10 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { getURLFromString } from '~/utils/dom'; import { getURLFromString } from "~/utils/dom";
import { PRESETS } from '~/constants/urls'; import { PRESETS } from "~/constants/urls";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
import { openUserProfile } from '~/utils/user'; import { openUserProfile } from "~/utils/user";
import { DivProps } from '~/utils/types'; import { DivProps } from "~/utils/types";
interface Props extends DivProps { interface Props extends DivProps {
url?: string; url?: string;

View file

@ -1,8 +1,8 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from '~/components/flow/FlowCell/styles.module.scss'; import styles from "~/components/flow/FlowCell/styles.module.scss";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { ButtonProps } from '~/utils/types'; import { ButtonProps } from "~/utils/types";
import classNames from 'classnames'; import classNames from "classnames";
interface Props extends ButtonProps {} interface Props extends ButtonProps {}

View file

@ -1,8 +1,8 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from "~/components/placeholders/Placeholder";
import { DivProps } from '~/utils/types'; import { DivProps } from "~/utils/types";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface Props extends DivProps { interface Props extends DivProps {
isLoading?: boolean; isLoading?: boolean;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { useShallowSelect } from '~/hooks/data/useShallowSelect'; import { useShallowSelect } from "~/hooks/data/useShallowSelect";
import { selectUser } from '~/redux/auth/selectors'; import { selectUser } from "~/redux/auth/selectors";
interface IProps {} interface IProps {}

View file

@ -1,6 +1,6 @@
import React, { AllHTMLAttributes, FC } from 'react'; import React, { AllHTMLAttributes, FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
type IProps = AllHTMLAttributes<HTMLDivElement> & { is_blurred: boolean }; type IProps = AllHTMLAttributes<HTMLDivElement> & { is_blurred: boolean };

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
type IProps = React.HTMLAttributes<HTMLDivElement> & { type IProps = React.HTMLAttributes<HTMLDivElement> & {
seamless?: boolean; seamless?: boolean;

View file

@ -1,7 +1,7 @@
import React, { FC, HTMLAttributes } from 'react'; import React, { FC, HTMLAttributes } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
type IProps = HTMLAttributes<HTMLDivElement> & { type IProps = HTMLAttributes<HTMLDivElement> & {
children: any; children: any;

View file

@ -1,11 +1,11 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { IUser } from '~/redux/auth/types'; import { IUser } from "~/redux/auth/types";
import { path } from 'ramda'; import { path } from "ramda";
import { CommentAvatar } from '~/components/comment/CommentAvatar'; import { CommentAvatar } from "~/components/comment/CommentAvatar";
import { DivProps } from '~/utils/types'; import { DivProps } from "~/utils/types";
type IProps = DivProps & { type IProps = DivProps & {
user: IUser; user: IUser;

View file

@ -1,9 +1,9 @@
import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import React, { FC, useCallback, useEffect, useRef, useState } from "react";
import { IUser } from '~/redux/auth/types'; import { IUser } from "~/redux/auth/types";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { getURL } from '~/utils/dom'; import { getURL } from "~/utils/dom";
import { PRESETS } from '~/constants/urls'; import { PRESETS } from "~/constants/urls";
import classNames from 'classnames'; import classNames from "classnames";
interface IProps { interface IProps {
cover: IUser['cover']; cover: IUser['cover'];

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
type IProps = React.HTMLAttributes<HTMLDivElement>; type IProps = React.HTMLAttributes<HTMLDivElement>;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
type IProps = React.HTMLAttributes<HTMLDivElement> & { type IProps = React.HTMLAttributes<HTMLDivElement> & {
horizontal?: boolean; horizontal?: boolean;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
type IProps = React.HTMLAttributes<HTMLDivElement> & { type IProps = React.HTMLAttributes<HTMLDivElement> & {
horizontal?: boolean; horizontal?: boolean;

View file

@ -1,5 +1,5 @@
import React, { FC, HTMLAttributes, useCallback, useEffect, useRef } from 'react'; import React, { FC, HTMLAttributes, useCallback, useEffect, useRef } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface IProps extends HTMLAttributes<HTMLDivElement> { interface IProps extends HTMLAttributes<HTMLDivElement> {
hasMore: boolean; hasMore: boolean;

View file

@ -1,6 +1,6 @@
import React, { DetailedHTMLProps, FC, HTMLAttributes } from 'react'; import React, { DetailedHTMLProps, FC, HTMLAttributes } from "react";
import styles from '~/styles/common/markdown.module.scss'; import styles from "~/styles/common/markdown.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
interface IProps extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement> {} interface IProps extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement> {}

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
type IProps = React.HTMLAttributes<HTMLDivElement> & { type IProps = React.HTMLAttributes<HTMLDivElement> & {
padding?: number; padding?: number;

View file

@ -1,9 +1,9 @@
import React, { createContext, FC, useContext, useState } from 'react'; import React, { createContext, FC, useContext, useState } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { createPortal } from 'react-dom'; import { createPortal } from "react-dom";
import { getURL } from '~/utils/dom'; import { getURL } from "~/utils/dom";
import { PRESETS } from '~/constants/urls'; import { PRESETS } from "~/constants/urls";
import { IFile } from '~/redux/types'; import { IFile } from "~/redux/types";
interface CoverContextValue { interface CoverContextValue {
cover: IFile | null; cover: IFile | null;

View file

@ -1,7 +1,7 @@
import React, { FC, HTMLAttributes } from 'react'; import React, { FC, HTMLAttributes } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
type IProps = HTMLAttributes<HTMLDivElement> & { type IProps = HTMLAttributes<HTMLDivElement> & {
seamless?: boolean; seamless?: boolean;

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { DivProps } from '~/utils/types'; import { DivProps } from "~/utils/types";
import classNames from 'classnames'; import classNames from "classnames";
interface IProps extends DivProps {} interface IProps extends DivProps {}

View file

@ -1,5 +1,5 @@
import React, { DetailsHTMLAttributes, FC } from 'react'; import React, { DetailsHTMLAttributes, FC } from "react";
import StickyBox from 'react-sticky-box/dist/esnext'; import StickyBox from "react-sticky-box/dist/esnext";
interface IProps extends DetailsHTMLAttributes<HTMLDivElement> { interface IProps extends DetailsHTMLAttributes<HTMLDivElement> {
offsetTop?: number; offsetTop?: number;

View file

@ -1,5 +1,5 @@
import React, { FC, HTMLAttributes } from 'react'; import React, { FC, HTMLAttributes } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
type IProps = HTMLAttributes<HTMLDivElement> & {}; type IProps = HTMLAttributes<HTMLDivElement> & {};

View file

@ -1,5 +1,5 @@
import React, { FC, ReactNode } from 'react'; import React, { FC, ReactNode } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface IProps { interface IProps {
children: ReactNode; children: ReactNode;

View file

@ -1,6 +1,6 @@
import React, { FC, MouseEventHandler } from 'react'; import React, { FC, MouseEventHandler } from "react";
import ReactDOM from 'react-dom'; import ReactDOM from "react-dom";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
type IProps = { type IProps = {
onOverlayClick: MouseEventHandler; onOverlayClick: MouseEventHandler;

View file

@ -1,6 +1,6 @@
import React, { createContext, FC, useContext, useMemo, useState, VFC } from 'react'; import React, { createContext, FC, useContext, useMemo, useState, VFC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
interface TabProps { interface TabProps {
items: string[]; items: string[];

View file

@ -1,15 +1,15 @@
import React, { FC, useCallback, useMemo } from 'react'; import React, { FC, useCallback, useMemo } from "react";
import { UploadType } from '~/constants/uploads'; import { UploadType } from "~/constants/uploads";
import { ImageGrid } from '../ImageGrid'; import { ImageGrid } from "../ImageGrid";
import { AudioGrid } from '../AudioGrid'; import { AudioGrid } from "../AudioGrid";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { NodeEditorProps } from '~/types/node'; import { NodeEditorProps } from "~/types/node";
import { useNodeImages } from '~/hooks/node/useNodeImages'; import { useNodeImages } from "~/hooks/node/useNodeImages";
import { useNodeAudios } from '~/hooks/node/useNodeAudios'; import { useNodeAudios } from "~/hooks/node/useNodeAudios";
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik";
import { UploadDropzone } from '~/components/upload/UploadDropzone'; import { UploadDropzone } from "~/components/upload/UploadDropzone";
import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; import { useUploaderContext } from "~/utils/context/UploaderContextProvider";
import { values } from 'ramda'; import { values } from "ramda";
type IProps = NodeEditorProps; type IProps = NodeEditorProps;

View file

@ -1,11 +1,11 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { SortEnd } from 'react-sortable-hoc'; import { SortEnd } from "react-sortable-hoc";
import { IFile } from '~/redux/types'; import { IFile } from "~/redux/types";
import { moveArrItem } from '~/utils/fn'; import { moveArrItem } from "~/utils/fn";
import { SortableAudioGrid } from '~/components/editors/SortableAudioGrid'; import { SortableAudioGrid } from "~/components/editors/SortableAudioGrid";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { UploadStatus } from '~/store/uploader/UploaderStore'; import { UploadStatus } from "~/store/uploader/UploaderStore";
interface IProps { interface IProps {
files: IFile[]; files: IFile[];

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; import { EditorUploadButton } from "~/components/editors/EditorUploadButton";
import { UploadType } from '~/constants/uploads'; import { UploadType } from "~/constants/uploads";
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from "~/types/node";
type IProps = IEditorComponentProps & {}; type IProps = IEditorComponentProps & {};

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
interface IProps { interface IProps {
onApprove: () => void; onApprove: () => void;

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { Filler } from '~/components/containers/Filler'; import { Filler } from "~/components/containers/Filler";
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from "~/types/node";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
type IProps = IEditorComponentProps & {}; type IProps = IEditorComponentProps & {};

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; import { EditorUploadButton } from "~/components/editors/EditorUploadButton";
import { UploadType } from '~/constants/uploads'; import { UploadType } from "~/constants/uploads";
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from "~/types/node";
type IProps = IEditorComponentProps & {}; type IProps = IEditorComponentProps & {};

View file

@ -1,9 +1,9 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from "~/types/node";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik";
interface IProps extends IEditorComponentProps {} interface IProps extends IEditorComponentProps {}

View file

@ -1,12 +1,12 @@
import React, { ChangeEvent, FC, useCallback } from 'react'; import React, { ChangeEvent, FC, useCallback } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { UploadType } from '~/constants/uploads'; import { UploadType } from "~/constants/uploads";
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from "~/types/node";
import { getFileType } from '~/utils/uploader'; import { getFileType } from "~/utils/uploader";
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; import { useUploaderContext } from "~/utils/context/UploaderContextProvider";
type IProps = IEditorComponentProps & { type IProps = IEditorComponentProps & {
accept?: string; accept?: string;

View file

@ -1,13 +1,13 @@
import React, { ChangeEvent, FC, useCallback, useEffect } from 'react'; import React, { ChangeEvent, FC, useCallback, useEffect } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { UploadSubject, UploadTarget, UploadType } from '~/constants/uploads'; import { UploadSubject, UploadTarget, UploadType } from "~/constants/uploads";
import { getURL } from '~/utils/dom'; import { getURL } from "~/utils/dom";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { PRESETS } from '~/constants/urls'; import { PRESETS } from "~/constants/urls";
import { IEditorComponentProps } from '~/types/node'; import { IEditorComponentProps } from "~/types/node";
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik";
import { getFileType } from '~/utils/uploader'; import { getFileType } from "~/utils/uploader";
import { useUploader } from '~/hooks/data/useUploader'; import { useUploader } from "~/hooks/data/useUploader";
type IProps = IEditorComponentProps & {}; type IProps = IEditorComponentProps & {};

View file

@ -1,10 +1,10 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { ImageGrid } from '~/components/editors/ImageGrid'; import { ImageGrid } from "~/components/editors/ImageGrid";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { NodeEditorProps } from '~/types/node'; import { NodeEditorProps } from "~/types/node";
import { UploadDropzone } from '~/components/upload/UploadDropzone'; import { UploadDropzone } from "~/components/upload/UploadDropzone";
import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; import { useUploaderContext } from "~/utils/context/UploaderContextProvider";
import { values } from 'ramda'; import { values } from "ramda";
type IProps = NodeEditorProps; type IProps = NodeEditorProps;

View file

@ -1,10 +1,10 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { SortEnd } from 'react-sortable-hoc'; import { SortEnd } from "react-sortable-hoc";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { IFile } from '~/redux/types'; import { IFile } from "~/redux/types";
import { moveArrItem } from '~/utils/fn'; import { moveArrItem } from "~/utils/fn";
import { SortableImageGrid } from '~/components/editors/SortableImageGrid'; import { SortableImageGrid } from "~/components/editors/SortableImageGrid";
import { UploadStatus } from '~/store/uploader/UploaderStore'; import { UploadStatus } from "~/store/uploader/UploaderStore";
interface IProps { interface IProps {
files: IFile[]; files: IFile[];

View file

@ -1,10 +1,10 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Textarea } from '~/components/input/Textarea'; import { Textarea } from "~/components/input/Textarea";
import { path } from 'ramda'; import { path } from "ramda";
import { NodeEditorProps } from '~/types/node'; import { NodeEditorProps } from "~/types/node";
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik";
import { useRandomPhrase } from '~/constants/phrases'; import { useRandomPhrase } from "~/constants/phrases";
type IProps = NodeEditorProps & {}; type IProps = NodeEditorProps & {};

View file

@ -1,11 +1,11 @@
import React, { FC, useCallback, useMemo } from 'react'; import React, { FC, useCallback, useMemo } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { path } from 'ramda'; import { path } from "ramda";
import { InputText } from '~/components/input/InputText'; import { InputText } from "~/components/input/InputText";
import classnames from 'classnames'; import classnames from "classnames";
import { getYoutubeThumb } from '~/utils/dom'; import { getYoutubeThumb } from "~/utils/dom";
import { NodeEditorProps } from '~/types/node'; import { NodeEditorProps } from "~/types/node";
import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik";
type IProps = NodeEditorProps & {}; type IProps = NodeEditorProps & {};

View file

@ -1,10 +1,10 @@
import React, { FC, useMemo } from 'react'; import React, { FC, useMemo } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { DEFAULT_DOMINANT_COLOR } from '~/constants/node'; import { DEFAULT_DOMINANT_COLOR } from "~/constants/node";
import { DivProps } from '~/utils/types'; import { DivProps } from "~/utils/types";
import classNames from 'classnames'; import classNames from "classnames";
import { transparentize } from 'color2k'; import { transparentize } from "color2k";
import { normalizeBrightColor } from '~/utils/color'; import { normalizeBrightColor } from "~/utils/color";
interface Props extends DivProps { interface Props extends DivProps {
color?: string; color?: string;

View file

@ -1,15 +1,15 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { NavLink } from 'react-router-dom'; import { NavLink } from "react-router-dom";
import { CellShade } from '~/components/flow/CellShade'; import { CellShade } from "~/components/flow/CellShade";
import { FlowDisplay, INode } from '~/redux/types'; import { FlowDisplay, INode } from "~/redux/types";
import { FlowCellText } from '~/components/flow/FlowCellText'; import { FlowCellText } from "~/components/flow/FlowCellText";
import classNames from 'classnames'; import classNames from "classnames";
import { FlowCellMenu } from '~/components/flow/FlowCellMenu'; import { FlowCellMenu } from "~/components/flow/FlowCellMenu";
import { useFlowCellControls } from '~/hooks/flow/useFlowCellControls'; import { useFlowCellControls } from "~/hooks/flow/useFlowCellControls";
import { useClickOutsideFocus } from '~/hooks/dom/useClickOutsideFocus'; import { useClickOutsideFocus } from "~/hooks/dom/useClickOutsideFocus";
import { MenuDots } from '~/components/common/MenuDots'; import { MenuDots } from "~/components/common/MenuDots";
import { FlowCellImage } from '~/components/flow/FlowCellImage'; import { FlowCellImage } from "~/components/flow/FlowCellImage";
interface Props { interface Props {
id: INode['id']; id: INode['id'];

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { IMGProps } from '~/utils/types'; import { IMGProps } from "~/utils/types";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
interface Props extends IMGProps { interface Props extends IMGProps {
height?: number; height?: number;

View file

@ -1,8 +1,8 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import LazyLoad from 'react-lazyload'; import LazyLoad from "react-lazyload";
import { IMGProps } from '~/utils/types'; import { IMGProps } from "~/utils/types";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
interface Props extends IMGProps { interface Props extends IMGProps {
height?: number; height?: number;

View file

@ -1,10 +1,10 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import classNames from 'classnames'; import classNames from "classnames";
import { Toggle } from '~/components/input/Toggle'; import { Toggle } from "~/components/input/Toggle";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { FlowDisplayVariant } from '~/redux/types'; import { FlowDisplayVariant } from "~/redux/types";
interface Props { interface Props {
onClose: () => void; onClose: () => void;

View file

@ -1,9 +1,9 @@
import React, { FC, ReactElement } from 'react'; import React, { FC, ReactElement } from "react";
import { Markdown } from '~/components/containers/Markdown'; import { Markdown } from "~/components/containers/Markdown";
import { DivProps } from '~/utils/types'; import { DivProps } from "~/utils/types";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { formatText } from '~/utils/dom'; import { formatText } from "~/utils/dom";
interface Props extends DivProps { interface Props extends DivProps {
children: string; children: string;

View file

@ -1,12 +1,12 @@
import React, { FC, Fragment } from 'react'; import React, { FC, Fragment } from "react";
import { FlowDisplay, IFlowNode, INode } from '~/redux/types'; import { FlowDisplay, IFlowNode, INode } from "~/redux/types";
import { IUser } from '~/redux/auth/types'; import { IUser } from "~/redux/auth/types";
import { PRESETS, URLS } from '~/constants/urls'; import { PRESETS, URLS } from "~/constants/urls";
import { FlowCell } from '~/components/flow/FlowCell'; import { FlowCell } from "~/components/flow/FlowCell";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { getURLFromString } from '~/utils/dom'; import { getURLFromString } from "~/utils/dom";
import { canEditNode } from '~/utils/node'; import { canEditNode } from "~/utils/node";
interface Props { interface Props {
nodes: IFlowNode[]; nodes: IFlowNode[];

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { FlowRecentItem } from '../FlowRecentItem'; import { FlowRecentItem } from "../FlowRecentItem";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { IFlowNode } from '~/redux/types'; import { IFlowNode } from "~/redux/types";
interface IProps { interface IProps {
recent: IFlowNode[]; recent: IFlowNode[];

View file

@ -1,12 +1,12 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { INode } from '~/redux/types'; import { INode } from "~/redux/types";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { URLS } from '~/constants/urls'; import { URLS } from "~/constants/urls";
import { NodeRelatedItem } from '~/components/node/NodeRelatedItem'; import { NodeRelatedItem } from "~/components/node/NodeRelatedItem";
import { getPrettyDate } from '~/utils/dom'; import { getPrettyDate } from "~/utils/dom";
import { Link } from 'react-router-dom'; import { Link } from "react-router-dom";
import classNames from 'classnames'; import classNames from "classnames";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
interface IProps { interface IProps {
node: Partial<INode>; node: Partial<INode>;

View file

@ -1,9 +1,9 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { FlowRecentItem } from '../FlowRecentItem'; import { FlowRecentItem } from "../FlowRecentItem";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { INode } from '~/redux/types'; import { INode } from "~/redux/types";
import { InfiniteScroll } from '~/components/containers/InfiniteScroll'; import { InfiniteScroll } from "~/components/containers/InfiniteScroll";
interface IProps { interface IProps {
isLoading: boolean; isLoading: boolean;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { describeArc } from '~/utils/dom'; import { describeArc } from "~/utils/dom";
interface IProps { interface IProps {
size: number; size: number;

View file

@ -1,10 +1,10 @@
import classnames from 'classnames'; import classnames from "classnames";
import React, { ButtonHTMLAttributes, DetailedHTMLProps, FC, memo, useMemo } from 'react'; import React, { ButtonHTMLAttributes, DetailedHTMLProps, FC, memo, useMemo } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { IIcon } from '~/redux/types'; import { IIcon } from "~/redux/types";
import Tippy from '@tippy.js/react'; import Tippy from "@tippy.js/react";
import 'tippy.js/dist/tippy.css'; import "tippy.js/dist/tippy.css";
type IButtonProps = DetailedHTMLProps< type IButtonProps = DetailedHTMLProps<
ButtonHTMLAttributes<HTMLButtonElement>, ButtonHTMLAttributes<HTMLButtonElement>,

View file

@ -1,6 +1,6 @@
import React, { HTMLAttributes } from 'react'; import React, { HTMLAttributes } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
type IProps = HTMLAttributes<HTMLDivElement> & {}; type IProps = HTMLAttributes<HTMLDivElement> & {};

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { SVGProps } from '~/utils/types'; import { SVGProps } from "~/utils/types";
interface Props extends SVGProps {} interface Props extends SVGProps {}

View file

@ -1,5 +1,5 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { IIcon } from '~/redux/types'; import { IIcon } from "~/redux/types";
type IProps = React.SVGAttributes<SVGElement> & { type IProps = React.SVGAttributes<SVGElement> & {
size?: number; size?: number;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
interface InputWrapperProps { interface InputWrapperProps {
title?: string; title?: string;

View file

@ -1,8 +1,8 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
import { LoaderCircleInner } from '~/components/input/LoaderCircleInner'; import { LoaderCircleInner } from "~/components/input/LoaderCircleInner";
import { SVGProps } from '~/utils/types'; import { SVGProps } from "~/utils/types";
interface IProps extends SVGProps { interface IProps extends SVGProps {
size?: number; size?: number;

View file

@ -1,5 +1,5 @@
import React, { FC, SVGAttributes } from 'react'; import React, { FC, SVGAttributes } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface IProps extends SVGAttributes<SVGElement> { interface IProps extends SVGAttributes<SVGElement> {
size: number; size: number;

View file

@ -5,14 +5,14 @@ import React, {
TextareaHTMLAttributes, TextareaHTMLAttributes,
useCallback, useCallback,
useEffect, useEffect,
useState, useState
} from 'react'; } from "react";
import classNames from 'classnames'; import classNames from "classnames";
import autosize from 'autosize'; import autosize from "autosize";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { InputWrapper } from '~/components/input/InputWrapper'; import { InputWrapper } from "~/components/input/InputWrapper";
import { useForwardRef } from '~/hooks/dom/useForwardRef'; import { useForwardRef } from "~/hooks/dom/useForwardRef";
type IProps = DetailedHTMLProps< type IProps = DetailedHTMLProps<
TextareaHTMLAttributes<HTMLTextAreaElement>, TextareaHTMLAttributes<HTMLTextAreaElement>,

View file

@ -1,7 +1,7 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
import { ButtonProps } from '~/utils/types'; import { ButtonProps } from "~/utils/types";
type ToggleColor = 'primary' | 'secondary' | 'lab' | 'danger' | 'white'; type ToggleColor = 'primary' | 'secondary' | 'lab' | 'danger' | 'white';

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { Square } from '~/components/containers/Square'; import { Square } from "~/components/containers/Square";
interface IProps {} interface IProps {}

View file

@ -1,15 +1,15 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { Filler } from '~/components/containers/Filler'; import { Filler } from "~/components/containers/Filler";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { getPrettyDate } from '~/utils/dom'; import { getPrettyDate } from "~/utils/dom";
import { INode } from '~/redux/types'; import { INode } from "~/redux/types";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import classNames from 'classnames'; import classNames from "classnames";
import { Grid } from '~/components/containers/Grid'; import { Grid } from "~/components/containers/Grid";
import { useHistory } from 'react-router'; import { useHistory } from "react-router";
import { URLS } from '~/constants/urls'; import { URLS } from "~/constants/urls";
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from "~/components/placeholders/Placeholder";
type Props = { type Props = {
node: INode; node: INode;

View file

@ -1,6 +1,6 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { LabHeadItem } from '~/components/lab/LabHeadItem'; import { LabHeadItem } from "~/components/lab/LabHeadItem";
interface IProps { interface IProps {
isLoading?: boolean; isLoading?: boolean;

View file

@ -1,9 +1,9 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from "~/components/placeholders/Placeholder";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
interface IProps { interface IProps {
icon: string; icon: string;

View file

@ -1,12 +1,12 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from "~/components/placeholders/Placeholder";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { INode } from '~/redux/types'; import { INode } from "~/redux/types";
import { getPrettyDate } from '~/utils/dom'; import { getPrettyDate } from "~/utils/dom";
import { URLS } from '~/constants/urls'; import { URLS } from "~/constants/urls";
import { useHistory } from 'react-router-dom'; import { useHistory } from "react-router-dom";
interface IProps { interface IProps {
node?: Partial<INode>; node?: Partial<INode>;

View file

@ -1,8 +1,8 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import { INode } from '~/redux/types'; import { INode } from "~/redux/types";
import styles from '~/containers/lab/LabStats/styles.module.scss'; import styles from "~/containers/lab/LabStats/styles.module.scss";
import { LabHero } from '~/components/lab/LabHero'; import { LabHero } from "~/components/lab/LabHero";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
interface IProps { interface IProps {
nodes: Partial<INode>[]; nodes: Partial<INode>[];

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { INodeComponentProps } from '~/constants/node'; import { INodeComponentProps } from "~/constants/node";
import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString'; import { useColorGradientFromString } from "~/hooks/color/useColorGradientFromString";
interface Props extends INodeComponentProps {} interface Props extends INodeComponentProps {}

View file

@ -1,11 +1,11 @@
import React, { FC, useMemo } from 'react'; import React, { FC, useMemo } from "react";
import { INode } from '~/redux/types'; import { INode } from "~/redux/types";
import { useNodeBlocks } from '~/hooks/node/useNodeBlocks'; import { useNodeBlocks } from "~/hooks/node/useNodeBlocks";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { LabBottomPanel } from '~/components/lab/LabBottomPanel'; import { LabBottomPanel } from "~/components/lab/LabBottomPanel";
import { isAfter, parseISO } from 'date-fns'; import { isAfter, parseISO } from "date-fns";
import classNames from 'classnames'; import classNames from "classnames";
import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString'; import { useColorGradientFromString } from "~/hooks/color/useColorGradientFromString";
interface IProps { interface IProps {
node: INode; node: INode;

View file

@ -1,8 +1,8 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './/styles.module.scss'; import styles from ".//styles.module.scss";
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from "~/components/placeholders/Placeholder";
import { ITag } from '~/redux/types'; import { ITag } from "~/redux/types";
import { Tag } from '~/components/tags/Tag'; import { Tag } from "~/components/tags/Tag";
interface IProps { interface IProps {
tags: ITag[]; tags: ITag[];

View file

@ -1,5 +1,5 @@
import React, { FC, memo } from 'react'; import React, { FC, memo } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
interface IProps {} interface IProps {}

View file

@ -1,4 +1,4 @@
import * as React from 'react'; import * as React from "react";
interface IGodRaysProps { interface IGodRaysProps {
raised?: boolean; raised?: boolean;

View file

@ -1,7 +1,7 @@
import React, { FC, useCallback, useEffect, useState } from 'react'; import React, { FC, useCallback, useEffect, useState } from "react";
import classNames from 'classnames'; import classNames from "classnames";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
interface IProps { interface IProps {
} }

View file

@ -1,11 +1,11 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { getURL } from '~/utils/dom'; import { getURL } from "~/utils/dom";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { IUser } from '~/redux/auth/types'; import { IUser } from "~/redux/auth/types";
import { PRESETS } from '~/constants/urls'; import { PRESETS } from "~/constants/urls";
import { authOpenProfile } from '~/redux/auth/actions'; import { authOpenProfile } from "~/redux/auth/actions";
interface IProps { interface IProps {
user: Partial<IUser>; user: Partial<IUser>;

View file

@ -1,152 +1,100 @@
import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; import React, { memo, useCallback, useMemo } from "react";
import { connect } from 'react-redux'; import { IFile } from "~/redux/types";
import { selectPlayer } from '~/redux/player/selectors'; import classNames from "classnames";
import * as PLAYER_ACTIONS from '~/redux/player/actions'; import styles from "./styles.module.scss";
import { IFile } from '~/redux/types'; import { Icon } from "~/components/input/Icon";
import { IPlayerProgress, Player } from '~/utils/player'; import { InputText } from "~/components/input/InputText";
import classNames from 'classnames'; import { PlayerState } from "~/constants/player";
import styles from './styles.module.scss'; import { useAudioPlayer } from "~/utils/providers/AudioPlayerProvider";
import { Icon } from '~/components/input/Icon';
import { InputText } from '~/components/input/InputText';
import { PlayerState } from '~/redux/player/constants';
const mapStateToProps = state => ({ type Props = {
player: selectPlayer(state), file: IFile;
}); isEditing?: boolean;
onDelete?: (id: IFile['id']) => void;
const mapDispatchToProps = { onTitleChange?: (file_id: IFile['id'], title: string) => void;
playerSetFileAndPlay: PLAYER_ACTIONS.playerSetFileAndPlay,
playerPlay: PLAYER_ACTIONS.playerPlay,
playerPause: PLAYER_ACTIONS.playerPause,
playerSeek: PLAYER_ACTIONS.playerSeek,
}; };
type Props = ReturnType<typeof mapStateToProps> & const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) => {
typeof mapDispatchToProps & { const { toPercent, file: currentFile, setFile, play, status, progress, pause } = useAudioPlayer();
file: IFile;
isEditing?: boolean;
onDelete?: (id: IFile['id']) => void;
onTitleChange?: (file_id: IFile['id'], title: string) => void;
};
const AudioPlayerUnconnected = memo( const onPlay = useCallback(async () => {
({ if (file.id !== currentFile?.id) {
file, setFile(file);
onDelete, setTimeout(() => void play(), 0);
isEditing, return;
onTitleChange, }
player: { file: current, status },
playerSetFileAndPlay,
playerPlay,
playerPause,
playerSeek,
}: Props) => {
const [playing, setPlaying] = useState(false);
const [progress, setProgress] = useState<IPlayerProgress>({
progress: 0,
current: 0,
total: 0,
});
const onPlay = useCallback(() => { status === PlayerState.PLAYING ? pause() : await play();
if (isEditing) return; }, [play, pause, setFile, file, currentFile, status]);
if (current && current.id === file.id) { const onSeek = useCallback(
if (status === PlayerState.PLAYING) return playerPause(); event => {
return playerPlay(); event.stopPropagation();
} const { clientX, target } = event;
const { left, width } = target.getBoundingClientRect();
toPercent(((clientX - left) / width) * 100);
},
[toPercent]
);
playerSetFileAndPlay(file); const onDropClick = useCallback(() => {
}, [file, current, status, playerPlay, playerPause, playerSetFileAndPlay, isEditing]); if (!onDelete) return;
const onProgress = useCallback( onDelete(file.id);
({ detail }: { detail: IPlayerProgress }) => { }, [file, onDelete]);
if (!detail || !detail.total) return;
setProgress(detail);
},
[setProgress]
);
const onSeek = useCallback( const title = useMemo(
event => { () =>
event.stopPropagation(); (file.metadata &&
const { clientX, target } = event; (file.metadata.title ||
const { left, width } = target.getBoundingClientRect(); [file.metadata.id3artist, file.metadata.id3title].filter(el => el).join(' - '))) ||
playerSeek((clientX - left) / width); file.orig_name ||
}, '',
[playerSeek] [file.metadata, file.orig_name]
); );
const onDropClick = useCallback(() => { const onRename = useCallback(
if (!onDelete) return; (val: string) => {
if (!onTitleChange) return;
onDelete(file.id); onTitleChange(file.id, val);
}, [file, onDelete]); },
[onTitleChange, file.id]
);
const title = useMemo( const playing = currentFile?.id === file.id;
() =>
(file.metadata &&
(file.metadata.title ||
[file.metadata.id3artist, file.metadata.id3title].filter(el => el).join(' - '))) ||
file.orig_name ||
'',
[file.metadata, file.orig_name]
);
const onRename = useCallback( return (
(val: string) => { <div onClick={onPlay} className={classNames(styles.wrap, { [styles.playing]: playing })}>
if (!onTitleChange) return; {onDelete && (
<div className={styles.drop} onMouseDown={onDropClick}>
onTitleChange(file.id, val); <Icon icon="close" />
},
[onTitleChange, file.id]
);
useEffect(() => {
const active = current && current.id === file.id;
setPlaying(!!current && current.id === file.id);
if (active) Player.on('playprogress', onProgress);
return () => {
if (active) Player.off('playprogress', onProgress);
};
}, [file, current, setPlaying, onProgress]);
return (
<div onClick={onPlay} className={classNames(styles.wrap, { playing })}>
{onDelete && (
<div className={styles.drop} onMouseDown={onDropClick}>
<Icon icon="close" />
</div>
)}
<div className={styles.playpause}>
{playing && status === PlayerState.PLAYING ? <Icon icon="pause" /> : <Icon icon="play" />}
</div> </div>
)}
{isEditing ? ( <div className={styles.playpause}>
<div className={styles.input}> {playing && status === PlayerState.PLAYING ? <Icon icon="pause" /> : <Icon icon="play" />}
<InputText
placeholder={title}
handler={onRename}
value={file.metadata && file.metadata.title}
/>
</div>
) : (
<div className={styles.content}>
<div className={styles.title}>
<div className={styles.title}>{title || 'Unknown'}</div>
</div>
<div className={styles.progress} onClick={onSeek}>
<div className={styles.bar} style={{ width: `${progress.progress}%` }} />
</div>
</div>
)}
</div> </div>
);
}
);
export const AudioPlayer = connect(mapStateToProps, mapDispatchToProps)(AudioPlayerUnconnected); {isEditing ? (
<div className={styles.input}>
<InputText
placeholder={title}
handler={onRename}
value={file.metadata && file.metadata.title}
/>
</div>
) : (
<div className={styles.content}>
<div className={styles.title}>{title || ''}</div>
<div className={styles.progress} onClick={onSeek}>
<div className={styles.bar} style={{ width: `${progress.progress}%` }} />
</div>
</div>
)}
</div>
);
});
export { AudioPlayer };

View file

@ -9,21 +9,6 @@
justify-content: stretch; justify-content: stretch;
flex: 1; flex: 1;
user-select: none; user-select: none;
&:global(.playing) {
.progress {
opacity: 1;
pointer-events: all;
touch-action: auto;
}
.title {
top: 20px;
opacity: 1;
font-size: 12px;
padding-right: 140px;
}
}
} }
.playpause { .playpause {
@ -76,6 +61,14 @@
text-align: left; text-align: left;
transition: all 0.5s; transition: all 0.5s;
font: $font_18_semibold; font: $font_18_semibold;
.playing & {
top: 20px;
opacity: 1;
font-size: 12px;
padding-right: 140px;
color: transparentize(white, 0.7);
}
} }
.progress { .progress {
@ -88,6 +81,12 @@
left: 0; left: 0;
cursor: pointer; cursor: pointer;
.playing & {
opacity: 1;
pointer-events: all;
touch-action: auto;
}
&::after { &::after {
content: ' '; content: ' ';
position: absolute; position: absolute;

View file

@ -1,13 +1,13 @@
import React, { FC, MouseEventHandler, useCallback, useMemo, useState } from 'react'; import React, { FC, MouseEventHandler, useCallback, useMemo, useState } from "react";
import classNames from 'classnames'; import classNames from "classnames";
import { getURL } from '~/utils/dom'; import { getURL } from "~/utils/dom";
import { PRESETS } from '~/constants/urls'; import { PRESETS } from "~/constants/urls";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { IFile } from '~/redux/types'; import { IFile } from "~/redux/types";
import { LoaderCircle } from '~/components/input/LoaderCircle'; import { LoaderCircle } from "~/components/input/LoaderCircle";
import { Icon } from '~/components/input/Icon'; import { Icon } from "~/components/input/Icon";
import { useResizeHandler } from '~/hooks/dom/useResizeHandler'; import { useResizeHandler } from "~/hooks/dom/useResizeHandler";
import { DEFAULT_DOMINANT_COLOR } from '~/constants/node'; import { DEFAULT_DOMINANT_COLOR } from "~/constants/node";
interface IProps { interface IProps {
file: IFile; file: IFile;

View file

@ -1,7 +1,7 @@
import React, { FC, useCallback } from 'react'; import React, { FC, useCallback } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Button } from '~/components/input/Button'; import { Button } from "~/components/input/Button";
import { IComment } from '~/redux/types'; import { IComment } from "~/redux/types";
interface IProps { interface IProps {
id: IComment['id']; id: IComment['id'];

View file

@ -1,7 +1,7 @@
import React, { FC } from 'react'; import React, { FC } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import { Group } from '~/components/containers/Group'; import { Group } from "~/components/containers/Group";
import { Filler } from '~/components/containers/Filler'; import { Filler } from "~/components/containers/Filler";
interface IProps { interface IProps {
title: string; title: string;

Some files were not shown because too many files have changed in this diff Show more