Remove unused files
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
86cb31918d
commit
60a7865420
7 changed files with 0 additions and 325 deletions
|
@ -1,15 +0,0 @@
|
|||
import React from 'react';
|
||||
|
||||
interface IInlineSVG {
|
||||
loader?: JSX.Element;
|
||||
}
|
||||
|
||||
const InlineSVG: React.FC<IInlineSVG> = ({ loader }): JSX.Element => {
|
||||
if (loader) {
|
||||
return loader;
|
||||
} else {
|
||||
throw 'You used react-inlinesvg without a loader! This will cause jumpy loading during render.';
|
||||
}
|
||||
};
|
||||
|
||||
export { InlineSVG as default };
|
|
@ -1,112 +0,0 @@
|
|||
import React, { useEffect, useState } from 'react';
|
||||
|
||||
import { useDimensions } from 'pl-fe/hooks/useDimensions';
|
||||
|
||||
import HStack from './hstack';
|
||||
import Icon from './icon';
|
||||
|
||||
interface ICarousel {
|
||||
children: any;
|
||||
/** Optional height to force on controls */
|
||||
controlsHeight?: number;
|
||||
/** How many items in the carousel */
|
||||
itemCount: number;
|
||||
/** The minimum width per item */
|
||||
itemWidth: number;
|
||||
/** Should the controls be disabled? */
|
||||
isDisabled?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Carousel
|
||||
*/
|
||||
const Carousel: React.FC<ICarousel> = (props): JSX.Element => {
|
||||
const { children, controlsHeight, isDisabled, itemCount, itemWidth } = props;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const [ref, setContainerRef, { width: finalContainerWidth }] = useDimensions();
|
||||
const containerWidth = finalContainerWidth || ref?.clientWidth;
|
||||
|
||||
const [pageSize, setPageSize] = useState<number>(0);
|
||||
const [currentPage, setCurrentPage] = useState<number>(1);
|
||||
|
||||
const numberOfPages = Math.ceil(itemCount / pageSize);
|
||||
const width = containerWidth / (Math.floor(containerWidth / itemWidth));
|
||||
|
||||
const hasNextPage = currentPage < numberOfPages && numberOfPages > 1;
|
||||
const hasPrevPage = currentPage > 1 && numberOfPages > 1;
|
||||
|
||||
const handleNextPage = () => setCurrentPage((prevPage) => prevPage + 1);
|
||||
const handlePrevPage = () => setCurrentPage((prevPage) => prevPage - 1);
|
||||
|
||||
const renderChildren = () => {
|
||||
if (typeof children === 'function') {
|
||||
return children({ width: width || 'auto' });
|
||||
}
|
||||
|
||||
return children;
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (containerWidth) {
|
||||
setPageSize(Math.round(containerWidth / width));
|
||||
}
|
||||
}, [containerWidth, width]);
|
||||
|
||||
return (
|
||||
<HStack alignItems='stretch'>
|
||||
<div
|
||||
className='z-10 flex w-5 items-center justify-center self-stretch rounded-l-xl bg-white dark:bg-primary-900'
|
||||
style={{
|
||||
height: controlsHeight || 'auto',
|
||||
}}
|
||||
>
|
||||
<button
|
||||
data-testid='prev-page'
|
||||
onClick={handlePrevPage}
|
||||
className='flex h-full w-7 items-center justify-center transition-opacity duration-500 disabled:opacity-25'
|
||||
disabled={!hasPrevPage || isDisabled}
|
||||
>
|
||||
<Icon
|
||||
src={require('@tabler/icons/outline/chevron-left.svg')}
|
||||
className='size-5 text-black dark:text-white'
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className='relative w-full overflow-hidden'>
|
||||
<HStack
|
||||
alignItems='center'
|
||||
style={{
|
||||
transform: `translateX(-${(currentPage - 1) * 100}%)`,
|
||||
}}
|
||||
className='transition-all duration-500 ease-out'
|
||||
ref={setContainerRef}
|
||||
>
|
||||
{renderChildren()}
|
||||
</HStack>
|
||||
</div>
|
||||
|
||||
<div
|
||||
className='z-10 flex w-5 items-center justify-center self-stretch rounded-r-xl bg-white dark:bg-primary-900'
|
||||
style={{
|
||||
height: controlsHeight || 'auto',
|
||||
}}
|
||||
>
|
||||
<button
|
||||
data-testid='next-page'
|
||||
onClick={handleNextPage}
|
||||
className='flex h-full w-7 items-center justify-center transition-opacity duration-500 disabled:opacity-25'
|
||||
disabled={!hasNextPage || isDisabled}
|
||||
>
|
||||
<Icon
|
||||
src={require('@tabler/icons/outline/chevron-right.svg')}
|
||||
className='size-5 text-black dark:text-white'
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</HStack>
|
||||
);
|
||||
};
|
||||
|
||||
export { Carousel as default };
|
|
@ -1,38 +0,0 @@
|
|||
import React, { useMemo } from 'react';
|
||||
|
||||
import HStack from './hstack';
|
||||
|
||||
interface IRadioButton {
|
||||
value: string;
|
||||
checked?: boolean;
|
||||
name: string;
|
||||
onChange: React.ChangeEventHandler<HTMLInputElement>;
|
||||
label: React.ReactNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* A group for radio input with label.
|
||||
*/
|
||||
const RadioButton: React.FC<IRadioButton> = ({ name, value, checked, onChange, label }) => {
|
||||
const formFieldId: string = useMemo(() => `radio-${crypto.randomUUID()}`, []);
|
||||
|
||||
return (
|
||||
<HStack alignItems='center' space={3}>
|
||||
<input
|
||||
type='radio'
|
||||
name={name}
|
||||
id={formFieldId}
|
||||
value={value}
|
||||
checked={checked}
|
||||
onChange={onChange}
|
||||
className='size-4 border-gray-300 text-primary-600 focus:ring-primary-500'
|
||||
/>
|
||||
|
||||
<label htmlFor={formFieldId} className='block text-sm font-medium text-gray-700'>
|
||||
{label}
|
||||
</label>
|
||||
</HStack>
|
||||
);
|
||||
};
|
||||
|
||||
export { RadioButton as default };
|
|
@ -1,26 +0,0 @@
|
|||
import { importEntities } from 'pl-fe/entity-store/actions';
|
||||
import { Entities } from 'pl-fe/entity-store/entities';
|
||||
import { useAppDispatch } from 'pl-fe/hooks/useAppDispatch';
|
||||
import { useGetState } from 'pl-fe/hooks/useGetState';
|
||||
|
||||
import type { Entity } from 'pl-fe/entity-store/types';
|
||||
|
||||
type ChangeEntityFn<TEntity extends Entity> = (entity: TEntity) => TEntity
|
||||
|
||||
const useChangeEntity = <TEntity extends Entity = Entity>(entityType: Entities) => {
|
||||
const getState = useGetState();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const changeEntity = (entityId: string, change: ChangeEntityFn<TEntity>): void => {
|
||||
if (!entityId) return;
|
||||
const entity = getState().entities[entityType]?.store[entityId] as TEntity | undefined;
|
||||
if (entity) {
|
||||
const newEntity = change(entity);
|
||||
dispatch(importEntities([newEntity], entityType));
|
||||
}
|
||||
};
|
||||
|
||||
return { changeEntity };
|
||||
};
|
||||
|
||||
export { useChangeEntity, type ChangeEntityFn };
|
|
@ -1,38 +0,0 @@
|
|||
import { useAppDispatch } from 'pl-fe/hooks/useAppDispatch';
|
||||
import { useLoading } from 'pl-fe/hooks/useLoading';
|
||||
|
||||
import { incrementEntities } from '../actions';
|
||||
|
||||
import { parseEntitiesPath } from './utils';
|
||||
|
||||
import type { EntityFn, ExpandedEntitiesPath } from './types';
|
||||
|
||||
/**
|
||||
* Increases (or decreases) the `totalCount` in the entity list by the specified amount.
|
||||
* This only works if the API returns an `X-Total-Count` header and your components read it.
|
||||
*/
|
||||
const useIncrementEntity = (
|
||||
expandedPath: ExpandedEntitiesPath,
|
||||
diff: number,
|
||||
entityFn: EntityFn<string>,
|
||||
) => {
|
||||
const dispatch = useAppDispatch();
|
||||
const [isLoading, setPromise] = useLoading();
|
||||
const { entityType, listKey } = parseEntitiesPath(expandedPath);
|
||||
|
||||
const incrementEntity = async (entityId: string): Promise<void> => {
|
||||
dispatch(incrementEntities(entityType, listKey, diff));
|
||||
try {
|
||||
await setPromise(entityFn(entityId));
|
||||
} catch (e) {
|
||||
dispatch(incrementEntities(entityType, listKey, diff * -1));
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
incrementEntity,
|
||||
isLoading,
|
||||
};
|
||||
};
|
||||
|
||||
export { useIncrementEntity };
|
|
@ -1,87 +0,0 @@
|
|||
import clsx from 'clsx';
|
||||
import React from 'react';
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
import { useLocation, useRouteMatch } from 'react-router-dom';
|
||||
|
||||
import { groupComposeModal } from 'pl-fe/actions/compose';
|
||||
import { useGroup } from 'pl-fe/api/hooks/groups/useGroup';
|
||||
import Avatar from 'pl-fe/components/ui/avatar';
|
||||
import HStack from 'pl-fe/components/ui/hstack';
|
||||
import Icon from 'pl-fe/components/ui/icon';
|
||||
import { useAppDispatch } from 'pl-fe/hooks/useAppDispatch';
|
||||
import { useModalsStore } from 'pl-fe/stores/modals';
|
||||
|
||||
const messages = defineMessages({
|
||||
publish: { id: 'compose_form.publish', defaultMessage: 'Post' },
|
||||
});
|
||||
|
||||
/** FloatingActionButton (aka FAB), a composer button that floats in the corner on mobile. */
|
||||
const FloatingActionButton: React.FC = () => {
|
||||
const location = useLocation();
|
||||
|
||||
if (location.pathname.startsWith('/group/')) {
|
||||
return <GroupFAB />;
|
||||
}
|
||||
|
||||
return <HomeFAB />;
|
||||
};
|
||||
|
||||
const HomeFAB: React.FC = () => {
|
||||
const intl = useIntl();
|
||||
const { openModal } = useModalsStore();
|
||||
|
||||
const handleOpenComposeModal = () => {
|
||||
openModal('COMPOSE');
|
||||
};
|
||||
|
||||
return (
|
||||
<button
|
||||
onClick={handleOpenComposeModal}
|
||||
className={clsx(
|
||||
'inline-flex appearance-none items-center rounded-full border p-4 font-medium transition-all focus:outline-none focus:ring-2 focus:ring-offset-2',
|
||||
'border-transparent bg-secondary-500 text-gray-100 hover:bg-secondary-400 focus:bg-secondary-500 focus:ring-secondary-300',
|
||||
)}
|
||||
aria-label={intl.formatMessage(messages.publish)}
|
||||
>
|
||||
<Icon
|
||||
src={require('@tabler/icons/outline/pencil-plus.svg')}
|
||||
className='size-6'
|
||||
/>
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
const GroupFAB: React.FC = () => {
|
||||
const intl = useIntl();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const match = useRouteMatch<{ groupId: string }>('/groups/:groupId');
|
||||
const { group } = useGroup(match?.params.groupId || '');
|
||||
|
||||
if (!group) return null;
|
||||
|
||||
const handleOpenComposeModal = () => {
|
||||
dispatch(groupComposeModal(group));
|
||||
};
|
||||
|
||||
return (
|
||||
<button
|
||||
onClick={handleOpenComposeModal}
|
||||
className={clsx(
|
||||
'inline-flex appearance-none items-center rounded-full border p-4 font-medium transition-all focus:outline-none focus:ring-2 focus:ring-offset-2',
|
||||
'border-transparent bg-secondary-500 text-gray-100 hover:bg-secondary-400 focus:bg-secondary-500 focus:ring-secondary-300',
|
||||
)}
|
||||
aria-label={intl.formatMessage(messages.publish)}
|
||||
>
|
||||
<HStack space={3} alignItems='center'>
|
||||
<Avatar className='-my-3 -ml-2 border-white' size={42} src={group.avatar} alt={group.avatar_description} />
|
||||
<Icon
|
||||
src={require('@tabler/icons/outline/pencil-plus.svg')}
|
||||
className='size-6'
|
||||
/>
|
||||
</HStack>
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
export { FloatingActionButton as default };
|
|
@ -1,9 +0,0 @@
|
|||
export { normalizeAccount, type Account } from './account';
|
||||
export { normalizeAdminReport, type AdminReport } from './admin-report';
|
||||
export { normalizeChatMessage, type ChatMessage } from './chat-message';
|
||||
export { normalizeGroup, type Group } from './group';
|
||||
export { normalizeGroupMember, type GroupMember } from './group-member';
|
||||
export { normalizeNotification, type Notification } from './notification';
|
||||
export { normalizeStatus, type Status } from './status';
|
||||
|
||||
export { PlFeConfigRecord, normalizePlFeConfig } from './pl-fe/pl-fe-config';
|
Loading…
Reference in a new issue