diff --git a/src/components/common/Sidebar/Footer.tsx b/src/components/common/Sidebar/Footer.tsx
index 8095ef2..f7cc765 100644
--- a/src/components/common/Sidebar/Footer.tsx
+++ b/src/components/common/Sidebar/Footer.tsx
@@ -2,6 +2,7 @@ import Icon from '@ant-design/icons'
import { COLOR_ERROR } from '@/constants/common.constants'
import { getRedirectUrl } from '@/util/route'
import { getAvatar, getLoginStatus, getNickname, removeToken } from '@/util/auth'
+import { navigateToLogin, navigateToUser } from '@/util/navigation'
import { r_auth_logout } from '@/services/auth'
const Footer = () => {
@@ -15,9 +16,9 @@ const Footer = () => {
const handleClickAvatar = () => {
if (getLoginStatus()) {
- navigate('/user')
+ navigateToUser(navigate)
} else {
- navigate(getRedirectUrl('/login', `${lastMatch.pathname}${location.search}`))
+ navigateToLogin(navigate, undefined, `${lastMatch.pathname}${location.search}`)
}
}
diff --git a/src/pages/Sign/Forget.tsx b/src/pages/Sign/Forget.tsx
index 1cbc871..dafa452 100644
--- a/src/pages/Sign/Forget.tsx
+++ b/src/pages/Sign/Forget.tsx
@@ -8,6 +8,7 @@ import {
PERMISSION_USER_NOT_FOUND,
SYSTEM_INVALID_CAPTCHA_CODE
} from '@/constants/common.constants'
+import { navigateToLogin } from '@/util/navigation'
import { r_auth_forget, r_auth_retrieve } from '@/services/auth'
import FitCenter from '@/components/common/FitCenter'
import FlexBox from '@/components/common/FlexBox'
@@ -272,7 +273,15 @@ const Forget = () => {
diff --git a/src/pages/Sign/SignIn.tsx b/src/pages/Sign/SignIn.tsx
index cef1eba..1812be6 100644
--- a/src/pages/Sign/SignIn.tsx
+++ b/src/pages/Sign/SignIn.tsx
@@ -12,6 +12,12 @@ import {
} from '@/constants/common.constants'
import { getUserInfo, setToken } from '@/util/auth'
import { utcToLocalTime } from '@/util/datetime'
+import {
+ navigateToForget,
+ navigateToRedirect,
+ navigateToRegister,
+ navigateToRoot
+} from '@/util/navigation'
import { r_auth_login } from '@/services/auth'
import { AppContext } from '@/App'
import FitCenter from '@/components/common/FitCenter'
@@ -78,7 +84,7 @@ const SignIn = () => {
setTimeout(() => {
void getUserInfo().then((user) => {
refreshRouter()
- navigate(searchParams.get('redirect') ?? '/repository')
+ navigateToRedirect(navigate, searchParams, '/repository')
notification.success({
message: '欢迎回来',
@@ -255,14 +261,14 @@ const SignIn = () => {
{
- navigate('/')
+ navigateToRoot(navigate)
}}
>
返回主页
{
- navigate(`/forget${location.search}`, { replace: true })
+ navigateToForget(navigate, location.search, { replace: true })
}}
>
忘记密码?
@@ -283,7 +289,7 @@ const SignIn = () => {
还没有账号?
- navigate(`/register${location.search}`, { replace: true })
+ navigateToRegister(navigate, location.search, { replace: true })
}
>
注册
diff --git a/src/pages/Sign/SignUp.tsx b/src/pages/Sign/SignUp.tsx
index b1c8b41..3d997b5 100644
--- a/src/pages/Sign/SignUp.tsx
+++ b/src/pages/Sign/SignUp.tsx
@@ -8,6 +8,7 @@ import {
SYSTEM_MATCH_SENSITIVE_WORD
} from '@/constants/common.constants'
import { getLoginStatus, setToken } from '@/util/auth'
+import { navigateToLogin } from '@/util/navigation'
import { r_auth_register, r_auth_resend } from '@/services/auth'
import FitCenter from '@/components/common/FitCenter'
import FlexBox from '@/components/common/FlexBox'
@@ -49,9 +50,7 @@ const SignUp = () => {
return
}
if (getLoginStatus()) {
- navigate(`/login${location.search}`, {
- replace: true
- })
+ navigateToLogin(navigate, location.search, undefined, { replace: true })
}
}, [location.pathname])
@@ -245,7 +244,9 @@ const SignUp = () => {
已有账号?
- navigate(`/login${location.search}`, { replace: true })
+ navigateToLogin(navigate, location.search, undefined, {
+ replace: true
+ })
}
>
登录
diff --git a/src/pages/Sign/Verify.tsx b/src/pages/Sign/Verify.tsx
index 06280c7..0dd3a73 100644
--- a/src/pages/Sign/Verify.tsx
+++ b/src/pages/Sign/Verify.tsx
@@ -7,7 +7,7 @@ import {
SYSTEM_MATCH_SENSITIVE_WORD
} from '@/constants/common.constants'
import { getLoginStatus, getUserInfo, requestUserInfo } from '@/util/auth'
-import { getRedirectUrl } from '@/util/route'
+import { navigateToLogin, navigateToRedirect, navigateToRepository } from '@/util/navigation'
import { r_auth_resend, r_auth_verify } from '@/services/auth'
import { r_api_avatar_random_base64 } from '@/services/api/avatar'
import { AppContext } from '@/App'
@@ -32,7 +32,7 @@ const Verify = () => {
}
if (!getLoginStatus()) {
- navigate(getRedirectUrl('/login', `${location.pathname}${location.search}`), {
+ navigateToLogin(navigate, undefined, `${location.pathname}${location.search}`, {
replace: true
})
return
@@ -81,7 +81,7 @@ const Verify = () => {
break
case PERMISSION_NO_VERIFICATION_REQUIRED:
void message.warning('账户已验证')
- navigate('/repository')
+ navigateToRepository(navigate)
break
default:
void message.error('出错了,请稍后重试')
@@ -128,7 +128,7 @@ const Verify = () => {
setTimeout(() => {
void requestUserInfo().then(() => {
refreshRouter()
- navigate(searchParams.get('redirect') ?? '/repository')
+ navigateToRedirect(navigate, searchParams, '/repository')
})
}, 1500)
break
diff --git a/src/pages/System/Tools/Code.tsx b/src/pages/System/Tools/Code.tsx
index 49f63f0..8a34820 100644
--- a/src/pages/System/Tools/Code.tsx
+++ b/src/pages/System/Tools/Code.tsx
@@ -3,6 +3,7 @@ import Icon from '@ant-design/icons'
import '@/assets/css/pages/system/tools/code.scss'
import { DATABASE_NO_RECORD_FOUND, DATABASE_SELECT_SUCCESS } from '@/constants/common.constants'
import { checkDesktop } from '@/util/common'
+import { navigateToExecute, navigateToRepository } from '@/util/navigation'
import { r_sys_tool_get_one } from '@/services/system'
import { IFiles } from '@/components/Playground/shared'
import { base64ToFiles } from '@/components/Playground/files'
@@ -27,7 +28,7 @@ const Code = () => {
title: '注意',
content: '运行前请仔细查阅工具代码!',
onOk: () => {
- navigate(`/system/tools/execute/${id}`)
+ navigateToExecute(navigate, id!)
}
})
} else {
@@ -62,7 +63,7 @@ const Code = () => {
case DATABASE_NO_RECORD_FOUND:
void message.error('未找到指定工具')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
default:
diff --git a/src/pages/System/Tools/Execute.tsx b/src/pages/System/Tools/Execute.tsx
index 85a73bc..9e35825 100644
--- a/src/pages/System/Tools/Execute.tsx
+++ b/src/pages/System/Tools/Execute.tsx
@@ -1,5 +1,6 @@
import '@/assets/css/pages/system/tools/execute.scss'
import { DATABASE_NO_RECORD_FOUND, DATABASE_SELECT_SUCCESS } from '@/constants/common.constants'
+import { navigateToTools } from '@/util/navigation'
import { r_sys_tool_get_one } from '@/services/system'
import FitFullscreen from '@/components/common/FitFullscreen'
import Card from '@/components/common/Card'
@@ -51,7 +52,7 @@ const Execute = () => {
case DATABASE_NO_RECORD_FOUND:
void message.error('未找到指定工具')
setTimeout(() => {
- navigate('/system/tools')
+ navigateToTools(navigate)
}, 3000)
break
default:
diff --git a/src/pages/System/Tools/index.tsx b/src/pages/System/Tools/index.tsx
index 467ebab..36690ca 100644
--- a/src/pages/System/Tools/index.tsx
+++ b/src/pages/System/Tools/index.tsx
@@ -17,6 +17,7 @@ import {
DATABASE_UPDATE_SUCCESS,
TOOL_NOT_UNDER_REVIEW
} from '@/constants/common.constants'
+import { navigateToCode } from '@/util/navigation'
import FlexBox from '@/components/common/FlexBox'
import Card from '@/components/common/Card'
import FitFullscreen from '@/components/common/FitFullscreen'
@@ -196,7 +197,7 @@ const Tools = () => {
const handleOnViewBtnClick = (value: ToolVo) => {
return () => {
- navigate(`/system/tools/code/${value.id}`)
+ navigateToCode(navigate, value.id)
}
}
diff --git a/src/pages/Tools/Create.tsx b/src/pages/Tools/Create.tsx
index afb36f9..5085ef9 100644
--- a/src/pages/Tools/Create.tsx
+++ b/src/pages/Tools/Create.tsx
@@ -5,6 +5,7 @@ import {
DATABASE_INSERT_SUCCESS,
DATABASE_SELECT_SUCCESS
} from '@/constants/common.constants'
+import { navigateToEdit } from '@/util/navigation'
import {
r_tool_category_get,
r_tool_create,
@@ -44,9 +45,7 @@ const Create = () => {
void message.success(
`创建工具 ${response.data!.name}<${response.data!.toolId}:${response.data!.platform.slice(0, 1)}${response.data!.platform.slice(1).toLowerCase()}:${response.data!.ver}> 成功`
)
- navigate(
- `/edit/${response.data!.toolId}${response.data!.platform !== import.meta.env.VITE_PLATFORM ? `?platform=${response.data!.platform}` : ''}`
- )
+ navigateToEdit(navigate, response.data!.toolId, response.data!.platform)
break
case DATABASE_DUPLICATE_KEY:
void message.warning('已存在相同 ID 的应用')
diff --git a/src/pages/Tools/Edit.tsx b/src/pages/Tools/Edit.tsx
index bbc478f..85dcc5f 100644
--- a/src/pages/Tools/Edit.tsx
+++ b/src/pages/Tools/Edit.tsx
@@ -8,6 +8,7 @@ import {
TOOL_HAS_BEEN_PUBLISHED,
TOOL_UNDER_REVIEW
} from '@/constants/common.constants'
+import { navigateToRepository } from '@/util/navigation'
import { r_tool_category_get, r_tool_detail, r_tool_update } from '@/services/tool'
import { IFiles, IImportMap, ITsconfig } from '@/components/Playground/shared'
import {
@@ -118,13 +119,13 @@ const Edit = () => {
case TOOL_UNDER_REVIEW:
void message.error('保存失败:工具审核中')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
case TOOL_HAS_BEEN_PUBLISHED:
void message.error('保存失败:工具已发布')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
default:
@@ -184,13 +185,13 @@ const Edit = () => {
case TOOL_UNDER_REVIEW:
void message.error('保存失败:工具审核中')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
case TOOL_HAS_BEEN_PUBLISHED:
void message.error('保存失败:工具已发布')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
default:
@@ -245,20 +246,20 @@ const Edit = () => {
case 'PROCESSING':
void message.warning('工具审核中,请勿修改')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
default:
void message.warning('请先创建新版本后编辑工具')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
}
break
case DATABASE_NO_RECORD_FOUND:
void message.error('未找到指定工具')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
default:
@@ -322,7 +323,7 @@ const Edit = () => {
useEffect(() => {
if (!['WEB', 'DESKTOP', 'ANDROID'].includes(searchParams.get('platform')!)) {
- navigate('/repository')
+ navigateToRepository(navigate)
return
}
getTool()
diff --git a/src/pages/Tools/Source.tsx b/src/pages/Tools/Source.tsx
index d808c86..a229115 100644
--- a/src/pages/Tools/Source.tsx
+++ b/src/pages/Tools/Source.tsx
@@ -1,12 +1,13 @@
import '@/assets/css/pages/tools/source.scss'
import { DATABASE_NO_RECORD_FOUND, DATABASE_SELECT_SUCCESS } from '@/constants/common.constants'
+import { getLoginStatus } from '@/util/auth'
+import { navigateToRepository, navigateToSource } from '@/util/navigation'
import { r_tool_detail } from '@/services/tool'
import { IFiles } from '@/components/Playground/shared'
import { base64ToFiles } from '@/components/Playground/files'
import Playground from '@/components/Playground'
import FitFullscreen from '@/components/common/FitFullscreen'
import Card from '@/components/common/Card'
-import { getLoginStatus } from '@/util/auth'
const Source = () => {
const navigate = useNavigate()
@@ -49,7 +50,7 @@ const Source = () => {
case DATABASE_NO_RECORD_FOUND:
void message.error('未找到指定工具')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
default:
@@ -63,22 +64,23 @@ const Source = () => {
}
useEffect(() => {
+ const platform = searchParams.get('platform')!
+ if (!['WEB', 'DESKTOP', 'ANDROID'].includes(platform)) {
+ navigateToRepository(navigate)
+ return
+ }
if (username === '!' && !getLoginStatus()) {
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
return
}
if (username !== '!' && ver) {
- navigate(`/source/${username}/${toolId}`)
+ navigateToSource(navigate, username!, toolId!, platform as Platform)
return
}
if (username === '!' && !ver) {
- navigate(`/source/!/${toolId}/latest`)
- return
- }
- if (!['WEB', 'DESKTOP', 'ANDROID'].includes(searchParams.get('platform')!)) {
- navigate('/repository')
+ navigateToSource(navigate, '!', toolId!, platform as Platform, 'latest')
return
}
getTool()
diff --git a/src/pages/Tools/Store.tsx b/src/pages/Tools/Store.tsx
index f3837d0..43651e9 100644
--- a/src/pages/Tools/Store.tsx
+++ b/src/pages/Tools/Store.tsx
@@ -5,6 +5,7 @@ import Icon from '@ant-design/icons'
import '@/assets/css/pages/tools/store.scss'
import { COLOR_BACKGROUND, COLOR_MAIN, DATABASE_SELECT_SUCCESS } from '@/constants/common.constants'
import { checkDesktop } from '@/util/common'
+import { navigateToSource, navigateToStore, navigateToView } from '@/util/navigation'
import { r_tool_store_get } from '@/services/tool'
import Card from '@/components/common/Card'
import FlexBox from '@/components/common/FlexBox'
@@ -80,21 +81,17 @@ const CommonCard = ({
})
return
}
- navigate(
- `/view/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToView(navigate, authorUsername, toolId, platform)
}
const handleOnClickAuthor = (e: MouseEvent) => {
e.stopPropagation()
- navigate(authorUsername)
+ navigateToStore(navigate, authorUsername)
}
const handleOnSourceBtnClick = (e: MouseEvent) => {
e.stopPropagation()
- navigate(
- `/source/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToSource(navigate, authorUsername, toolId, platform)
}
const handleOnAndroidBtnClick = (e: MouseEvent) => {
@@ -137,16 +134,12 @@ const CommonCard = ({
)
return
}
- navigate(
- `/view/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToView(navigate, authorUsername, toolId, platform)
}
const handleOnWebBtnClick = (e: MouseEvent) => {
e.stopPropagation()
- navigate(
- `/view/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToView(navigate, authorUsername, toolId, platform)
}
return (
diff --git a/src/pages/Tools/User.tsx b/src/pages/Tools/User.tsx
index 2d1c9e5..bfe2fd7 100644
--- a/src/pages/Tools/User.tsx
+++ b/src/pages/Tools/User.tsx
@@ -10,6 +10,7 @@ import {
DATABASE_SELECT_SUCCESS
} from '@/constants/common.constants'
import { checkDesktop } from '@/util/common'
+import { navigateToRoot, navigateToSource, navigateToView } from '@/util/navigation'
import { r_sys_user_info_get_basic } from '@/services/system'
import { r_tool_store_get_by_username } from '@/services/tool'
import FitFullscreen from '@/components/common/FitFullscreen'
@@ -82,16 +83,12 @@ const CommonCard = ({
})
return
}
- navigate(
- `/view/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToView(navigate, authorUsername, toolId, platform)
}
const handleOnSourceBtnClick = (e: MouseEvent) => {
e.stopPropagation()
- navigate(
- `/source/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToSource(navigate, authorUsername, toolId, platform)
}
const handleOnAndroidBtnClick = (e: MouseEvent) => {
@@ -134,16 +131,12 @@ const CommonCard = ({
)
return
}
- navigate(
- `/view/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToView(navigate, authorUsername, toolId, platform)
}
const handleOnWebBtnClick = (e: MouseEvent) => {
e.stopPropagation()
- navigate(
- `/view/${authorUsername}/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`
- )
+ navigateToView(navigate, authorUsername, toolId, platform)
}
return (
@@ -269,7 +262,7 @@ const User = () => {
case DATABASE_NO_RECORD_FOUND:
void message.warning('用户不存在')
setTimeout(() => {
- navigate('/')
+ navigateToRoot(navigate)
}, 3000)
break
default:
diff --git a/src/pages/Tools/View.tsx b/src/pages/Tools/View.tsx
index 9b60593..d61e981 100644
--- a/src/pages/Tools/View.tsx
+++ b/src/pages/Tools/View.tsx
@@ -1,6 +1,7 @@
import '@/assets/css/pages/tools/view.scss'
import { DATABASE_NO_RECORD_FOUND, DATABASE_SELECT_SUCCESS } from '@/constants/common.constants'
import { getLoginStatus } from '@/util/auth'
+import { navigateToRepository, navigateToRoot, navigateToView } from '@/util/navigation'
import { r_tool_detail } from '@/services/tool'
import compiler from '@/components/Playground/compiler'
import { IImportMap } from '@/components/Playground/shared'
@@ -72,7 +73,7 @@ const View = () => {
case DATABASE_NO_RECORD_FOUND:
void message.error('未找到指定工具')
setTimeout(() => {
- navigate('/repository')
+ navigateToRepository(navigate)
}, 3000)
break
default:
@@ -86,22 +87,23 @@ const View = () => {
}
useEffect(() => {
+ const platform = searchParams.get('platform')!
+ if (!['WEB', 'DESKTOP', 'ANDROID'].includes(platform)) {
+ navigateToRepository(navigate)
+ return
+ }
if (username === '!' && !getLoginStatus()) {
setTimeout(() => {
- navigate('/')
+ navigateToRoot(navigate)
}, 3000)
return
}
if (username !== '!' && ver) {
- navigate(`/view/${username}/${toolId}`)
+ navigateToView(navigate, username!, toolId!, platform as Platform)
return
}
if (username === '!' && !ver) {
- navigate(`/view/!/${toolId}/latest`)
- return
- }
- if (!['WEB', 'DESKTOP', 'ANDROID'].includes(searchParams.get('platform')!)) {
- navigate('/repository')
+ navigateToView(navigate, '!', toolId!, platform as Platform)
return
}
getTool()
diff --git a/src/pages/Tools/index.tsx b/src/pages/Tools/index.tsx
index ee81c29..09f9176 100644
--- a/src/pages/Tools/index.tsx
+++ b/src/pages/Tools/index.tsx
@@ -16,6 +16,7 @@ import {
} from '@/constants/common.constants'
import { checkDesktop } from '@/util/common'
import { getLoginStatus } from '@/util/auth'
+import { navigateToEdit, navigateToSource, navigateToView } from '@/util/navigation'
import {
r_tool_cancel,
r_tool_delete,
@@ -145,8 +146,12 @@ const ToolCard = ({ tools, onDelete, onUpgrade, onSubmit, onCancel }: ToolCardPr
const handleOnOpenTool = () => {
if (checkDesktop() || selectedTool.platform !== 'DESKTOP') {
- navigate(
- `/view/!/${selectedTool.toolId}/${selectedTool.ver}${selectedTool.platform !== import.meta.env.VITE_PLATFORM ? `?platform=${selectedTool.platform}` : ''}`
+ navigateToView(
+ navigate,
+ '!',
+ selectedTool.toolId,
+ selectedTool.platform,
+ selectedTool.ver
)
} else {
void message.warning('此应用需要桌面端环境,请在桌面端打开')
@@ -157,9 +162,7 @@ const ToolCard = ({ tools, onDelete, onUpgrade, onSubmit, onCancel }: ToolCardPr
if (['NONE', 'REJECT'].includes(selectedTool.review)) {
return () => {
if (checkDesktop() || selectedTool.platform !== 'DESKTOP') {
- navigate(
- `/edit/${selectedTool.toolId}${selectedTool.platform !== import.meta.env.VITE_PLATFORM ? `?platform=${selectedTool.platform}` : ''}`
- )
+ navigateToEdit(navigate, selectedTool.toolId, selectedTool.platform)
} else {
void message.warning('此应用需要桌面端环境,请在桌面端编辑')
}
@@ -171,8 +174,12 @@ const ToolCard = ({ tools, onDelete, onUpgrade, onSubmit, onCancel }: ToolCardPr
const handleOnSourceTool = () => {
if (selectedTool.review === 'PASS') {
return () => {
- navigate(
- `/source/!/${selectedTool.toolId}/${selectedTool.ver}${selectedTool.platform !== import.meta.env.VITE_PLATFORM ? `?platform=${selectedTool.platform}` : ''}`
+ navigateToSource(
+ navigate,
+ '!',
+ selectedTool.toolId,
+ selectedTool.platform,
+ selectedTool.ver
)
}
}
@@ -406,8 +413,10 @@ const Tools = () => {
checkDesktop() ||
response.data!.platform !== 'DESKTOP'
) {
- navigate(
- `/edit/${response.data!.toolId}${response.data!.platform !== import.meta.env.VITE_PLATFORM ? `?platform=${response.data!.platform}` : ''}`
+ navigateToEdit(
+ navigate,
+ response.data!.toolId,
+ response.data!.platform
)
}
resolve()
diff --git a/src/util/navigation.tsx b/src/util/navigation.tsx
new file mode 100644
index 0000000..088d636
--- /dev/null
+++ b/src/util/navigation.tsx
@@ -0,0 +1,119 @@
+import { NavigateFunction, NavigateOptions } from 'react-router'
+import { getRedirectUrl } from '@/util/route'
+
+export const navigateToRoot = (navigate: NavigateFunction, options?: NavigateOptions) => {
+ navigate('/', options)
+}
+
+export const navigateToStore = (
+ navigate: NavigateFunction,
+ username?: string,
+ options?: NavigateOptions
+) => {
+ navigate(`/store${username ? `/${username}` : ''}`, options)
+}
+
+export const navigateToRepository = (navigate: NavigateFunction, options?: NavigateOptions) => {
+ navigate('/repository', options)
+}
+
+export const navigateToLogin = (
+ navigate: NavigateFunction,
+ locationSearch?: string,
+ redirectUrl?: string,
+ options?: NavigateOptions
+) => {
+ navigate(
+ redirectUrl ? getRedirectUrl('/login', redirectUrl) : `/login${locationSearch}`,
+ options
+ )
+}
+
+export const navigateToView = (
+ navigate: NavigateFunction,
+ username: string,
+ toolId: string,
+ platform: Platform,
+ version?: string,
+ options?: NavigateOptions
+) => {
+ navigate(
+ `/view/${username}/${toolId}${version ? `/${version}` : ''}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`,
+ options
+ )
+}
+
+export const navigateToSource = (
+ navigate: NavigateFunction,
+ username: string,
+ toolId: string,
+ platform: Platform,
+ version?: string,
+ options?: NavigateOptions
+) => {
+ navigate(
+ `/source/${username}/${toolId}${version ? `/${version}` : ''}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`,
+ options
+ )
+}
+
+export const navigateToRedirect = (
+ navigate: NavigateFunction,
+ searchParams: URLSearchParams,
+ defaultUrl: '/repository' | '/',
+ options?: NavigateOptions
+) => {
+ navigate(searchParams.get('redirect') ?? defaultUrl, options)
+}
+
+export const navigateToForget = (
+ navigate: NavigateFunction,
+ locationSearch: string,
+ options?: NavigateOptions
+) => {
+ navigate(`/forget/${locationSearch}`, options)
+}
+
+export const navigateToRegister = (
+ navigate: NavigateFunction,
+ locationSearch: string,
+ options?: NavigateOptions
+) => {
+ navigate(`/register/${locationSearch}`, options)
+}
+
+export const navigateToExecute = (
+ navigate: NavigateFunction,
+ toolId: string,
+ options?: NavigateOptions
+) => {
+ navigate(`/system/tools/execute/${toolId}`, options)
+}
+
+export const navigateToCode = (
+ navigate: NavigateFunction,
+ toolId: string,
+ options?: NavigateOptions
+) => {
+ navigate(`/system/tools/code/${toolId}`, options)
+}
+
+export const navigateToEdit = (
+ navigate: NavigateFunction,
+ toolId: string,
+ platform: Platform,
+ options?: NavigateOptions
+) => {
+ navigate(
+ `/edit/${toolId}${platform !== import.meta.env.VITE_PLATFORM ? `?platform=${platform}` : ''}`,
+ options
+ )
+}
+
+export const navigateToUser = (navigate: NavigateFunction, options?: NavigateOptions) => {
+ navigate('/user', options)
+}
+
+export const navigateToTools = (navigate: NavigateFunction, options?: NavigateOptions) => {
+ navigate('/system/tools', options)
+}