improved ux
This commit is contained in:
parent
9b18319486
commit
1f37e05f50
|
|
@ -10,13 +10,10 @@ import DialogActions from "@mui/material/DialogActions";
|
|||
import DialogContent from "@mui/material/DialogContent";
|
||||
import DialogTitle from "@mui/material/DialogTitle";
|
||||
import { TextField } from "@mui/material";
|
||||
import { Button } from "@mui/material";
|
||||
import { IconButton, Button } from "@mui/material";
|
||||
import AddIcon from "@mui/icons-material/Add";
|
||||
|
||||
interface AddChainButtonProps {
|
||||
children?: React.ReactNode;
|
||||
}
|
||||
|
||||
export default function AddChainButton({ children }: AddChainButtonProps) {
|
||||
export default function AddChainButton() {
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [isError, setIsError] = useState(false);
|
||||
|
|
@ -50,13 +47,14 @@ export default function AddChainButton({ children }: AddChainButtonProps) {
|
|||
|
||||
return (
|
||||
<>
|
||||
<Button
|
||||
<IconButton
|
||||
size="medium"
|
||||
color="info"
|
||||
sx={{ borderRadius: "4px" }}
|
||||
onClick={() => setIsOpen(true)}
|
||||
variant="outlined"
|
||||
sx={{ width: "100%", fontWeight: "semibold" }}
|
||||
>
|
||||
{children}
|
||||
</Button>
|
||||
<AddIcon />
|
||||
</IconButton>
|
||||
|
||||
<Dialog
|
||||
open={isOpen}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ export default function LinkItem({
|
|||
>
|
||||
<span
|
||||
className={cn(
|
||||
"mr-2 h-2 w-2 rounded-full bg-neutral",
|
||||
"mr-2 max-h-2 min-h-2 min-w-2 max-w-2 rounded-full bg-neutral",
|
||||
isSelected && "bg-white",
|
||||
)}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -11,14 +11,15 @@ export default function Root({ children, className }: RootProps) {
|
|||
return (
|
||||
<motion.ul layout className={cn("", className)}>
|
||||
<AnimatePresence initial={false}>
|
||||
{Children.map(children, (child, index) => (
|
||||
{Children.map(children, (child) => (
|
||||
<motion.li
|
||||
layout
|
||||
className="block"
|
||||
key={index}
|
||||
initial={{ opacity: 0, height: 0 }}
|
||||
animate={{ opacity: 1, height: "auto" }}
|
||||
exit={{ opacity: 0, height: 0 }}
|
||||
// @ts-expect-error lazy... sry
|
||||
key={child.key}
|
||||
layout
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: 1 }}
|
||||
exit={{ opacity: 0 }}
|
||||
>
|
||||
{child}
|
||||
</motion.li>
|
||||
|
|
|
|||
|
|
@ -1,22 +1,48 @@
|
|||
import { useMemo } from "react";
|
||||
import { useState } from "react";
|
||||
import { useParams } from "@tanstack/react-router";
|
||||
import { useChainState } from "@/entities/chain/model";
|
||||
|
||||
import List from "@/shared/ui/List";
|
||||
import { TextField } from "@mui/material";
|
||||
import { AddChainButton } from "@/features/add-chain";
|
||||
|
||||
export default function Sidebar() {
|
||||
const params = useParams({ strict: false });
|
||||
const chains = useChainState((state) => state.chains || []);
|
||||
const [query, setQuery] = useState("");
|
||||
|
||||
const filteredChains = useMemo(
|
||||
() =>
|
||||
chains.filter((value) =>
|
||||
value.name?.toLowerCase().includes(query.toLocaleLowerCase()),
|
||||
),
|
||||
[query, chains],
|
||||
);
|
||||
|
||||
// @ts-expect-error because i don't know why
|
||||
const chainId: string | undefined = params.chainId;
|
||||
|
||||
return (
|
||||
<div className="no-scrollbar h-screen w-[300px] overflow-y-scroll bg-bg-color px-4 pb-8">
|
||||
<List.Root className="mt-8 space-y-2">
|
||||
{chains.map((chain, index) => (
|
||||
<div className="no-scrollbar relative flex h-screen w-[450px] flex-col bg-bg-color px-4 pb-2">
|
||||
<div className="mt-3 flex w-full items-start gap-x-3 pb-2">
|
||||
<TextField
|
||||
fullWidth
|
||||
color="primary"
|
||||
sx={{ backgroundColor: "#23253B", input: { color: "white" } }}
|
||||
variant="outlined"
|
||||
size="small"
|
||||
value={query}
|
||||
onChange={(e) => setQuery(e.target.value)}
|
||||
/>
|
||||
<AddChainButton />
|
||||
</div>
|
||||
|
||||
<div className="no-scrollbar grow overflow-y-scroll">
|
||||
<List.Root className="space-y-2">
|
||||
{filteredChains.map((chain) => (
|
||||
<List.LinkItem
|
||||
key={index}
|
||||
key={chain._id}
|
||||
to={`/$namespace/${chain._id}`}
|
||||
isSelected={chainId == chain._id}
|
||||
>
|
||||
|
|
@ -24,11 +50,6 @@ export default function Sidebar() {
|
|||
</List.LinkItem>
|
||||
))}
|
||||
</List.Root>
|
||||
|
||||
<div className="mt-4">
|
||||
<AddChainButton>
|
||||
<span className="mr-2 text-2xl font-light">+</span>Добавить
|
||||
</AddChainButton>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user