mirror of
https://github.com/duckietm/Nitro-V3.git
synced 2026-06-19 15:06:20 +00:00
feat(friends): category manager modal (create/rename/delete groups)
This commit is contained in:
@@ -0,0 +1,96 @@
|
|||||||
|
import { FC, MouseEvent, useState } from 'react';
|
||||||
|
import { FriendCategoryData } from '@nitrots/nitro-renderer';
|
||||||
|
import { LocalizeText } from '../../../../api';
|
||||||
|
import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common';
|
||||||
|
import { useFriendsActions } from '../../../../hooks';
|
||||||
|
|
||||||
|
interface FriendsCategoryManagerViewProps
|
||||||
|
{
|
||||||
|
categories: FriendCategoryData[];
|
||||||
|
onCloseClick: (event: MouseEvent) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const FriendsCategoryManagerView: FC<FriendsCategoryManagerViewProps> = props =>
|
||||||
|
{
|
||||||
|
const { categories = [], onCloseClick = null } = props;
|
||||||
|
const { addCategory, renameCategory, removeCategory } = useFriendsActions();
|
||||||
|
const [ newName, setNewName ] = useState<string>('');
|
||||||
|
const [ editingId, setEditingId ] = useState<number>(0);
|
||||||
|
const [ editingName, setEditingName ] = useState<string>('');
|
||||||
|
|
||||||
|
const submitAdd = () =>
|
||||||
|
{
|
||||||
|
const trimmed = newName.trim();
|
||||||
|
if(!trimmed.length) return;
|
||||||
|
addCategory(trimmed);
|
||||||
|
setNewName('');
|
||||||
|
};
|
||||||
|
|
||||||
|
const submitRename = () =>
|
||||||
|
{
|
||||||
|
const trimmed = editingName.trim();
|
||||||
|
if(editingId && trimmed.length) renameCategory(editingId, trimmed);
|
||||||
|
setEditingId(0);
|
||||||
|
setEditingName('');
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NitroCardView className="nitro-friends-category-manager" theme="primary-slim" uniqueKey="nitro-friends-category-manager" isResizable={ false } style={ { width: 270, minWidth: 270 } }>
|
||||||
|
<NitroCardHeaderView headerText={ LocalizeText('friendlist.friends') } onCloseClick={ onCloseClick } />
|
||||||
|
<NitroCardContentView className="text-black" gap={ 1 }>
|
||||||
|
<Flex gap={ 1 } alignItems="center">
|
||||||
|
<input
|
||||||
|
className="form-control form-control-sm w-full"
|
||||||
|
maxLength={ 25 }
|
||||||
|
type="text"
|
||||||
|
value={ newName }
|
||||||
|
onChange={ event => setNewName(event.target.value) }
|
||||||
|
onKeyDown={ event => (event.key === 'Enter') && submitAdd() } />
|
||||||
|
<Button disabled={ !newName.trim().length || (categories.length >= 20) } onClick={ submitAdd }>
|
||||||
|
{ 'Create' }
|
||||||
|
</Button>
|
||||||
|
</Flex>
|
||||||
|
<Column gap={ 1 }>
|
||||||
|
{ categories.map(category => (
|
||||||
|
<Flex key={ category.id } alignItems="center" gap={ 1 }>
|
||||||
|
{ (editingId === category.id) ?
|
||||||
|
<>
|
||||||
|
<input
|
||||||
|
autoFocus
|
||||||
|
className="form-control form-control-sm w-full"
|
||||||
|
maxLength={ 25 }
|
||||||
|
type="text"
|
||||||
|
value={ editingName }
|
||||||
|
onChange={ event => setEditingName(event.target.value) }
|
||||||
|
onKeyDown={ event => (event.key === 'Enter') && submitRename() } />
|
||||||
|
<Button onClick={ submitRename }>
|
||||||
|
{ 'Save' }
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
:
|
||||||
|
<>
|
||||||
|
<span className="grow text-sm">{ category.name }</span>
|
||||||
|
<span
|
||||||
|
className="cursor-pointer text-base leading-none select-none"
|
||||||
|
title={ LocalizeText('generic.edit') }
|
||||||
|
onClick={ () => { setEditingId(category.id); setEditingName(category.name); } }>
|
||||||
|
{ '✎' }
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="cursor-pointer text-base leading-none select-none"
|
||||||
|
title={ LocalizeText('generic.delete') }
|
||||||
|
onClick={ () => removeCategory(category.id) }>
|
||||||
|
{ '✕' }
|
||||||
|
</span>
|
||||||
|
</> }
|
||||||
|
</Flex>
|
||||||
|
)) }
|
||||||
|
{ !categories.length &&
|
||||||
|
<span className="text-muted text-center py-2 text-sm">
|
||||||
|
{ LocalizeText('friendlist.search.nofriendsfound') }
|
||||||
|
</span> }
|
||||||
|
</Column>
|
||||||
|
</NitroCardContentView>
|
||||||
|
</NitroCardView>
|
||||||
|
);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user