Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 32 additions & 20 deletions pages/tools/hooks/useToolsTransform.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,9 @@ const buildQueryString = (transform: Transform) => {
export default function useToolsTransform(tools: JSONSchemaTool[]) {
const router = useRouter();
const { query } = router;
const [isReady, setIsReady] = useState(false);

const [transform, setTransform] = useState<Transform>({
query: '',
sortBy: 'name',
sortOrder: 'ascending',
groupBy: 'toolingTypes',
languages: [],
licenses: [],
drafts: [],
toolingTypes: [],
environments: [],
showObsolete: 'false',
supportsBowtie: 'false',
});

useEffect(() => {
if (!router.isReady) return;

const getInitialTransform = (): Transform => {
const parseArrayParam = (
param: string | string[] | undefined,
): string[] => {
Expand All @@ -76,7 +61,24 @@ export default function useToolsTransform(tools: JSONSchemaTool[]) {
return [];
};

const updatedTransform = {
// If router is not ready, return empty transform (will be updated)
if (!router.isReady) {
return {
query: '',
sortBy: 'name',
sortOrder: 'ascending',
groupBy: 'none',
languages: [],
licenses: [],
drafts: [],
toolingTypes: [],
environments: [],
showObsolete: 'false',
supportsBowtie: 'false',
};
}

return {
query: (query.query as Transform['query']) || '',
sortBy: (query.sortBy as Transform['sortBy']) || 'name',
sortOrder: (query.sortOrder as Transform['sortOrder']) || 'ascending',
Expand All @@ -92,7 +94,15 @@ export default function useToolsTransform(tools: JSONSchemaTool[]) {
) as Transform['environments'],
showObsolete: query.showObsolete === 'true' ? 'true' : 'false',
supportsBowtie: query.supportsBowtie === 'true' ? 'true' : 'false',
} satisfies Transform;
};
};

const [transform, setTransform] = useState<Transform>(getInitialTransform);

useEffect(() => {
if (!router.isReady) return;

const updatedTransform = getInitialTransform();

const queryString = buildQueryString(updatedTransform);
const hash = window.location.hash;
Expand All @@ -102,7 +112,8 @@ export default function useToolsTransform(tools: JSONSchemaTool[]) {
});

setTransform(updatedTransform);
}, [router.isReady]);
setIsReady(true);
}, [router.isReady, query]);

useEffect(() => {
if (!router.isReady) return;
Expand Down Expand Up @@ -187,6 +198,7 @@ export default function useToolsTransform(tools: JSONSchemaTool[]) {
transform,
setTransform: updateTransform,
resetTransform,
isReady,
};
}

Expand Down
15 changes: 15 additions & 0 deletions pages/tools/index.page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,23 @@ export default function ToolingPage({
transform,
setTransform,
resetTransform,
isReady,
} = useToolsTransform(toolingData);

// Don't render until router is ready to prevent flicker
if (!isReady) {
return (
<SectionContext.Provider value={'tools'}>
<Head>
<title>JSON Schema - Tools</title>
</Head>
<div className='mx-auto w-full max-w-[1400px] min-h-screen flex items-center justify-center'>
<div className='text-slate-600 dark:text-slate-300'>Loading...</div>
</div>
</SectionContext.Provider>
);
}

return (
<SectionContext.Provider value={'tools'}>
<Head>
Expand Down
Loading