Skip to content

Commit

Permalink
React Router v7 (but still using RouterProvider)
Browse files Browse the repository at this point in the history
* Use "Component" instead of "Element" in route-tree

* Enable react-router v7_partialHydration

* Enable react-router v7_normalizeFormMethod + v7_fetcherPersist + v7_skipActionErrorRevalidation

* Enable react-router v7_relativeSplatPath

* Enable react-router v7_startTransition

* Upgrade to react-router v7

* Remove react-router futures

* Move Views from views/ to routes/

* Consolidate lib/route-tree.ts into routes.ts

* Rename all route files into lowercase

* Regenerate bun.lockb

* Format package.json

* Oopsie
  • Loading branch information
martpie authored Dec 5, 2024
1 parent 2fae940 commit afac247
Show file tree
Hide file tree
Showing 29 changed files with 115 additions and 113 deletions.
Binary file modified bun.lockb
Binary file not shown.
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"react-dom": "^18.3.1",
"react-fontawesome": "^1.7.1",
"react-keybinding-component": "^2.2.0",
"react-router-dom": "6.28.0",
"react-router": "^7.0.2",
"semver": "^7.6.3",
"zustand": "^5.0.1"
},
Expand All @@ -76,5 +76,6 @@
"typescript-plugin-css-modules": "^5.1.0",
"vite": "^6.0.2",
"vite-plugin-svgr": "^4.3.0"
}
},
"trustedDependencies": ["@biomejs/biome", "@parcel/watcher"]
}
2 changes: 1 addition & 1 deletion src/components/Footer.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useCallback } from 'react';
import Icon from 'react-fontawesome';
import { NavLink } from 'react-router-dom';
import { NavLink } from 'react-router';

import useLibraryStore from '../stores/useLibraryStore';
import ProgressBar from './ProgressBar';
Expand Down
2 changes: 1 addition & 1 deletion src/components/GlobalErrorBoundary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*/

import * as logger from '@tauri-apps/plugin-log';
import { isRouteErrorResponse, useRouteError } from 'react-router-dom';
import { isRouteErrorResponse, useRouteError } from 'react-router';
import ExternalLink from '../elements/ExternalLink';
import * as ViewMessage from '../elements/ViewMessage';

Expand Down
2 changes: 1 addition & 1 deletion src/components/IPCNavigationEvents.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { getCurrentWindow } from '@tauri-apps/api/window';
import { useEffect } from 'react';
import { createSearchParams, useNavigate } from 'react-router-dom';
import { createSearchParams, useNavigate } from 'react-router';

import usePlayerStore from '../stores/usePlayerStore';

Expand Down
2 changes: 1 addition & 1 deletion src/components/SideNavLink.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { NavLink } from 'react-router-dom';
import { NavLink } from 'react-router';

import {
Menu,
Expand Down
2 changes: 1 addition & 1 deletion src/components/TracksList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
import type React from 'react';
import { useCallback, useEffect, useRef, useState } from 'react';
import Keybinding from 'react-keybinding-component';
import { useNavigate, useSearchParams } from 'react-router-dom';
import { useNavigate, useSearchParams } from 'react-router';

import type { Config, Playlist, Track } from '../generated/typings';
import { logAndNotifyError } from '../lib/utils';
Expand Down
2 changes: 1 addition & 1 deletion src/elements/SettingsNav.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import cx from 'classnames';
import type React from 'react';
import { NavLink } from 'react-router-dom';
import { NavLink } from 'react-router';

import styles from './SettingsNav.module.css';

Expand Down
2 changes: 1 addition & 1 deletion src/hooks/useInvalidate.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useQueryClient } from '@tanstack/react-query';
import { useCallback } from 'react';
import { useRevalidator } from 'react-router-dom';
import { useRevalidator } from 'react-router';

