gitscope
← marzneshin / v0.3.1 / dashboard/src/features/users/components/dialogs/settings/index.tsx
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/features/users/components/dialogs/settings/index.tsx · TypeScript
Blame Raw
  1import {
  2    Button,
  3    ScrollArea,
  4    Sheet,
  5    SheetContent,
  6    SheetHeader,
  7    SheetTitle,
  8    Tabs,
  9    TabsContent,
 10    TabsList,
 11    TabsTrigger,
 12    Awaiting,
 13} from "@marzneshin/components";
 14import {
 15    UserServicesTable,
 16    useUserUsageResetCmd,
 17    type UserType
 18} from "@marzneshin/features/users";
 19import { type FC, useEffect } from "react";
 20import { useTranslation } from "react-i18next";
 21import {
 22    UserStatusEnableButton,
 23    SubscriptionActions,
 24    QRCodeSection,
 25    UserInfoTable
 26} from "./user-info";
 27import { UserInfoSkeleton } from "./skeleton";
 28
 29interface UsersSettingsDialogProps {
 30    onOpenChange: (state: boolean) => void;
 31    open: boolean;
 32    entity: UserType | null;
 33    onClose: () => void;
 34    isPending: boolean;
 35}
 36
 37export const UsersSettingsDialog: FC<UsersSettingsDialogProps> = ({
 38    onOpenChange,
 39    open,
 40    entity,
 41    onClose,
 42    isPending,
 43}) => {
 44    const { t } = useTranslation();
 45    const { mutate: resetUsage } = useUserUsageResetCmd();
 46
 47    useEffect(() => {
 48        if (!open) onClose();
 49    }, [open, onClose]);
 50
 51    return (
 52        <Sheet open={open} onOpenChange={onOpenChange}>
 53            <SheetContent className="sm:min-w-full md:min-w-[700px] space-y-5">
 54                <SheetHeader >
 55                    <SheetTitle>{t("settings")}</SheetTitle>
 56                </SheetHeader>
 57                <Awaiting
 58                    Component={entity ? (
 59                        <ScrollArea className="flex flex-col gap-4 h-full">
 60                            <Tabs defaultValue="info" className="w-full h-full">
 61                                <TabsList className="w-full bg-accent">
 62                                    <TabsTrigger className="w-full" value="info">
 63                                        {t("user_info")}
 64                                    </TabsTrigger>
 65                                    <TabsTrigger className="w-full" value="services">
 66                                        {t("services")}
 67                                    </TabsTrigger>
 68                                    <TabsTrigger className="w-full" value="subscription">
 69                                        {t("subscription")}
 70                                    </TabsTrigger>
 71                                </TabsList>
 72                                <TabsContent
 73                                    value="info"
 74                                    className="flex flex-col gap-2 w-full h-full"
 75                                >
 76                                    <UserInfoTable user={entity} />
 77                                    <div className="hstack justify-center items-center gap-2">
 78                                        <Button className="w-1/2" onClick={() => resetUsage(entity)}>
 79                                            {t("page.users.reset_usage")}
 80                                        </Button>
 81                                        <UserStatusEnableButton user={entity} />
 82                                    </div>
 83                                </TabsContent>
 84                                <TabsContent value="services">
 85                                    <UserServicesTable user={entity} />
 86                                </TabsContent>
 87                                <TabsContent value="subscription">
 88                                    <QRCodeSection entity={entity} />
 89                                    <SubscriptionActions entity={entity} />
 90                                </TabsContent>
 91                            </Tabs>
 92                        </ScrollArea>
 93                    ) : (<div>Not Found</div>)}
 94                    Skeleton={<UserInfoSkeleton />}
 95                    isFetching={isPending}
 96                />
 97            </SheetContent>
 98        </Sheet>
 99    );
100};