diff --git a/packages/web/src/routes/BoardPage.tsx b/packages/web/src/routes/BoardPage.tsx index 64640a8..81e6cf7 100644 --- a/packages/web/src/routes/BoardPage.tsx +++ b/packages/web/src/routes/BoardPage.tsx @@ -134,6 +134,27 @@ export function BoardPage() { const navigate = useNavigate(); const [activeTeamKey, setActiveTeamKey] = useState(() => readStoredTeamKey()); const [pendingTeamKey, setPendingTeamKey] = useState(null); + const activeTeamKeyRef = useRef(activeTeamKey); + activeTeamKeyRef.current = activeTeamKey; + + useEffect(() => { + function handleActiveTeamKeyChange(event: Event) { + const nextTeamKey = + event instanceof CustomEvent && (typeof event.detail === 'string' || event.detail === null) + ? (event.detail as string | null) + : readStoredTeamKey(); + + if (nextTeamKey !== activeTeamKeyRef.current) { + setPendingTeamKey(nextTeamKey); + } + } + + window.addEventListener('involute:active-team-key', handleActiveTeamKeyChange as EventListener); + + return () => { + window.removeEventListener('involute:active-team-key', handleActiveTeamKeyChange as EventListener); + }; + }, []); const [isLoadingMoreIssues, setIsLoadingMoreIssues] = useState(false); const [loadMoreIssuesError, setLoadMoreIssuesError] = useState(null); const queryTeamKey = pendingTeamKey ?? activeTeamKey; diff --git a/packages/web/src/routes/CyclesPage.tsx b/packages/web/src/routes/CyclesPage.tsx index 5a32347..a928c1a 100644 --- a/packages/web/src/routes/CyclesPage.tsx +++ b/packages/web/src/routes/CyclesPage.tsx @@ -1,5 +1,5 @@ import { useMutation, useQuery } from '@apollo/client/react'; -import { useRef, useState, useMemo } from 'react'; +import { useEffect, useRef, useState, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { BOARD_PAGE_QUERY, CYCLES_QUERY, CYCLE_CREATE_MUTATION, CYCLE_UPDATE_MUTATION, CYCLE_DELETE_MUTATION } from '../board/queries'; @@ -56,8 +56,24 @@ function isCycleCompleted(cycle: CycleSummary): boolean { export function CyclesPage() { const navigate = useNavigate(); - const teamKey = readStoredTeamKey(); + const [teamKey, setTeamKey] = useState(() => readStoredTeamKey()); const dialogRef = useRef(null); + + useEffect(() => { + function handleActiveTeamKeyChange(event: Event) { + const nextTeamKey = + event instanceof CustomEvent && (typeof event.detail === 'string' || event.detail === null) + ? (event.detail as string | null) + : readStoredTeamKey(); + setTeamKey(nextTeamKey); + } + + window.addEventListener('involute:active-team-key', handleActiveTeamKeyChange as EventListener); + + return () => { + window.removeEventListener('involute:active-team-key', handleActiveTeamKeyChange as EventListener); + }; + }, []); const [dialogMode, setDialogMode] = useState<'create' | 'edit'>('create'); const [editingCycleId, setEditingCycleId] = useState(null); const [formName, setFormName] = useState('');