Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add session storage to DevTools #1920

Draft
wants to merge 2 commits into
base: v1.x-2022-07
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 9 additions & 1 deletion packages/hydrogen/src/foundation/DevTools/DevTools.server.tsx
@@ -1,4 +1,5 @@
import React from 'react';
import {useSession} from '../useSession/useSession.js';
import {DevTools as DevToolsClient} from './DevTools.client.js';
import {useServerRequest} from '../ServerRequestProvider/index.js';
import {getLocale} from '../../utilities/locale/index.js';
Expand All @@ -17,6 +18,13 @@ export function DevTools() {
storeDomain,
storefrontApiVersion,
};
const session = useSession();

return <DevToolsClient dataFromServer={{settings}} />;
const data = {
settings,
storage: {
session,
},
};
return <DevToolsClient dataFromServer={data} />;
}
13 changes: 10 additions & 3 deletions packages/hydrogen/src/foundation/DevTools/components/Panels.tsx
Expand Up @@ -2,10 +2,12 @@ import React, {ComponentProps, useState, useEffect} from 'react';
import {ClientAnalytics} from '../../Analytics/index.js';
import {Performance} from './Performance.client.js';
import {Settings} from './Settings.client.js';
import {Storage} from './Storage.client.js';

export interface Props {
settings: ComponentProps<typeof Settings>;
performance: ComponentProps<typeof Performance>;
storage: ComponentProps<typeof Storage>;
}

interface BasePanel {
Expand All @@ -25,14 +27,15 @@ type Navigations = Props['performance']['navigations'];
interface Panels {
performance: ComponentPanel;
settings: ComponentPanel;
storage: ComponentPanel;
graphiql: ExternalPanel;
}

const isComponentPanel = (
panel: ComponentPanel | ExternalPanel
): panel is ComponentPanel => (panel as ComponentPanel).component !== undefined;

export function Panels({settings}: Props) {
export function Panels({settings, storage}: Props) {
const [selectedPanel, setSelectedPanel] = useState<number>(0);
const [navigations, setNavigations] = useState<Navigations>([]);
useEffect(() => {
Expand Down Expand Up @@ -64,7 +67,7 @@ export function Panels({settings}: Props) {
);
}, [setNavigations, navigations]);

const panels = getPanels({settings, performance: {navigations}});
const panels = getPanels({settings, storage, performance: {navigations}});
const panelComponents = panels.map((obj, index) =>
isComponentPanel(obj) ? (
<div
Expand Down Expand Up @@ -122,7 +125,7 @@ export function Panels({settings}: Props) {
);
}

function getPanels({settings, performance}: Props) {
function getPanels({settings, storage, performance}: Props) {
const panels: Panels = {
settings: {
content: 'Settings',
Expand All @@ -132,6 +135,10 @@ function getPanels({settings, performance}: Props) {
content: 'Performance',
component: <Performance {...performance} />,
},
storage: {
content: 'Storage',
component: <Storage {...storage} />,
},
graphiql: {
content: 'GraphiQL',
url: '/___graphql',
Expand Down
Expand Up @@ -17,7 +17,7 @@ const KEY_MAP = {
export function Settings(props: Props) {
const items = Object.entries(props).map(([key, value]) => {
return {
key: KEY_MAP[key as keyof typeof KEY_MAP],
id: KEY_MAP[key as keyof typeof KEY_MAP],
value,
type: typeof value,
};
Expand Down
@@ -0,0 +1,22 @@
import React from 'react';
import {Table} from './Table.js';

interface Props {
session: any;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're not able to get a concrete type for this, then this should be unknown. We're trying to move away from any as it's not typesafe.

Makes me realize I should go update the eslint / typescript configs for this 🤔

}

const KEY_MAP = {
session: 'Session',
};

export function Storage(props: Props) {
const items = Object.entries(props).map(([key, value]) => {
return {
id: KEY_MAP[key as keyof typeof KEY_MAP],
value,
type: typeof value,
};
});

return <Table items={items} />;
}
31 changes: 24 additions & 7 deletions packages/hydrogen/src/foundation/DevTools/components/Table.tsx
@@ -1,7 +1,7 @@
import React from 'react';

interface Item {
key: string;
id: string;
value: string;
}

Expand All @@ -10,14 +10,31 @@ interface TableProps {
}

export function Table({items}: TableProps) {
const itemsMarkup = items.map(({key, value}) => (
const itemsMarkup = items.map((item) => <Item key={item.id} {...item} />);
return <ul>{itemsMarkup}</ul>;
}

export function Item(props: Item) {
const {id, value} = props;

const valueMarkup =
typeof value === 'string' ? (
<span style={{width: '70%', fontFamily: 'monospace'}}>{value}</span>
) : (
Object.entries(value).map(([k, v]) => (
<span key={k} style={{width: '70%', fontFamily: 'monospace'}}>
<>
<b>{k}</b>: {v}
</>
</span>
))
);
return (
<div
key={key}
style={{display: 'flex', paddingBottom: '1em', flexDirection: 'column'}}
>
<span style={{fontWeight: 'bold'}}>{key}</span>
<span style={{width: '70%', fontFamily: 'monospace'}}>{value}</span>
<span style={{fontWeight: 'bold'}}>{id}</span>
{valueMarkup}
</div>
));
return <ul>{itemsMarkup}</ul>;
);
}