feat: add city/state/country to complex, new settings page with sidebar, and Biome linting

- Added city, state, and country optional fields to Complex model
- Updated onboarding to include optional location fields
- Created new settings page with sidebar navigation (Datos del Complejo, Canchas)
- Replaced ESLint with Biome for frontend and backend linting
- Added parallel dev script with concurrently
- Migrated register-routes to use direct app.route() pattern
This commit is contained in:
Jose Selesan
2026-04-10 15:36:15 -03:00
parent 77004b14b0
commit 9ee98a4cb4
129 changed files with 2929 additions and 3186 deletions

View File

@@ -1,5 +1,5 @@
import { Outlet, createFileRoute } from '@tanstack/react-router'
import { Outlet, createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/$complexSlug/booking')({
component: Outlet,
})
});

View File

@@ -1,17 +1,12 @@
import { createFileRoute } from '@tanstack/react-router'
import { PublicBookingConfirmationPage } from '@/features/public-booking/public-booking-confirmation-page'
import { PublicBookingConfirmationPage } from '@/features/public-booking/public-booking-confirmation-page';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/$complexSlug/booking/confirmed/$bookingCode')({
component: PublicBookingConfirmationRouteComponent,
})
});
function PublicBookingConfirmationRouteComponent() {
const { complexSlug, bookingCode } = Route.useParams()
const { complexSlug, bookingCode } = Route.useParams();
return (
<PublicBookingConfirmationPage
complexSlug={complexSlug}
bookingCode={bookingCode}
/>
)
return <PublicBookingConfirmationPage complexSlug={complexSlug} bookingCode={bookingCode} />;
}

View File

@@ -1,12 +1,12 @@
import { createFileRoute } from '@tanstack/react-router'
import { PublicBookingPage } from '@/features/public-booking/public-booking-page'
import { PublicBookingPage } from '@/features/public-booking/public-booking-page';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/$complexSlug/booking/')({
component: PublicBookingIndexRouteComponent,
})
});
function PublicBookingIndexRouteComponent() {
const { complexSlug } = Route.useParams()
const { complexSlug } = Route.useParams();
return <PublicBookingPage complexSlug={complexSlug} />
return <PublicBookingPage complexSlug={complexSlug} />;
}

View File

@@ -1,16 +1,16 @@
import { Outlet, createRootRouteWithContext } from '@tanstack/react-router'
import type { AuthContextValue } from '@/lib/auth'
import type { ApiClient } from '@/lib/api-client'
import { NotFoundPage } from '@/features/not-found/not-found-page'
import { ServerErrorPage } from '@/features/server-error/server-error-page'
import { NotFoundPage } from '@/features/not-found/not-found-page';
import { ServerErrorPage } from '@/features/server-error/server-error-page';
import type { ApiClient } from '@/lib/api-client';
import type { AuthContextValue } from '@/lib/auth';
import { Outlet, createRootRouteWithContext } from '@tanstack/react-router';
type RouterContext = {
auth: AuthContextValue
api: ApiClient
}
auth: AuthContextValue;
api: ApiClient;
};
export const Route = createRootRouteWithContext<RouterContext>()({
component: Outlet,
errorComponent: ServerErrorPage,
notFoundComponent: NotFoundPage,
})
});

View File

@@ -1,11 +1,11 @@
import { createFileRoute } from '@tanstack/react-router'
import { ComplexSettingsPage } from '@/features/complex/complex-settings-page'
import { ComplexSettingsPage } from '@/features/complex/complex-settings-page';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/_app/_authenticated/complex/$slug/edit')({
component: RouteComponent,
})
});
function RouteComponent() {
const { slug } = Route.useParams()
return <ComplexSettingsPage complexSlug={slug} />
const { slug } = Route.useParams();
return <ComplexSettingsPage complexSlug={slug} />;
}

View File

@@ -1,6 +1,6 @@
import { createFileRoute } from '@tanstack/react-router'
import { HomePage } from '@/features/home/home-page'
import { HomePage } from '@/features/home/home-page';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/_app/_authenticated/')({
component: HomePage,
})
});

View File

@@ -1,4 +1,4 @@
import { createFileRoute, redirect } from '@tanstack/react-router'
import { createFileRoute, redirect } from '@tanstack/react-router';
export const Route = createFileRoute('/_app/_authenticated')({
beforeLoad: ({ context, location }) => {
@@ -6,7 +6,7 @@ export const Route = createFileRoute('/_app/_authenticated')({
throw redirect({
to: '/login',
search: { redirect: location.href },
})
});
}
},
})
});

View File

@@ -1,6 +1,6 @@
import { createFileRoute } from '@tanstack/react-router'
import { AboutPage } from '@/features/about/about-page'
import { AboutPage } from '@/features/about/about-page';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/_app/about')({
component: AboutPage,
})
});

View File

@@ -1,6 +1,6 @@
import { createFileRoute } from '@tanstack/react-router'
import { ProfilePage } from '@/features/profile/profile-page'
import { ProfilePage } from '@/features/profile/profile-page';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/_app/profile')({
component: ProfilePage,
})
});

View File

@@ -1,6 +1,6 @@
import { createFileRoute } from '@tanstack/react-router'
import { RootLayout } from '@/features/layout/root-layout'
import { RootLayout } from '@/features/layout/root-layout';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/_app')({
component: RootLayout,
})
});

View File

@@ -1,22 +1,22 @@
import { createFileRoute, redirect } from '@tanstack/react-router'
import { z } from 'zod'
import { LoginPage } from '@/features/login/login-page'
import { LoginPage } from '@/features/login/login-page';
import { createFileRoute, redirect } from '@tanstack/react-router';
import { z } from 'zod';
const loginSearchSchema = z.object({
redirect: z.string().optional(),
})
});
export const Route = createFileRoute('/login')({
validateSearch: loginSearchSchema,
beforeLoad: ({ context }) => {
if (context.auth.isAuthenticated) {
throw redirect({ to: '/' })
throw redirect({ to: '/' });
}
},
component: LoginRouteComponent,
})
});
function LoginRouteComponent() {
const search = Route.useSearch()
return <LoginPage redirectTo={search.redirect} />
const search = Route.useSearch();
return <LoginPage redirectTo={search.redirect} />;
}

View File

@@ -1,6 +1,6 @@
import { createFileRoute } from '@tanstack/react-router'
import { OnboardPage } from '@/features/onboard/onboard-page'
import { OnboardPage } from '@/features/onboard/onboard-page';
import { createFileRoute } from '@tanstack/react-router';
export const Route = createFileRoute('/onboard')({
component: OnboardPage,
})
});