diff --git a/frontend/src/component/personalDashboard/PersonalDashboard.tsx b/frontend/src/component/personalDashboard/PersonalDashboard.tsx
index e1979dfe78..74295e52e7 100644
--- a/frontend/src/component/personalDashboard/PersonalDashboard.tsx
+++ b/frontend/src/component/personalDashboard/PersonalDashboard.tsx
@@ -111,6 +111,158 @@ const AccordionSummarySubtitle = styled(Typography)(({ theme }) => ({
fontWeight: theme.typography.body2.fontWeight,
}));
+const EventTimelinePanel = () => {
+ const { toggleSectionState, expandTimeline } = useDashboardState();
+ const { trackEvent } = usePlausibleTracker();
+
+ const signalsLink = '/integrations/signals';
+ return (
+ toggleSectionState('timeline')}
+ >
+
+ }
+ id='timeline-panel-header'
+ aria-controls='timeline-panel-content'
+ >
+
+
+ Event timeline
+
+
+ Overview of recent activities across all projects in
+ Unleash. Make debugging easier and{' '}
+ {
+ trackEvent('event-timeline', {
+ props: {
+ eventType: 'signals clicked',
+ },
+ });
+ }}
+ >
+ include external signals
+ {' '}
+ to get a fuller overview.
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const FlagPanel = () => {
+ const { personalDashboard, refetch: refetchDashboard } =
+ usePersonalDashboard();
+
+ const projects = personalDashboard?.projects || [];
+
+ const { activeFlag, setActiveFlag, toggleSectionState, expandFlags } =
+ useDashboardState({ flags: personalDashboard?.flags ?? [] });
+
+ return (
+ toggleSectionState('flags')}
+ >
+ }
+ id='flags-panel-header'
+ aria-controls='flags-panel-content'
+ >
+
+
+ My feature flags
+
+
+ Feature flags you have created or favorited
+
+
+
+
+ 0}
+ flagData={
+ personalDashboard?.flags.length
+ ? {
+ state: 'flags' as const,
+ activeFlag,
+ flags: personalDashboard.flags,
+ }
+ : { state: 'no flags' as const }
+ }
+ setActiveFlag={setActiveFlag}
+ refetchDashboard={refetchDashboard}
+ />
+
+
+ );
+};
+
+const ProjectPanel = () => {
+ const { personalDashboard } = usePersonalDashboard();
+
+ const projects = personalDashboard?.projects || [];
+
+ const {
+ activeProject,
+ setActiveProject,
+ toggleSectionState,
+ expandProjects,
+ } = useDashboardState({ projects });
+
+ const personalDashboardProjectDetails =
+ fromPersonalDashboardProjectDetailsOutput(
+ usePersonalDashboardProjectDetails(activeProject),
+ );
+
+ return (
+ toggleSectionState('projects')}
+ >
+
+ }
+ id='projects-panel-header'
+ aria-controls='projects-panel-content'
+ >
+
+ My projects
+
+ Favorite projects, projects you own, and projects you
+ are a member of
+
+
+
+
+
+
+
+ );
+};
+
export const PersonalDashboard = () => {
const { user } = useAuthUser();
const { trackEvent } = usePlausibleTracker();
@@ -122,24 +274,6 @@ export const PersonalDashboard = () => {
usePageTitle(name ? `Dashboard: ${name}` : 'Dashboard');
- const { personalDashboard, refetch: refetchDashboard } =
- usePersonalDashboard();
-
- const projects = personalDashboard?.projects || [];
-
- const {
- activeProject,
- setActiveProject,
- activeFlag,
- setActiveFlag,
- toggleSectionState,
- expandFlags,
- expandProjects,
- expandTimeline,
- } = useDashboardState(projects, personalDashboard?.flags ?? []);
-
- const signalsLink = '/integrations/signals';
-
const [welcomeDialog, setWelcomeDialog] = useLocalStorageState<
'open' | 'closed'
>(
@@ -147,11 +281,6 @@ export const PersonalDashboard = () => {
splash?.personalDashboardKeyConcepts ? 'closed' : 'open',
);
- const personalDashboardProjectDetails =
- fromPersonalDashboardProjectDetailsOutput(
- usePersonalDashboardProjectDetails(activeProject),
- );
-
useEffect(() => {
trackEvent('personal-dashboard', {
props: {
@@ -188,122 +317,12 @@ export const PersonalDashboard = () => {
- {showTimelinePanel && (
- toggleSectionState('timeline')}
- >
-
- }
- id='timeline-panel-header'
- aria-controls='timeline-panel-content'
- >
-
-
- Event timeline
-
-
- Overview of recent activities across all
- projects in Unleash. Make debugging easier and{' '}
- {
- trackEvent('event-timeline', {
- props: {
- eventType: 'signals clicked',
- },
- });
- }}
- >
- include external signals
- {' '}
- to get a fuller overview.
-
-
-
-
-
-
-
-
-
- )}
- toggleSectionState('projects')}
- >
-
- }
- id='projects-panel-header'
- aria-controls='projects-panel-content'
- >
-
-
- My projects
-
-
- Favorite projects, projects you own, and projects
- you are a member of
-
-
-
-
-
-
-
+ {showTimelinePanel && }
+
+
+
+
- toggleSectionState('flags')}
- >
-
- }
- id='flags-panel-header'
- aria-controls='flags-panel-content'
- >
-
-
- My feature flags
-
-
- Feature flags you have created or favorited
-
-
-
-
- 0}
- flagData={
- personalDashboard?.flags.length
- ? {
- state: 'flags' as const,
- activeFlag,
- flags: personalDashboard.flags,
- }
- : { state: 'no flags' as const }
- }
- setActiveFlag={setActiveFlag}
- refetchDashboard={refetchDashboard}
- />
-
-
{
diff --git a/frontend/src/component/personalDashboard/useDashboardState.ts b/frontend/src/component/personalDashboard/useDashboardState.ts
index c9652063e3..7d89cb43d2 100644
--- a/frontend/src/component/personalDashboard/useDashboardState.ts
+++ b/frontend/src/component/personalDashboard/useDashboardState.ts
@@ -5,10 +5,11 @@ import type {
} from 'openapi';
import { useEffect } from 'react';
-export const useDashboardState = (
- projects: PersonalDashboardSchemaProjectsItem[],
- flags: PersonalDashboardSchemaFlagsItem[],
-) => {
+type StateProps = {
+ projects?: PersonalDashboardSchemaProjectsItem[];
+ flags?: PersonalDashboardSchemaFlagsItem[];
+};
+export const useDashboardState = (props?: StateProps) => {
type State = {
activeProject: string | undefined;
activeFlag: PersonalDashboardSchemaFlagsItem | undefined;
@@ -35,34 +36,31 @@ export const useDashboardState = (
useEffect(() => {
const updates: Partial = {};
- const setDefaultFlag =
- flags.length &&
- (!state.activeFlag ||
- !flags.some((flag) => flag.name === state.activeFlag?.name));
- if (setDefaultFlag) {
- updates.activeFlag = flags[0];
+ if (
+ props?.flags?.length &&
+ (!state.activeFlag ||
+ !props.flags.some(
+ (flag) => flag.name === state.activeFlag?.name,
+ ))
+ ) {
+ updates.activeFlag = props.flags[0];
}
- const setDefaultProject =
- projects.length &&
+ if (
+ props?.projects?.length &&
(!state.activeProject ||
- !projects.some(
+ !props.projects.some(
(project) => project.id === state.activeProject,
- ));
-
- if (setDefaultProject) {
- updates.activeProject = projects[0].id;
+ ))
+ ) {
+ updates.activeProject = props.projects[0].id;
}
if (Object.keys(updates).length) {
updateState(updates);
}
- }, [
- JSON.stringify(projects),
- JSON.stringify(flags),
- JSON.stringify(state),
- ]);
+ }, [JSON.stringify(props), JSON.stringify(state)]);
const { activeFlag, activeProject } = state;