mirror of
https://github.com/supabase/supabase.git
synced 2026-10-16 14:49:10 +03:00
* init * Update inner-side-menu.mdx * chore: update SQL sidebar to use ui pattern components * mor * Update * Update index.tsx * init: merge table editor and sql editor and schema visualization together * more * move to valtio * fix issue with Command+B shortcut * now shows in treeviews if item is opened in tab * Update ProjectLayout.tsx * fix sidebar * fix schema selector for non explorer version * show schema name in tabs * added schema names to tabs * tabs have been updated to support preview tabs * fix URL issue * add empty state stuff * Update SQLEditorNav.tsx * preview tab works now * more tabs stuff. 'new' tab also added * new tab concept * updates * fix type errors * remove unused files * 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 * fix new tab issue in sql * Update ProjectLayout.tsx * Update pnpm-lock.yaml * 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 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 * Fix TreeView console error props * Add guards in SQL Editor to ensure that feature preview tabs changes do not affect existing UI when flag is off * Fix missing DefaultLayout in SQL editor templates + fix New tab * Remove console log * Remove DatabaseSelector for SQL editor on local * Fix SQL editor shared favorites for local * Fix test * Ensure NewTab doesn't show up if flag is not toggled for SQL editor * Decouple UI state changes from content-query and entity-types-infinite-query * Fix tab closing unnecessary rerouting * Beef up feature previews * Fix create new table from table editor new tab * Fix tabs getting incorrectly reset when going between table and SQL editors * Fix last visited SQL snippet for both tabs and not tabs * Fix last visited table for table editor tabs * Clear dashboard history when closing last tab * Fix loading dashboard history * Add comment to refactor stores * Ensure we only save up to 8 items for recent items for each type * Remove unneccesary logic in tabs * Smol style fix for DeleteAccountButton * Smol fix * Fix inability to close New tab --------- 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>
117 lines
3.7 KiB
TypeScript
117 lines
3.7 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 { 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 [dashboardHistory, _, { isSuccess: isSuccessStorage }] = useLocalStorageQuery(
|
|
LOCAL_STORAGE_KEYS.DASHBOARD_HISTORY(ref ?? ''),
|
|
{ editor: undefined, sql: undefined }
|
|
)
|
|
|
|
/**
|
|
* 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)
|
|
}
|
|
}, [isSuccessStorage, ref])
|
|
|
|
return <>{children}</>
|
|
}
|
|
|
|
export default RouteValidationWrapper
|