/**
* Hook returning a function to be manually called after anything that represents
Expand Down
2 changes: 1 addition & 1 deletion src/hooks/useScrollRestoration.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import debounce from 'lodash-es/debounce';
import { useEffect, useState } from 'react';
import { useLocation, useNavigation } from 'react-router-dom';
import { useLocation, useNavigation } from 'react-router';

function getScrollPosition(key: string) {
const pos = window.sessionStorage.getItem(key);
Expand Down
77 changes: 0 additions & 77 deletions src/lib/route-tree.tsx

This file was deleted.

6 changes: 0 additions & 6 deletions src/lib/router.ts

This file was deleted.

4 changes: 2 additions & 2 deletions src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import { QueryClientProvider } from '@tanstack/react-query';
import * as logger from '@tauri-apps/plugin-log';
import React from 'react';
import * as ReactDOM from 'react-dom/client';
import { RouterProvider } from 'react-router-dom';
import { RouterProvider } from 'react-router';

import queryClient from './lib/query-client';
import router from './lib/router';
import router from './routes';

/*
|--------------------------------------------------------------------------
Expand Down
82 changes: 82 additions & 0 deletions src/routes.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { type RouteObject, createHashRouter } from 'react-router';

import GlobalErrorBoundary from './components/GlobalErrorBoundary';
import RootView from './routes/Root';
import ViewLibrary from './routes/library';
import ViewPlaylistDetails from './routes/playlist-details';
import ViewPlaylists from './routes/playlists';
import ViewSettings from './routes/settings';
import ViewSettingsAbout from './routes/settings-about';
import ViewSettingsAudio from './routes/settings-audio';
import ViewSettingsLibrary from './routes/settings-library';
import ViewSettingsUI from './routes/settings-ui';
import ViewTrackDetails from './routes/track-details';

const routeTree: RouteObject[] = [
{
path: '/',
id: 'root',
Component: RootView,
loader: RootView.loader,
HydrateFallback: () => null, // there should be no hydration as we're SPA-only
ErrorBoundary: GlobalErrorBoundary,
children: [
{
path: 'library',
id: 'library',
Component: ViewLibrary,
loader: ViewLibrary.loader,
},
{
path: 'playlists',
id: 'playlists',
Component: ViewPlaylists,
loader: ViewPlaylists.loader,
children: [
{
path: ':playlistID',
id: 'playlist-details',
Component: ViewPlaylistDetails,
loader: ViewPlaylistDetails.loader,
},
],
},
{
path: 'settings',
id: 'settings',
Component: ViewSettings,
children: [
{
path: 'library',
Component: ViewSettingsLibrary,
loader: ViewSettings.loader,
},
{
path: 'interface',
Component: ViewSettingsUI,
loader: ViewSettings.loader,
},
{
path: 'audio',
Component: ViewSettingsAudio,
loader: ViewSettings.loader,
},
{
path: 'about',
Component: ViewSettingsAbout,
loader: ViewSettings.loader,
},
],
},
{
path: 'details/:trackID',
Component: ViewTrackDetails,
loader: ViewTrackDetails.loader,
},
],
},
];

const router = createHashRouter(routeTree);

export default router;
File renamed without changes.
2 changes: 1 addition & 1 deletion src/views/Root.tsx → src/routes/Root.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Suspense, useEffect } from 'react';
import { Outlet } from 'react-router-dom';
import { Outlet } from 'react-router';

import AppEvents from '../components/AppEvents';
import DropzoneImport from '../components/DropzoneImport';
Expand Down
2 changes: 1 addition & 1 deletion src/views/ViewLibrary.tsx → src/routes/library.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query';
import { useMemo } from 'react';
import { Link, useLoaderData } from 'react-router-dom';
import { Link, useLoaderData } from 'react-router';

import TracksList from '../components/TracksList';
import View from '../elements/View';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
redirect,
useLoaderData,
useParams,
} from 'react-router-dom';
} from 'react-router';

import TracksList from '../components/TracksList';
import * as ViewMessage from '../elements/ViewMessage';
Expand Down
2 changes: 1 addition & 1 deletion src/views/ViewPlaylists.tsx → src/routes/playlists.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
useLoaderData,
useNavigate,
useParams,
} from 'react-router-dom';
} from 'react-router';

import SideNav from '../components/SideNav';
import SideNavLink from '../components/SideNavLink';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useLoaderData } from 'react-router-dom';
import { useLoaderData } from 'react-router';

import * as Setting from '../components/Setting';
import CheckboxSetting from '../components/SettingCheckbox';
Expand All @@ -9,7 +9,7 @@ import Flexbox from '../elements/Flexbox';
import Heart from '../elements/Heart';
import useInvalidate, { useInvalidateCallback } from '../hooks/useInvalidate';
import SettingsAPI from '../stores/SettingsAPI';
import type { SettingsLoaderData } from './ViewSettings';
import type { SettingsLoaderData } from './settings';

export default function ViewSettingsAbout() {
const { config, version, tauriVersion, appStorageDir } =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { useLoaderData } from 'react-router-dom';
import { useLoaderData } from 'react-router';

import AudioOutputSelect from '../components/AudioOutputSelect';
import * as Setting from '../components/Setting';
import { usePlayerAPI } from '../stores/usePlayerStore';

import useInvalidate, { useInvalidateCallback } from '../hooks/useInvalidate';
import type { SettingsLoaderData } from './ViewSettings';
import type { SettingsLoaderData } from './settings';

export default function ViewSettingsAudio() {
const { config } = useLoaderData() as SettingsLoaderData;
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useLoaderData } from 'react-router-dom';
import { useLoaderData } from 'react-router';

import * as Setting from '../components/Setting';
import CheckboxSetting from '../components/SettingCheckbox';
Expand All @@ -7,8 +7,9 @@ import Flexbox from '../elements/Flexbox';
import useInvalidate, { useInvalidateCallback } from '../hooks/useInvalidate';
import SettingsAPI from '../stores/SettingsAPI';
import useLibraryStore, { useLibraryAPI } from '../stores/useLibraryStore';
import type { SettingsLoaderData } from './ViewSettings';
import styles from './ViewSettingsLibrary.module.css';
import type { SettingsLoaderData } from './settings';

import styles from './settings-library.module.css';

export default function ViewSettingsLibrary() {
const libraryAPI = useLibraryAPI();
Expand Down
4 changes: 2 additions & 2 deletions src/views/ViewSettingsUI.tsx → src/routes/settings-ui.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { useLoaderData } from 'react-router-dom';
import { useLoaderData } from 'react-router';

import * as Setting from '../components/Setting';
import CheckboxSetting from '../components/SettingCheckbox';
import type { Config, DefaultView } from '../generated/typings';
import useInvalidate, { useInvalidateCallback } from '../hooks/useInvalidate';
import { themes } from '../lib/themes';
import SettingsAPI from '../stores/SettingsAPI';
import type { SettingsLoaderData } from './ViewSettings';
import type { SettingsLoaderData } from './settings';

export default function ViewSettingsUI() {
const { config } = useLoaderData() as SettingsLoaderData;
Expand Down
File renamed without changes.
4 changes: 2 additions & 2 deletions src/views/ViewSettings.tsx → src/routes/settings.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { getTauriVersion, getVersion } from '@tauri-apps/api/app';
import { invoke } from '@tauri-apps/api/core';
import { Navigate, Outlet, useMatch } from 'react-router-dom';
import { Navigate, Outlet, useMatch } from 'react-router';

import * as SettingNav from '../elements/SettingsNav';
import View from '../elements/View';
import config from '../lib/config';
import type { LoaderData } from '../types/museeks';

import styles from './ViewSettings.module.css';
import styles from './settings.module.css';

export default function ViewSettingsView() {
const match = useMatch('/settings');
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
type LoaderFunctionArgs,
useLoaderData,
useNavigate,
} from 'react-router-dom';
} from 'react-router';

import * as Setting from '../components/Setting';
import Button from '../elements/Button';
Expand All @@ -16,7 +16,8 @@ import useInvalidate from '../hooks/useInvalidate';
import database from '../lib/database';
import { useLibraryAPI } from '../stores/useLibraryStore';
import type { LoaderData, TrackMutation } from '../types/museeks';
import styles from './ViewTrackDetails.module.css';

import styles from './track-details.module.css';

// We assume no artist or genre has a comma in its name (fingers crossed)
const DELIMITER = ',';
Expand Down
2 changes: 1 addition & 1 deletion src/types/museeks.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { LoaderFunctionArgs } from 'react-router-dom';
import type { LoaderFunctionArgs } from 'react-router';

import type { Track } from '../generated/typings';

Expand Down

0 comments on commit afac247

Please sign in to comment.