|
| 1 | +import { Team } from '@hackmd/api/dist/type'; |
| 2 | +import { useEffect, useMemo, useState } from 'react'; |
1 | 3 | import { TreeItem } from 'react-vsc-treeview';
|
| 4 | +import useSWR from 'swr'; |
| 5 | + |
| 6 | +import { API } from '../../api'; |
| 7 | +import { NoteTreeItem } from '../components/NoteTreeItem'; |
| 8 | +import { useTeamNotesStore } from '../store'; |
| 9 | + |
| 10 | +const TeamTreeItem = ({ team }: { team: Team }) => { |
| 11 | + const { data: notes = [] } = useSWR( |
| 12 | + () => (team ? `/teams/${team.id}/notes` : null), |
| 13 | + () => API.getTeamNotes(team.path) |
| 14 | + ); |
| 15 | + |
| 16 | + return ( |
| 17 | + <TreeItem label={team.name} expanded> |
| 18 | + {notes.map((note) => { |
| 19 | + return <NoteTreeItem key={note.id} note={note} />; |
| 20 | + })} |
| 21 | + |
| 22 | + {notes.length === 0 && <TreeItem label="No notes" />} |
| 23 | + </TreeItem> |
| 24 | + ); |
| 25 | +}; |
2 | 26 |
|
3 | 27 | export const TeamNotes = () => {
|
4 |
| - return <TreeItem label="Hello World"></TreeItem>; |
| 28 | + const { data: teams = [] } = useSWR('/teams', () => API.getTeams()); |
| 29 | + const [selectedTeamId, setSelectedTeamId] = useState(useTeamNotesStore.getState().selectedTeamId); |
| 30 | + |
| 31 | + // I'm not sure why using useTeamNotesStore doesn't trigger re-render |
| 32 | + // So we use useEffect to subscribe to the zustand store and update the useState we use in the component |
| 33 | + useEffect(() => { |
| 34 | + useTeamNotesStore.subscribe((state) => setSelectedTeamId(state.selectedTeamId)); |
| 35 | + }, []); |
| 36 | + |
| 37 | + const selectedTeam = useMemo(() => teams.find((t) => t.id === selectedTeamId), [teams, selectedTeamId]); |
| 38 | + |
| 39 | + return ( |
| 40 | + <> |
| 41 | + <TreeItem |
| 42 | + label="Click to select a team" |
| 43 | + command={{ |
| 44 | + title: 'Select a team', |
| 45 | + command: 'selectTeam', |
| 46 | + }} |
| 47 | + /> |
| 48 | + |
| 49 | + {selectedTeam && <TeamTreeItem team={selectedTeam} />} |
| 50 | + </> |
| 51 | + ); |
5 | 52 | };
|
0 commit comments