mirror of
https://github.com/supabase/supabase.git
synced 2026-10-08 10:55:06 +03:00
* update test * move back button, fix width issues on sidebar * update sidebar logic * Update ProjectLayout.tsx * lots of updates. layouts now streamlined. localstorage for tabs in use * moar * bunch of new tab logic * fix empty tab issue * Update tabs.ts * layouts switched * new pages now have fixed layouts * fix tabs * fix code bg * add tabs support for multiple project refs * intialization issue * update ID handling * fixed isOpened state for SQL snippets * remove old assistant because its bugging up panels * preview style works in sql editor * fix border * removes preview tab if there is one * fix background of loading skeleton * lots of issues with types/icons/redirect * new tab cards * snippets in empty state now work * moar stuff * tabs now in feature flags * Update tabs.ts * Update tabs.ts * moar * add feature previews * remove code not needed * Update next-env.d.ts * Delete FeaturePreviewModal.tsx * fix typescript errors. remove more explorer stuff * remove explorer files * fixed issues with templates and quickstarts tab * fixed active state when tabs are not opted in * logic error * fix open/highlight issue when opted out of tabs * templates/quickstarts now displayed with new cards * Update recent-items.tsx * Update new-tab.tsx * add icon back in * add old empty state back in * recent items updated to respect project ref * localstorage cleanup on deletion * moar * overflow tabs now working * correct tab names used for new sql templates/quickstarts * ongoing queries fix * cleanup * update images * Update RouteValidationWrapper.tsx * Update AppLayout.tsx * Update NavigationBar.tsx * add headers back into side panels * improve writing * tabs now drag and drop a billion times better * Update tabs.tsx * Update tabs.tsx * init issues on stores, which caused a race condition. * fix hydration error * init * init sidebars * init * Update app-default-navigation.tsx * user dropdown updates * moar layouts * init * moar * moar * updat * reverse top bar * some banners * moar * start adding account page * change styling of dropdowns * Update sidebar.tsx * fix new tab issue in sql * Update ProjectLayout.tsx * Update pnpm-lock.yaml * latest * Update pnpm-lock.yaml * moar layouts on account * getLayout updates * more fixes * force a cache build * moar * Update app-default-navigation.tsx * fix AI button animation * moar layout * account pages refactored * Update user-dropdown.tsx * Update new-tab.tsx * move EditorMenuListSkeleton * Fix type issues * fixes: DESIGN-87 fixes: DESIGN-87 * refactor sort/filter components * Update rules-set-button-text.tsx * remove discussions for now * small styling fixes * Update FeaturePreviewModal.tsx * Update FeaturePreviewModal.tsx * Update RouteValidationWrapper.tsx * revert * revert * revert * revert * revert * more revert * Update collapse-button.tsx * Update SQLEditorTreeViewItem.tsx * revert * Update SchemaGraph.tsx * Delete new-upcoming.tsx * revert * Update ProjectLayout.tsx * fix home link * Update table-editor.spec.ts * test update * Update projects.tsx * remove * Delete sidebar-open-top-banner.tsx * add organizations page * Update table-editor.spec.ts * Fix the playwright tests. * layout fixes * layout fix * revert sort/filter * Update LastSignInWrapper.tsx * revert * revert * remove * update file names * revert * revert * revert * advisor lint page tabs revert * revert * revert * revert * revert * revert * revert tabs * remove packages * add sidebar * sidebar docs added * add sidebar * fixed issues * fix mobile * fixes * add org side bar in * redirect updated * fix more layouts * move settings icon back down * remove old stuff * Delete SideBar.tsx * use ProfileImage component * spelling * Update ThemeSettings.tsx * Update ThemeSettings.tsx * Update Sidebar.tsx * layout udpate * Update Sidebar.tsx * fixes * Minor lints * Update Sidebar.tsx * create a alt user dropdown for self hosting and local * add fragment back in * Adds Theme Selector for local/self hosting * Update UserDropdown.tsx * fix theme selector for local self host * Update index.ts * Update DefaultLayout.tsx * now supports feature preview * remove old files * rename files * revert * Update LayoutHeader.tsx * clean * revert * revert * Update resource-banner.tsx * remove redundant side bar stuff * organizations action bar updated. removed hardcoded value * fix type errors * fix tests * Undo test changes * Fix account pages for when feature preview is off * Bug fixes 1 * Missing key in map of EmailTemplates * Fix missing border in StorageExplorer * fix missing header in performance advisor * Final clean up * Fix DefaultLayout re-rendering issue on auth pages * A couple of fixes * Redirect to /organizations if land on /projects with feature preview on * Route back to /projects if toggling preview off on /organizations * Add HomePageActions to /org/slug * make re-routing nicer * Moar fixes * Fix logging in redirect to /organizations irregardless of feature preview * Fix missing withAuth in OrganizationLayout * Minor clean upo * Fix branch dropdown not aligned * Add feature preview for update layout * update dropdowns to only be chevron triggered in new layout * Update content-query.ts * Update entity-types-infinite-query.ts * add IS_PLATFORM for org dropdown * Add IS_PLATFORM check for EnableBranchingDropdown in LayoutHeader * Midway fixing mobile nav * Mobile nav fixes * Address feedbacks --------- Co-authored-by: Joshen Lim <joshenlimek@gmail.com> Co-authored-by: Alaister Young <a@alaisteryoung.com> Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com> Co-authored-by: Jordi Enric <jordi.err@gmail.com>
131 lines
4.2 KiB
TypeScript
131 lines
4.2 KiB
TypeScript
import { useRouter } from 'next/router'
|
|
import { PropsWithChildren, useEffect } from 'react'
|
|
import { toast } from 'sonner'
|
|
|
|
import { useIsLoggedIn, useParams } from 'common'
|
|
import { useOrganizationsQuery } from 'data/organizations/organizations-query'
|
|
import { useProjectsQuery } from 'data/projects/projects-query'
|
|
import useLatest from 'hooks/misc/useLatest'
|
|
import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage'
|
|
import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
|
|
import { DEFAULT_HOME, IS_PLATFORM, LOCAL_STORAGE_KEYS } from 'lib/constants'
|
|
import { useAppStateSnapshot } from 'state/app-state'
|
|
|
|
// Ideally these could all be within a _middleware when we use Next 12
|
|
const RouteValidationWrapper = ({ children }: PropsWithChildren<{}>) => {
|
|
const router = useRouter()
|
|
const { ref, slug, id } = useParams()
|
|
|
|
const isLoggedIn = useIsLoggedIn()
|
|
const snap = useAppStateSnapshot()
|
|
|
|
const organization = useSelectedOrganization()
|
|
|
|
const [dashboardHistory, _, { isSuccess: isSuccessStorage }] = useLocalStorageQuery(
|
|
LOCAL_STORAGE_KEYS.DASHBOARD_HISTORY(ref ?? ''),
|
|
{ editor: undefined, sql: undefined }
|
|
)
|
|
|
|
const [__, setLastVisitedOrganization] = useLocalStorageQuery(
|
|
LOCAL_STORAGE_KEYS.LAST_VISITED_ORGANIZATION,
|
|
''
|
|
)
|
|
|
|
/**
|
|
* Array of urls/routes that should be ignored
|
|
*/
|
|
const excemptUrls: string[] = [
|
|
// project creation route, allows the page to self determine it's own route, it will redirect to the first org
|
|
// or prompt the user to create an organaization
|
|
// this is used by database.dev, usually as /new/new-project
|
|
'/new/[slug]',
|
|
'/join',
|
|
]
|
|
|
|
/**
|
|
* Map through all the urls that are excluded
|
|
* from route validation check
|
|
*
|
|
* @returns a boolean
|
|
*/
|
|
function isExceptUrl() {
|
|
return excemptUrls.includes(router?.pathname)
|
|
}
|
|
|
|
const { data: organizations, isSuccess: orgsInitialized } = useOrganizationsQuery({
|
|
enabled: isLoggedIn,
|
|
})
|
|
const organizationsRef = useLatest(organizations)
|
|
|
|
useEffect(() => {
|
|
// check if current route is excempted from route validation check
|
|
if (isExceptUrl() || !isLoggedIn) return
|
|
|
|
if (orgsInitialized && slug) {
|
|
// Check validity of organization that user is trying to access
|
|
const organizations = organizationsRef.current ?? []
|
|
const isValidOrg = organizations.some((org) => org.slug === slug)
|
|
|
|
if (!isValidOrg) {
|
|
toast.error('This organization does not exist')
|
|
router.push(DEFAULT_HOME)
|
|
return
|
|
}
|
|
}
|
|
}, [orgsInitialized])
|
|
|
|
const { data: projects, isSuccess: projectsInitialized } = useProjectsQuery({
|
|
enabled: isLoggedIn,
|
|
})
|
|
const projectsRef = useLatest(projects)
|
|
|
|
useEffect(() => {
|
|
// check if current route is excempted from route validation check
|
|
if (isExceptUrl() || !isLoggedIn) return
|
|
|
|
if (projectsInitialized && ref) {
|
|
// Check validity of project that the user is trying to access
|
|
const projects = projectsRef.current ?? []
|
|
const isValidProject = projects.some((project) => project.ref === ref)
|
|
const isValidBranch = IS_PLATFORM
|
|
? projects.some((project) => project.preview_branch_refs.includes(ref))
|
|
: true
|
|
|
|
if (!isValidProject && !isValidBranch) {
|
|
toast.error('This project does not exist')
|
|
router.push(DEFAULT_HOME)
|
|
return
|
|
}
|
|
}
|
|
}, [projectsInitialized])
|
|
|
|
useEffect(() => {
|
|
if (ref !== undefined && id !== undefined) {
|
|
if (router.pathname.endsWith('/sql/[id]') && id !== 'new') {
|
|
snap.setDashboardHistory(ref, 'sql', id)
|
|
}
|
|
if (router.pathname.endsWith('/editor/[id]')) {
|
|
snap.setDashboardHistory(ref, 'editor', id)
|
|
}
|
|
}
|
|
}, [ref, id])
|
|
|
|
useEffect(() => {
|
|
// Load dashboard history into app state
|
|
if (isSuccessStorage && ref) {
|
|
snap.setDashboardHistory(ref, 'editor', dashboardHistory.editor)
|
|
snap.setDashboardHistory(ref, 'sql', dashboardHistory.sql)
|
|
}
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [isSuccessStorage, ref])
|
|
|
|
useEffect(() => {
|
|
if (organization) setLastVisitedOrganization(organization.slug)
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [organization])
|
|
|
|
return <>{children}</>
|
|
}
|
|
|
|
export default RouteValidationWrapper
|