refactor(web): move all types into typings folder

This commit is contained in:
Luke
2023-02-15 13:00:09 +01:00
parent 5b4c6b8674
commit 829bec2592
42 changed files with 181 additions and 169 deletions

View File

@@ -1,5 +1,5 @@
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
import { AlertProps } from '../../dialog/AlertDialog'; import { AlertProps } from '../../../typings';
export const debugAlert = () => { export const debugAlert = () => {
debugData<AlertProps>([ debugData<AlertProps>([

View File

@@ -1,4 +1,4 @@
import { ContextMenuProps } from '../../../interfaces/context'; import { ContextMenuProps } from '../../../typings';
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
export const debugContext = () => { export const debugContext = () => {
@@ -16,22 +16,22 @@ export const debugContext = () => {
colorScheme: 'blue', colorScheme: 'blue',
metadata: [ metadata: [
{ {
["label"]: "Body", ['label']: 'Body',
["value"]: "55%", ['value']: '55%',
["progress"]: 55 ['progress']: 55,
}, },
{ {
["label"]: "Engine", ['label']: 'Engine',
["value"]: "100%", ['value']: '100%',
["progress"]: 100 ['progress']: 100,
}, },
{ {
["label"]: "Oil", ['label']: 'Oil',
["progress"]: 11 ['progress']: 11,
}, },
{ {
["label"]: "Fuel", ['label']: 'Fuel',
["progress"]: 87 ['progress']: 87,
}, },
], ],
}, },
@@ -56,7 +56,7 @@ export const debugContext = () => {
progress: 80, progress: 80,
icon: 'car-side', icon: 'car-side',
metadata: [{ label: 'Durability', value: '80%' }], metadata: [{ label: 'Durability', value: '80%' }],
colorScheme: 'blue' colorScheme: 'blue',
}, },
{ {
title: 'Menu button', title: 'Menu button',

View File

@@ -1,5 +1,5 @@
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
import { InputProps } from '../../dialog/InputDialog'; import type { InputProps } from '../../../typings';
export const debugInput = () => { export const debugInput = () => {
debugData<InputProps>([ debugData<InputProps>([

View File

@@ -1,5 +1,5 @@
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
import { MenuSettings } from '../../menu/list'; import { MenuSettings } from '../../../typings';
export const debugMenu = () => { export const debugMenu = () => {
debugData<MenuSettings>([ debugData<MenuSettings>([
@@ -34,7 +34,7 @@ export const debugMenu = () => {
icon: 'car-side', icon: 'car-side',
description: 'Durability: 80%', description: 'Durability: 80%',
colorScheme: 'blue', colorScheme: 'blue',
iconColor: '#55778d' iconColor: '#55778d',
}, },
{ label: 'Option 1' }, { label: 'Option 1' },
{ label: 'Option 2' }, { label: 'Option 2' },

View File

@@ -1,28 +1,30 @@
import { CustomNotificationProps } from '../../notifications/NotificationWrapper'; import { NotificationProps } from '../../../typings';
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
export const debugCustomNotification = () => { export const debugCustomNotification = () => {
debugData<CustomNotificationProps>([ debugData<NotificationProps>([
{ {
action: 'notify', action: 'notify',
data: { data: {
title: 'Success', title: 'Success',
description: 'Notification description', description: 'Notification description',
type: 'success', type: 'success',
id: 'pogchamp',
}, },
}, },
]); ]);
debugData<CustomNotificationProps>([ debugData<NotificationProps>([
{ {
action: 'notify', action: 'notify',
data: { data: {
title: 'Info', title: 'Success',
description: 'Notification description', description: 'Notification description',
type: 'info', type: 'success',
id: 'pogchamp',
}, },
}, },
]); ]);
debugData<CustomNotificationProps>([ debugData<NotificationProps>([
{ {
action: 'notify', action: 'notify',
data: { data: {
@@ -32,7 +34,7 @@ export const debugCustomNotification = () => {
}, },
}, },
]); ]);
debugData<CustomNotificationProps>([ debugData<NotificationProps>([
{ {
action: 'notify', action: 'notify',
data: { data: {

View File

@@ -1,5 +1,5 @@
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
import { ProgressbarProps } from '../../progress/Progressbar'; import { ProgressbarProps } from '../../../typings';
export const debugProgressbar = () => { export const debugProgressbar = () => {
debugData<ProgressbarProps>([ debugData<ProgressbarProps>([

View File

@@ -1,5 +1,5 @@
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
import type { MenuItem } from '../../menu/radial'; import type { MenuItem } from '../../../typings';
export const debugRadial = () => { export const debugRadial = () => {
debugData<{ items: MenuItem[]; sub?: boolean }>([ debugData<{ items: MenuItem[]; sub?: boolean }>([

View File

@@ -1,5 +1,5 @@
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
import { GameDifficulty } from '../../skillcheck'; import { GameDifficulty } from '../../../typings';
export const debugSkillCheck = () => { export const debugSkillCheck = () => {
debugData<{ difficulty: GameDifficulty | GameDifficulty[]; inputs?: string[] }>([ debugData<{ difficulty: GameDifficulty | GameDifficulty[]; inputs?: string[] }>([

View File

@@ -1,4 +1,4 @@
import { TextUiProps } from '../../textui/TextUI'; import { TextUiProps } from '../../../typings';
import { debugData } from '../../../utils/debugData'; import { debugData } from '../../../utils/debugData';
export const debugTextUI = () => { export const debugTextUI = () => {

View File

@@ -5,19 +5,7 @@ import { useNuiEvent } from '../../hooks/useNuiEvent';
import { fetchNui } from '../../utils/fetchNui'; import { fetchNui } from '../../utils/fetchNui';
import { useLocales } from '../../providers/LocaleProvider'; import { useLocales } from '../../providers/LocaleProvider';
import remarkGfm from 'remark-gfm'; import remarkGfm from 'remark-gfm';
import type { AlertProps } from '../../typings';
export interface AlertProps {
header: string;
content: string;
centered?: boolean;
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
overflow?: boolean;
cancel?: boolean;
labels?: {
cancel?: string;
confirm?: string;
};
}
const AlertDialog: React.FC = () => { const AlertDialog: React.FC = () => {
const { locale } = useLocales(); const { locale } = useLocales();

View File

@@ -3,18 +3,7 @@ import React from 'react';
import { useNuiEvent } from '../../hooks/useNuiEvent'; import { useNuiEvent } from '../../hooks/useNuiEvent';
import { useLocales } from '../../providers/LocaleProvider'; import { useLocales } from '../../providers/LocaleProvider';
import { fetchNui } from '../../utils/fetchNui'; import { fetchNui } from '../../utils/fetchNui';
import { import { OptionValue } from '../../typings';
IInput,
ICheckbox,
ISelect,
INumber,
ISlider,
IColorInput,
OptionValue,
IDateInput,
ITextarea,
ITimeInput,
} from '../../interfaces/dialog';
import InputField from './components/fields/input'; import InputField from './components/fields/input';
import CheckboxField from './components/fields/checkbox'; import CheckboxField from './components/fields/checkbox';
import SelectField from './components/fields/select'; import SelectField from './components/fields/select';
@@ -25,14 +14,7 @@ import ColorField from './components/fields/color';
import DateField from './components/fields/date'; import DateField from './components/fields/date';
import TextareaField from './components/fields/textarea'; import TextareaField from './components/fields/textarea';
import TimeField from './components/fields/time'; import TimeField from './components/fields/time';
import type { InputProps } from '../../typings';
export interface InputProps {
heading: string;
rows: Array<IInput | ICheckbox | ISelect | INumber | ISlider | IColorInput | IDateInput | ITextarea | ITimeInput>;
options?: {
allowCancel?: boolean;
};
}
export type FormValues = { export type FormValues = {
test: { test: {

View File

@@ -1,5 +1,5 @@
import { Checkbox } from '@mantine/core'; import { Checkbox } from '@mantine/core';
import { ICheckbox } from '../../../../interfaces/dialog'; import { ICheckbox } from '../../../../typings/dialog';
import { UseFormRegisterReturn } from 'react-hook-form'; import { UseFormRegisterReturn } from 'react-hook-form';
interface Props { interface Props {

View File

@@ -1,4 +1,4 @@
import { IColorInput } from '../../../../interfaces/dialog'; import { IColorInput } from '../../../../typings/dialog';
import { Control, useController } from 'react-hook-form'; import { Control, useController } from 'react-hook-form';
import { FormValues } from '../../InputDialog'; import { FormValues } from '../../InputDialog';
import { ColorInput } from '@mantine/core'; import { ColorInput } from '@mantine/core';

View File

@@ -1,4 +1,4 @@
import { IDateInput } from '../../../../interfaces/dialog'; import { IDateInput } from '../../../../typings/dialog';
import { Control, useController } from 'react-hook-form'; import { Control, useController } from 'react-hook-form';
import { FormValues } from '../../InputDialog'; import { FormValues } from '../../InputDialog';
import { DatePicker, DateRangePicker, TimeInput } from '@mantine/dates'; import { DatePicker, DateRangePicker, TimeInput } from '@mantine/dates';

View File

@@ -1,7 +1,7 @@
import { createStyles, PasswordInput, TextInput } from '@mantine/core'; import { createStyles, PasswordInput, TextInput } from '@mantine/core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import React from 'react'; import React from 'react';
import { IInput } from '../../../../interfaces/dialog'; import { IInput } from '../../../../typings/dialog';
import { UseFormRegisterReturn } from 'react-hook-form'; import { UseFormRegisterReturn } from 'react-hook-form';
interface Props { interface Props {

View File

@@ -1,5 +1,5 @@
import { NumberInput } from '@mantine/core'; import { NumberInput } from '@mantine/core';
import { INumber } from '../../../../interfaces/dialog'; import { INumber } from '../../../../typings/dialog';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Control, useController } from 'react-hook-form'; import { Control, useController } from 'react-hook-form';
import { FormValues } from '../../InputDialog'; import { FormValues } from '../../InputDialog';

View File

@@ -1,5 +1,5 @@
import { MultiSelect, Select } from '@mantine/core'; import { MultiSelect, Select } from '@mantine/core';
import { ISelect } from '../../../../interfaces/dialog'; import { ISelect } from '../../../../typings/dialog';
import { Control, useController } from 'react-hook-form'; import { Control, useController } from 'react-hook-form';
import { FormValues } from '../../InputDialog'; import { FormValues } from '../../InputDialog';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';

View File

@@ -1,5 +1,5 @@
import { Box, Slider, Text } from '@mantine/core'; import { Box, Slider, Text } from '@mantine/core';
import { ISlider } from '../../../../interfaces/dialog'; import { ISlider } from '../../../../typings/dialog';
import { Control, useController } from 'react-hook-form'; import { Control, useController } from 'react-hook-form';
import { FormValues } from '../../InputDialog'; import { FormValues } from '../../InputDialog';

View File

@@ -1,6 +1,6 @@
import { Textarea } from '@mantine/core'; import { Textarea } from '@mantine/core';
import { UseFormRegisterReturn } from 'react-hook-form'; import { UseFormRegisterReturn } from 'react-hook-form';
import { ITextarea } from '../../../../interfaces/dialog'; import { ITextarea } from '../../../../typings/dialog';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import React from 'react'; import React from 'react';

View File

@@ -1,7 +1,7 @@
import { TimeInput } from '@mantine/dates'; import { TimeInput } from '@mantine/dates';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Control, useController } from 'react-hook-form'; import { Control, useController } from 'react-hook-form';
import { ITimeInput } from '../../../../interfaces/dialog'; import { ITimeInput } from '../../../../typings/dialog';
import { FormValues } from '../../InputDialog'; import { FormValues } from '../../InputDialog';
interface Props { interface Props {

View File

@@ -1,7 +1,7 @@
import { useNuiEvent } from '../../../hooks/useNuiEvent'; import { useNuiEvent } from '../../../hooks/useNuiEvent';
import { Box, Stack, Text, Flex } from '@mantine/core'; import { Box, Stack, Text, Flex } from '@mantine/core';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { ContextMenuProps } from '../../../interfaces/context'; import { ContextMenuProps } from '../../../typings';
import ContextButton from './components/ContextButton'; import ContextButton from './components/ContextButton';
import { fetchNui } from '../../../utils/fetchNui'; import { fetchNui } from '../../../utils/fetchNui';
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';

View File

@@ -1,7 +1,7 @@
import { Button, Box, Group, Stack, Text, Progress, HoverCard, Image, createStyles } from '@mantine/core'; import { Button, Box, Group, Stack, Text, Progress, HoverCard, Image, createStyles } from '@mantine/core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';
import { Option, ContextMenuProps } from '../../../../interfaces/context'; import { Option, ContextMenuProps } from '../../../../typings';
import { fetchNui } from '../../../../utils/fetchNui'; import { fetchNui } from '../../../../utils/fetchNui';
const openMenu = (id: string | undefined) => { const openMenu = (id: string | undefined) => {
@@ -90,17 +90,19 @@ const ContextButton: React.FC<{
<HoverCard.Dropdown className={classes.dropdown}> <HoverCard.Dropdown className={classes.dropdown}>
{button.image && <Image src={button.image} />} {button.image && <Image src={button.image} />}
{Array.isArray(button.metadata) ? ( {Array.isArray(button.metadata) ? (
button.metadata.map((metadata: string | { label: string; value?: any; progress?: number }, index: number) => ( button.metadata.map(
<> (metadata: string | { label: string; value?: any; progress?: number }, index: number) => (
<Text key={`context-metadata-${index}`}> <>
{typeof metadata === 'string' ? `${metadata}` : `${metadata.label}: ${metadata?.value ?? ""}`} <Text key={`context-metadata-${index}`}>
</Text> {typeof metadata === 'string' ? `${metadata}` : `${metadata.label}: ${metadata?.value ?? ''}`}
</Text>
{typeof metadata === 'object' && metadata.progress !== undefined && ( {typeof metadata === 'object' && metadata.progress !== undefined && (
<Progress value={metadata.progress} size="sm" color={button.colorScheme || 'dark.3'} /> <Progress value={metadata.progress} size="sm" color={button.colorScheme || 'dark.3'} />
)} )}
</> </>
)) )
)
) : ( ) : (
<> <>
{typeof button.metadata === 'object' && {typeof button.metadata === 'object' &&

View File

@@ -2,7 +2,7 @@ import { Box, Group, Stack, Text, Progress } from '@mantine/core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import React, { forwardRef } from 'react'; import React, { forwardRef } from 'react';
import CustomCheckbox from './CustomCheckbox'; import CustomCheckbox from './CustomCheckbox';
import type { MenuItem } from './index'; import type { MenuItem } from '../../../typings';
import { createStyles } from '@mantine/core'; import { createStyles } from '@mantine/core';
interface Props { interface Props {

View File

@@ -4,33 +4,10 @@ import { useNuiEvent } from '../../../hooks/useNuiEvent';
import ListItem from './ListItem'; import ListItem from './ListItem';
import Header from './Header'; import Header from './Header';
import FocusTrap from 'focus-trap-react'; import FocusTrap from 'focus-trap-react';
import { IconProp } from '@fortawesome/fontawesome-svg-core';
import { fetchNui } from '../../../utils/fetchNui'; import { fetchNui } from '../../../utils/fetchNui';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import React from 'react'; import React from 'react';
import type { MenuPosition, MenuSettings } from '../../../typings';
type MenuPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
export interface MenuItem {
label: string;
progress?: number;
colorScheme?: string;
checked?: boolean;
values?: Array<string | { label: string; description: string }>;
description?: string;
icon?: IconProp;
iconColor?: string;
defaultIndex?: number;
close?: boolean;
}
export interface MenuSettings {
position?: MenuPosition;
title: string;
canClose?: boolean;
items: Array<MenuItem>;
startItemIndex?: number;
}
const useStyles = createStyles((theme, params: { position?: MenuPosition; itemCount: number; selected: number }) => ({ const useStyles = createStyles((theme, params: { position?: MenuPosition; itemCount: number; selected: number }) => ({
tooltip: { tooltip: {

View File

@@ -1,15 +1,10 @@
import { Box, createStyles } from '@mantine/core'; import { Box, createStyles } from '@mantine/core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { IconProp } from '@fortawesome/fontawesome-svg-core';
import { useState } from 'react'; import { useState } from 'react';
import { useNuiEvent } from '../../../hooks/useNuiEvent'; import { useNuiEvent } from '../../../hooks/useNuiEvent';
import { fetchNui } from '../../../utils/fetchNui'; import { fetchNui } from '../../../utils/fetchNui';
import ScaleFade from '../../../transitions/ScaleFade'; import ScaleFade from '../../../transitions/ScaleFade';
import type { RadialMenuItem } from '../../../typings';
export interface MenuItem {
icon: IconProp;
label: string;
}
const useStyles = createStyles((theme) => ({ const useStyles = createStyles((theme) => ({
wrapper: { wrapper: {
@@ -61,12 +56,12 @@ const degToRad = (deg: number) => deg * (Math.PI / 180);
const RadialMenu: React.FC = () => { const RadialMenu: React.FC = () => {
const { classes } = useStyles(); const { classes } = useStyles();
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [menu, setMenu] = useState<{ items: MenuItem[]; sub?: boolean }>({ const [menu, setMenu] = useState<{ items: RadialMenuItem[]; sub?: boolean }>({
items: [], items: [],
sub: false, sub: false,
}); });
useNuiEvent('openRadialMenu', async (data: { items: MenuItem[]; sub?: boolean } | false) => { useNuiEvent('openRadialMenu', async (data: { items: RadialMenuItem[]; sub?: boolean } | false) => {
if (!data) return setVisible(false); if (!data) return setVisible(false);
if (visible) { if (visible) {
setVisible(false); setVisible(false);
@@ -76,7 +71,7 @@ const RadialMenu: React.FC = () => {
setVisible(true); setVisible(true);
}); });
useNuiEvent('refreshItems', (data: MenuItem[]) => { useNuiEvent('refreshItems', (data: RadialMenuItem[]) => {
setMenu({ ...menu, items: data }); setMenu({ ...menu, items: data });
}); });

View File

@@ -1,22 +1,10 @@
import { useNuiEvent } from '../../hooks/useNuiEvent'; import { useNuiEvent } from '../../hooks/useNuiEvent';
import { IconProp } from '@fortawesome/fontawesome-svg-core'; import { toast, Toaster } from 'react-hot-toast';
import { toast, Toaster, ToastPosition } from 'react-hot-toast';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';
import { Avatar, createStyles, Group, Stack, Box, Text, keyframes } from '@mantine/core'; import { Avatar, createStyles, Group, Stack, Box, Text, keyframes } from '@mantine/core';
import React from 'react'; import React from 'react';
import type { NotificationProps } from '../../typings';
export interface CustomNotificationProps {
style?: React.CSSProperties;
description?: string;
title?: string;
duration?: number;
icon?: IconProp;
iconColor?: string;
position?: ToastPosition | 'top' | 'bottom';
id?: number | string;
type?: string;
}
const useStyles = createStyles((theme) => ({ const useStyles = createStyles((theme) => ({
container: { container: {
@@ -117,7 +105,7 @@ const exitAnimationBottom = keyframes({
const Notifications: React.FC = () => { const Notifications: React.FC = () => {
const { classes } = useStyles(); const { classes } = useStyles();
useNuiEvent<CustomNotificationProps>('notify', (data) => { useNuiEvent<NotificationProps>('notify', (data) => {
if (!data.title && !data.description) return; if (!data.title && !data.description) return;
// Backwards compat with old notifications // Backwards compat with old notifications
let position = data.position; let position = data.position;

View File

@@ -3,13 +3,7 @@ import { RingProgress, Text, useMantineTheme, keyframes, Stack, createStyles } f
import { useNuiEvent } from '../../hooks/useNuiEvent'; import { useNuiEvent } from '../../hooks/useNuiEvent';
import { fetchNui } from '../../utils/fetchNui'; import { fetchNui } from '../../utils/fetchNui';
import ScaleFade from '../../transitions/ScaleFade'; import ScaleFade from '../../transitions/ScaleFade';
import type { CircleProgressbarProps } from '../../typings';
export interface CircleProgressbarProps {
label?: string;
duration: number;
position?: 'middle' | 'bottom';
percent?: boolean;
}
// 33.5 is the r of the circle // 33.5 is the r of the circle
const progressCircle = keyframes({ const progressCircle = keyframes({

View File

@@ -3,11 +3,7 @@ import { Box, Text, createStyles } from '@mantine/core';
import { useNuiEvent } from '../../hooks/useNuiEvent'; import { useNuiEvent } from '../../hooks/useNuiEvent';
import { fetchNui } from '../../utils/fetchNui'; import { fetchNui } from '../../utils/fetchNui';
import ScaleFade from '../../transitions/ScaleFade'; import ScaleFade from '../../transitions/ScaleFade';
import type { ProgressbarProps } from '../../typings';
export interface ProgressbarProps {
label: string;
duration: number;
}
const useStyles = createStyles((theme) => ({ const useStyles = createStyles((theme) => ({
container: { container: {

View File

@@ -3,20 +3,7 @@ import { useNuiEvent } from '../../hooks/useNuiEvent';
import Indicator from './indicator'; import Indicator from './indicator';
import { fetchNui } from '../../utils/fetchNui'; import { fetchNui } from '../../utils/fetchNui';
import { Box, createStyles } from '@mantine/core'; import { Box, createStyles } from '@mantine/core';
import type { SkillCheckProps, GameDifficulty } from '../../typings';
interface CustomGameDifficulty {
areaSize: number;
speedMultiplier: number;
}
export type GameDifficulty = 'easy' | 'medium' | 'hard' | CustomGameDifficulty;
export interface SkillCheckProps {
angle: number;
difficultyOffset: number;
difficulty: GameDifficulty;
key: string;
}
export const circleCircumference = 2 * 50 * Math.PI; export const circleCircumference = 2 * 50 * Math.PI;

View File

@@ -1,5 +1,5 @@
import { useCallback, useEffect, useState } from 'react'; import { useCallback, useEffect, useState } from 'react';
import { SkillCheckProps } from './index'; import type { SkillCheckProps } from '../../typings';
import { useInterval } from '@mantine/hooks'; import { useInterval } from '@mantine/hooks';
import { circleCircumference } from './index'; import { circleCircumference } from './index';

View File

@@ -3,21 +3,11 @@ import { useNuiEvent } from '../../hooks/useNuiEvent';
import { Box, createStyles, Group } from '@mantine/core'; import { Box, createStyles, Group } from '@mantine/core';
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { IconProp } from '@fortawesome/fontawesome-svg-core';
import ScaleFade from '../../transitions/ScaleFade'; import ScaleFade from '../../transitions/ScaleFade';
import remarkGfm from 'remark-gfm'; import remarkGfm from 'remark-gfm';
import type { TextUiProps, TextUiPosition } from '../../typings';
type Position = 'right-center' | 'left-center' | 'top-center'; const useStyles = createStyles((theme, params: { position?: TextUiPosition }) => ({
export interface TextUiProps {
text: string;
position?: Position;
icon?: IconProp;
iconColor?: string;
style?: React.CSSProperties;
}
const useStyles = createStyles((theme, params: { position?: Position }) => ({
wrapper: { wrapper: {
height: '100%', height: '100%',
width: '100%', width: '100%',

12
web/src/typings/alert.ts Normal file
View File

@@ -0,0 +1,12 @@
export interface AlertProps {
header: string;
content: string;
centered?: boolean;
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
overflow?: boolean;
cancel?: boolean;
labels?: {
cancel?: string;
confirm?: string;
};
}

View File

@@ -1,5 +1,13 @@
import { IconProp } from '@fortawesome/fontawesome-svg-core'; import { IconProp } from '@fortawesome/fontawesome-svg-core';
export interface InputProps {
heading: string;
rows: Array<IInput | ICheckbox | ISelect | INumber | ISlider | IColorInput | IDateInput | ITextarea | ITimeInput>;
options?: {
allowCancel?: boolean;
};
}
type BaseField<T, U> = { type BaseField<T, U> = {
type: T; type: T;
label: string; label: string;

9
web/src/typings/index.ts Normal file
View File

@@ -0,0 +1,9 @@
export * from './alert';
export * from './context';
export * from './dialog';
export * from './menu';
export * from './notifications';
export * from './progress';
export * from './radial';
export * from './skillcheck';
export * from './textui';

24
web/src/typings/menu.ts Normal file
View File

@@ -0,0 +1,24 @@
import { IconProp } from '@fortawesome/fontawesome-svg-core';
export type MenuPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
export interface MenuItem {
label: string;
progress?: number;
colorScheme?: string;
checked?: boolean;
values?: Array<string | { label: string; description: string }>;
description?: string;
icon?: IconProp;
iconColor?: string;
defaultIndex?: number;
close?: boolean;
}
export interface MenuSettings {
position?: MenuPosition;
title: string;
canClose?: boolean;
items: Array<MenuItem>;
startItemIndex?: number;
}

View File

@@ -0,0 +1,15 @@
import React from 'react';
import { ToastPosition } from 'react-hot-toast';
import { IconProp } from '@fortawesome/fontawesome-svg-core';
export interface NotificationProps {
style?: React.CSSProperties;
description?: string;
title?: string;
duration?: number;
icon?: IconProp;
iconColor?: string;
position?: ToastPosition | 'top' | 'bottom';
id?: number | string;
type?: string;
}

View File

@@ -0,0 +1,11 @@
export interface CircleProgressbarProps {
label?: string;
duration: number;
position?: 'middle' | 'bottom';
percent?: boolean;
}
export interface ProgressbarProps {
label: string;
duration: number;
}

View File

@@ -0,0 +1,6 @@
import { IconProp } from '@fortawesome/fontawesome-svg-core';
export interface RadialMenuItem {
icon: IconProp;
label: string;
}

View File

@@ -0,0 +1,13 @@
interface CustomGameDifficulty {
areaSize: number;
speedMultiplier: number;
}
export type GameDifficulty = 'easy' | 'medium' | 'hard' | CustomGameDifficulty;
export interface SkillCheckProps {
angle: number;
difficultyOffset: number;
difficulty: GameDifficulty;
key: string;
}

12
web/src/typings/textui.ts Normal file
View File

@@ -0,0 +1,12 @@
import { IconProp } from '@fortawesome/fontawesome-svg-core';
import React from 'react';
export type TextUiPosition = 'right-center' | 'left-center' | 'top-center';
export interface TextUiProps {
text: string;
position?: TextUiPosition;
icon?: IconProp;
iconColor?: string;
style?: React.CSSProperties;
}

View File

@@ -1,5 +1,6 @@
import { defineConfig } from "vite"; import { defineConfig } from "vite";
import react from "@vitejs/plugin-react"; import react from "@vitejs/plugin-react";
const path = require("path");
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({