diff --git a/geneit_app/src/api/FamilyApi.ts b/geneit_app/src/api/FamilyApi.ts index 785b9b6..c6ed444 100644 --- a/geneit_app/src/api/FamilyApi.ts +++ b/geneit_app/src/api/FamilyApi.ts @@ -132,4 +132,14 @@ export class FamilyApi { uri: `/family/${id}/leave`, }); } + + /** + * Renew a family invitation code + */ + static async RenewInvitationCode(id: number): Promise { + await APIClient.exec({ + method: "POST", + uri: `/family/${id}/renew_invitation_code`, + }); + } } diff --git a/geneit_app/src/routes/FamiliesListRoute.tsx b/geneit_app/src/routes/FamiliesListRoute.tsx index da38f01..d4e5f98 100644 --- a/geneit_app/src/routes/FamiliesListRoute.tsx +++ b/geneit_app/src/routes/FamiliesListRoute.tsx @@ -211,16 +211,19 @@ function FamilyCard(p: { return ( - {" "} {p.f.name} + + {p.f.is_admin ? "Administrateur" : "Membre"} + +
{p.f.count_members === 1 ? "1 membre" - : p.f.count_members + " membres"}{" "} + : p.f.count_members + " membres"}
{p.f.count_admins === 1 ? "1 administrateur" diff --git a/geneit_app/src/widgets/BaseFamilyRoute.tsx b/geneit_app/src/widgets/BaseFamilyRoute.tsx index a7aa4b9..6c096d5 100644 --- a/geneit_app/src/widgets/BaseFamilyRoute.tsx +++ b/geneit_app/src/widgets/BaseFamilyRoute.tsx @@ -1,6 +1,7 @@ import { mdiAccountMultiple, mdiCog, + mdiContentCopy, mdiCrowd, mdiFamilyTree, mdiHumanMaleFemale, @@ -11,19 +12,24 @@ import HomeIcon from "@mui/icons-material/Home"; import { Box, Divider, + IconButton, List, + ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Tooltip, } from "@mui/material"; +import { mdiRefresh } from "@mdi/js"; import React from "react"; import { Outlet, useLocation, useParams } from "react-router-dom"; import { Family, FamilyApi } from "../api/FamilyApi"; import { AsyncWidget } from "./AsyncWidget"; import { RouterLink } from "./RouterLink"; import { useSnackbar } from "./SnackbarProvider"; +import { useConfirm } from "./ConfirmDialogProvider"; +import { useAlert } from "./AlertDialogProvider"; interface FamilyContext { family: Family; @@ -35,6 +41,8 @@ const FamilyContextK = React.createContext(null); export function BaseFamilyRoute(): React.ReactElement { const { familyId } = useParams(); const snackbar = useSnackbar(); + const alert = useAlert(); + const confirm = useConfirm(); const [family, setFamily] = React.useState(null); @@ -54,10 +62,30 @@ export function BaseFamilyRoute(): React.ReactElement { snackbar("Le code d'invitation a été copié dans le presse papier !"); }; + const changeInvitationCode = async () => { + try { + if ( + !(await confirm.confirm( + "Voulez-vous vraiment générer un nouveau code d'invitation pour cette famille ? Cette action aura pour effet d'invalider l'ancien code !" + )) + ) + return; + + await FamilyApi.RenewInvitationCode(family!.family_id); + + snackbar("Le code d'invitation a été changé avec succès !"); + + onReload(); + } catch (e) { + console.error(e); + alert.alert("Echec du renouvellement du code d'invitation !"); + } + }; + return ( ( @@ -76,6 +104,7 @@ export function BaseFamilyRoute(): React.ReactElement { theme.palette.mode === "light" ? theme.palette.grey[100] @@ -118,17 +147,35 @@ export function BaseFamilyRoute(): React.ReactElement { /> {/* Invitation code */} - - - - - - - - + + + + + + + + + {family!.is_admin && ( + + + + + + )} + + } + > + + + + +