import { mdiAccountMultiple, mdiCog, mdiContentCopy, mdiCrowd, mdiFamilyTree, mdiHumanMaleFemale, mdiLockCheck, } from "@mdi/js"; import Icon from "@mdi/react"; 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 "../hooks/context_providers/SnackbarProvider"; import { useConfirm } from "../hooks/context_providers/ConfirmDialogProvider"; import { useAlert } from "../hooks/context_providers/AlertDialogProvider"; import { Member, MemberApi, MembersList } from "../api/MemberApi"; interface FamilyContext { family: Family; members: MembersList; familyId: number; reloadFamilyInfo: () => void; reloadMembersList: () => Promise; } 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); const [members, setMembers] = React.useState(null); const loadKey = React.useRef(1); const loadPromise = React.useRef<() => void>(); const load = async () => { const familyID = Number(familyId); setFamily(await FamilyApi.GetSingle(familyID)); setMembers(await MemberApi.GetEntireList(familyID)); }; const onReload = async () => { loadKey.current += 1; setFamily(null); setMembers(null); return new Promise((res, _rej) => { loadPromise.current = () => res(); }); }; const copyInvitationCode = async () => { navigator.clipboard.writeText(family!.invitation_code); snackbar("Le code d'invitation a été copié dans le presse papier !"); }; const changeInvitationCode = async () => { try { if ( !(await 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("Echec du renouvellement du code d'invitation !"); } }; return ( { if (loadPromise.current != null) { loadPromise.current?.(); loadPromise.current = undefined; } return ( } label="Accueil" uri="" /> } label="Membres" uri="members" /> } label="Couples" uri="couples" /> } label="Arbre" uri="tree" /> Administration } label="Utilisateurs" uri="users" /> } label="Paramètres" uri="settings" /> {/* Invitation code */} {family!.is_admin && ( )} } > ); }} /> ); } export function useFamily(): FamilyContext { return React.useContext(FamilyContextK)!; } function FamilyLink(p: { icon: React.ReactElement; uri: string; label: string; }): React.ReactElement { const family = useFamily(); const location = useLocation(); const link = family.family.URL(p.uri); return ( {p.icon} ); }