Compare commits
21 Commits
jtran/plus
...
nadro/adho
Author | SHA1 | Date | |
---|---|---|---|
e7559c19e4 | |||
b97bcdefa8 | |||
3929f2e9fb | |||
bab98ab5c9 | |||
8dc1b156ff | |||
693fd8eb31 | |||
14a72344e2 | |||
e5d1cd847d | |||
01d294a8bb | |||
aa460d631d | |||
23e609443b | |||
d3aa09a20b | |||
eba91e85ea | |||
74f6e338f7 | |||
529c619fb5 | |||
195000b50c | |||
7993b5f4e8 | |||
fb8acbefe7 | |||
8f2a2391d1 | |||
e2247669f0 | |||
1b75020686 |
@ -7,7 +7,6 @@ VITE_KC_API_WS_MODELING_URL=wss://api.dev.zoo.dev/ws/modeling/commands
|
||||
VITE_KC_API_BASE_URL=https://api.dev.zoo.dev
|
||||
VITE_KC_SITE_BASE_URL=https://dev.zoo.dev
|
||||
VITE_KC_SITE_APP_URL=https://app.dev.zoo.dev
|
||||
VITE_KC_SKIP_AUTH=false
|
||||
VITE_KC_CONNECTION_TIMEOUT_MS=5000
|
||||
#VITE_WASM_URL="optional way of overriding the wasm url, particular for unit tests which need this if you running not on the default 3000 port"
|
||||
#VITE_KC_DEV_TOKEN="optional token to skip auth in the app"
|
||||
|
@ -3,5 +3,4 @@ VITE_KC_API_WS_MODELING_URL=wss://api.zoo.dev/ws/modeling/commands
|
||||
VITE_KC_API_BASE_URL=https://api.zoo.dev
|
||||
VITE_KC_SITE_BASE_URL=https://zoo.dev
|
||||
VITE_KC_SITE_APP_URL=https://app.zoo.dev
|
||||
VITE_KC_SKIP_AUTH=false
|
||||
VITE_KC_CONNECTION_TIMEOUT_MS=15000
|
||||
|
1
interface.d.ts
vendored
1
interface.d.ts
vendored
@ -79,7 +79,6 @@ export interface IElectronAPI {
|
||||
VITE_KC_API_BASE_URL: string
|
||||
VITE_KC_SITE_BASE_URL: string
|
||||
VITE_KC_SITE_APP_URL: string
|
||||
VITE_KC_SKIP_AUTH: string
|
||||
VITE_KC_CONNECTION_TIMEOUT_MS: string
|
||||
VITE_KC_DEV_TOKEN: string
|
||||
NODE_ENV: string
|
||||
|
@ -4,6 +4,8 @@
|
||||
|
||||
URL STATUS
|
||||
000 https://${BASE_URL}
|
||||
405 https://api.dev.zoo.dev/oauth2/token/revoke
|
||||
401 https://api.dev.zoo.dev/users
|
||||
301 https://discord.gg/JQEpHR7Nt2
|
||||
404 https://github.com/KittyCAD/engine/issues/3528
|
||||
404 https://github.com/KittyCAD/modeling-app/commit/${ref}
|
||||
|
@ -53,7 +53,6 @@ import {
|
||||
WASM_INIT_FAILED_TOAST_ID,
|
||||
} from '@src/lib/constants'
|
||||
import { isPlaywright } from '@src/lib/isPlaywright'
|
||||
import { VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { useNetworkHealthStatus } from '@src/components/NetworkHealthIndicator'
|
||||
import { useNetworkMachineStatus } from '@src/components/NetworkMachineIndicator'
|
||||
import {
|
||||
@ -65,6 +64,7 @@ import { useModelingContext } from '@src/hooks/useModelingContext'
|
||||
import { xStateValueToString } from '@src/lib/xStateValueToString'
|
||||
import { getSelectionTypeDisplayText } from '@src/lib/selections'
|
||||
import type { StatusBarItemType } from '@src/components/StatusBar/statusBarTypes'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
// CYCLIC REF
|
||||
sceneInfra.camControls.engineStreamActor = engineStreamActor
|
||||
@ -189,7 +189,8 @@ export function App() {
|
||||
() =>
|
||||
DownloadAppToast({
|
||||
onAccept: () => {
|
||||
openWindow(`${VITE_KC_SITE_BASE_URL}/${APP_DOWNLOAD_PATH}`)
|
||||
const url = withSiteBaseURL(`/${APP_DOWNLOAD_PATH}`)
|
||||
openWindow(url)
|
||||
.then(() => {
|
||||
toast.dismiss(DOWNLOAD_APP_TOAST_ID)
|
||||
})
|
||||
|
@ -5,8 +5,8 @@ import {
|
||||
BillingRemaining,
|
||||
BillingRemainingMode,
|
||||
} from '@src/components/BillingRemaining'
|
||||
|
||||
import { type BillingActor } from '@src/machines/billingMachine'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export const BillingDialog = (props: { billingActor: BillingActor }) => {
|
||||
const billingContext = useSelector(
|
||||
@ -42,7 +42,7 @@ export const BillingDialog = (props: { billingActor: BillingActor }) => {
|
||||
{!hasUnlimited && (
|
||||
<a
|
||||
className="bg-ml-black text-ml-white rounded-lg text-center p-1 cursor-pointer"
|
||||
href="https://zoo.dev/design-studio-pricing"
|
||||
href={withSiteBaseURL('/design-studio-pricing')}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
data-testid="billing-upgrade-button"
|
||||
|
@ -15,6 +15,7 @@ import {
|
||||
import { onboardingStartPath } from '@src/lib/onboardingPaths'
|
||||
import { reportRejection } from '@src/lib/trap'
|
||||
import { isDesktop } from '@src/lib/isDesktop'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
const HelpMenuDivider = () => (
|
||||
<div className="h-[1px] bg-chalkboard-110 dark:bg-chalkboard-80" />
|
||||
@ -89,7 +90,7 @@ export function HelpMenu() {
|
||||
<HelpMenuDivider />
|
||||
<HelpMenuItem
|
||||
as="a"
|
||||
href="https://zoo.dev/docs/kcl-samples"
|
||||
href={withSiteBaseURL('/docs/kcl-samples')}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
@ -97,7 +98,7 @@ export function HelpMenu() {
|
||||
</HelpMenuItem>
|
||||
<HelpMenuItem
|
||||
as="a"
|
||||
href="https://zoo.dev/docs/kcl-lang"
|
||||
href={withSiteBaseURL('/docs/kcl-lang')}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
|
@ -7,7 +7,7 @@ import {
|
||||
LanguageServerClient,
|
||||
LspWorkerEventType,
|
||||
} from '@kittycad/codemirror-lsp-client'
|
||||
import { TEST, VITE_KC_API_BASE_URL } from '@src/env'
|
||||
import { TEST } from '@src/env'
|
||||
import React, { createContext, useContext, useMemo, useState } from 'react'
|
||||
import { useNavigate } from 'react-router-dom'
|
||||
import type * as LSP from 'vscode-languageserver-protocol'
|
||||
@ -28,6 +28,7 @@ import type { FileEntry } from '@src/lib/project'
|
||||
import { codeManager } from '@src/lib/singletons'
|
||||
import { err } from '@src/lib/trap'
|
||||
import { useToken } from '@src/lib/singletons'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
function getWorkspaceFolders(): LSP.WorkspaceFolder[] {
|
||||
return []
|
||||
@ -85,7 +86,7 @@ export const LspProvider = ({ children }: { children: React.ReactNode }) => {
|
||||
const initEvent: KclWorkerOptions = {
|
||||
wasmUrl: wasmUrl(),
|
||||
token: token,
|
||||
apiBaseUrl: VITE_KC_API_BASE_URL,
|
||||
apiBaseUrl: withAPIBaseURL(''),
|
||||
}
|
||||
lspWorker.postMessage({
|
||||
worker: LspWorker.Kcl,
|
||||
@ -178,7 +179,7 @@ export const LspProvider = ({ children }: { children: React.ReactNode }) => {
|
||||
const initEvent: CopilotWorkerOptions = {
|
||||
wasmUrl: wasmUrl(),
|
||||
token: token,
|
||||
apiBaseUrl: VITE_KC_API_BASE_URL,
|
||||
apiBaseUrl: withAPIBaseURL(''),
|
||||
}
|
||||
lspWorker.postMessage({
|
||||
worker: LspWorker.Copilot,
|
||||
|
@ -12,6 +12,7 @@ import { reportRejection } from '@src/lib/trap'
|
||||
import { commandBarActor, settingsActor } from '@src/lib/singletons'
|
||||
|
||||
import styles from './KclEditorMenu.module.css'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export const KclEditorMenu = ({ children }: PropsWithChildren) => {
|
||||
const { enable: convertToVarEnabled, handleClick: handleConvertToVarClick } =
|
||||
@ -67,7 +68,7 @@ export const KclEditorMenu = ({ children }: PropsWithChildren) => {
|
||||
<Menu.Item>
|
||||
<a
|
||||
className={styles.button}
|
||||
href="https://zoo.dev/docs/kcl-lang"
|
||||
href={withSiteBaseURL('/docs/kcl-lang')}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
onClick={openExternalBrowserIfDesktop()}
|
||||
@ -108,7 +109,7 @@ export const KclEditorMenu = ({ children }: PropsWithChildren) => {
|
||||
<Menu.Item>
|
||||
<a
|
||||
className={styles.button}
|
||||
href="https://zoo.dev/docs/kcl-samples"
|
||||
href={withSiteBaseURL('/docs/kcl-samples')}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
onClick={openExternalBrowserIfDesktop()}
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { Transition } from '@headlessui/react'
|
||||
import { VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { useSearchParams } from 'react-router-dom'
|
||||
import { base64ToString } from '@src/lib/base64'
|
||||
|
||||
@ -16,6 +15,7 @@ import { platform } from '@src/lib/utils'
|
||||
import { codeManager } from '@src/lib/singletons'
|
||||
import { Logo } from '@src/components/Logo'
|
||||
import { useEffect } from 'react'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
/**
|
||||
* This component is a handler that checks if a certain query parameter
|
||||
@ -98,7 +98,7 @@ export const OpenInDesktopAppHandler = (props: React.PropsWithChildren) => {
|
||||
>
|
||||
<Transition.Child
|
||||
as="div"
|
||||
className={`max-w-3xl py-6 px-10 flex flex-col items-center gap-12
|
||||
className={`max-w-3xl py-6 px-10 flex flex-col items-center gap-12
|
||||
mx-auto border rounded-lg shadow-lg bg-chalkboard-10 dark:bg-chalkboard-100`}
|
||||
enter="ease-out duration-300"
|
||||
enterFrom="opacity-0 scale-95"
|
||||
@ -133,7 +133,7 @@ export const OpenInDesktopAppHandler = (props: React.PropsWithChildren) => {
|
||||
buttonClasses +
|
||||
' text-sm border-transparent justify-center dark:bg-transparent'
|
||||
}
|
||||
to={`${VITE_KC_SITE_BASE_URL}/${APP_DOWNLOAD_PATH}`}
|
||||
to={withSiteBaseURL(`/${APP_DOWNLOAD_PATH}`)}
|
||||
iconEnd={{ icon: 'link', bgClassName: '!bg-transparent' }}
|
||||
>
|
||||
Download desktop app
|
||||
|
@ -12,9 +12,9 @@ import { Popover } from '@headlessui/react'
|
||||
import Tooltip from '@src/components/Tooltip'
|
||||
import { HelpMenu } from '@src/components/HelpMenu'
|
||||
import { isDesktop } from '@src/lib/isDesktop'
|
||||
import { VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { APP_DOWNLOAD_PATH } from '@src/lib/constants'
|
||||
import { desktopAppPitchMessage } from '@src/components/DownloadAppToast'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export const defaultGlobalStatusBarItems = ({
|
||||
location,
|
||||
@ -37,7 +37,7 @@ export const defaultGlobalStatusBarItems = ({
|
||||
id: 'download-desktop-app',
|
||||
element: 'externalLink',
|
||||
label: 'Download the app',
|
||||
href: `${VITE_KC_SITE_BASE_URL}/${APP_DOWNLOAD_PATH}`,
|
||||
href: withSiteBaseURL(`/${APP_DOWNLOAD_PATH}`),
|
||||
icon: 'download',
|
||||
toolTip: {
|
||||
children: desktopAppPitchMessage,
|
||||
|
@ -13,6 +13,7 @@ import { isDesktop } from '@src/lib/isDesktop'
|
||||
import { PATHS } from '@src/lib/paths'
|
||||
import { authActor } from '@src/lib/singletons'
|
||||
import { reportRejection } from '@src/lib/trap'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
type User = Models['User_type']
|
||||
|
||||
@ -62,7 +63,7 @@ const UserSidebarMenu = ({ user }: { user?: User }) => {
|
||||
{
|
||||
id: 'account',
|
||||
Element: 'externalLink',
|
||||
to: 'https://zoo.dev/account',
|
||||
to: withSiteBaseURL('/account'),
|
||||
children: (
|
||||
<>
|
||||
<span className="flex-1">Manage account</span>
|
||||
|
@ -11,7 +11,6 @@ export const VITE_KC_API_WS_MODELING_URL = env.VITE_KC_API_WS_MODELING_URL as
|
||||
export const VITE_KC_API_BASE_URL = env.VITE_KC_API_BASE_URL
|
||||
export const VITE_KC_SITE_BASE_URL = env.VITE_KC_SITE_BASE_URL
|
||||
export const VITE_KC_SITE_APP_URL = env.VITE_KC_SITE_APP_URL
|
||||
export const VITE_KC_SKIP_AUTH = env.VITE_KC_SKIP_AUTH as string | undefined
|
||||
export const VITE_KC_CONNECTION_TIMEOUT_MS =
|
||||
env.VITE_KC_CONNECTION_TIMEOUT_MS as string | undefined
|
||||
export const VITE_KC_DEV_TOKEN = env.VITE_KC_DEV_TOKEN as string | undefined
|
||||
|
@ -1,5 +1,5 @@
|
||||
import type { Models } from '@kittycad/lib'
|
||||
import { VITE_KC_API_WS_MODELING_URL, VITE_KC_DEV_TOKEN } from '@src/env'
|
||||
import { VITE_KC_DEV_TOKEN } from '@src/env'
|
||||
import { jsAppSettings } from '@src/lib/settings/settingsUtils'
|
||||
import { BSON } from 'bson'
|
||||
|
||||
@ -25,6 +25,7 @@ import {
|
||||
} from '@src/lib/theme'
|
||||
import { reportRejection } from '@src/lib/trap'
|
||||
import { binaryToUuid, isArray, uuidv4 } from '@src/lib/utils'
|
||||
import { withWebSocketURL } from '@src/lib/withBaseURL'
|
||||
|
||||
const pingIntervalMs = 1_000
|
||||
|
||||
@ -387,8 +388,9 @@ class EngineConnection extends EventTarget {
|
||||
|
||||
// SHOULD ONLY BE USED FOR VITESTS
|
||||
connectLite(callback: () => void) {
|
||||
const url = `${VITE_KC_API_WS_MODELING_URL}?video_res_width=${256}&video_res_height=${256}`
|
||||
|
||||
const url = withWebSocketURL(
|
||||
`?video_res_width=${256}&video_res_height=${256}`
|
||||
)
|
||||
this.websocket = new WebSocket(url, [])
|
||||
this.websocket.binaryType = 'arraybuffer'
|
||||
|
||||
@ -1531,7 +1533,9 @@ export class EngineCommandManager extends EventTarget {
|
||||
additionalSettings +=
|
||||
'&show_grid=' + (this.settings.showScaleGrid ? 'true' : 'false')
|
||||
const pool = !this.settings.pool ? '' : `&pool=${this.settings.pool}`
|
||||
const url = `${VITE_KC_API_WS_MODELING_URL}?video_res_width=${width}&video_res_height=${height}${additionalSettings}${pool}`
|
||||
const url = withWebSocketURL(
|
||||
`?video_res_width=${width}&video_res_height=${height}${additionalSettings}${pool}`
|
||||
)
|
||||
this.engineConnection = new EngineConnection({
|
||||
engineCommandManager: this,
|
||||
url,
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { VITE_KC_API_BASE_URL } from '@src/env'
|
||||
import { UAParser } from 'ua-parser-js'
|
||||
|
||||
import type { OsInfo } from '@rust/kcl-lib/bindings/OsInfo'
|
||||
@ -11,6 +10,7 @@ import { isDesktop } from '@src/lib/isDesktop'
|
||||
import type RustContext from '@src/lib/rustContext'
|
||||
import screenshot from '@src/lib/screenshot'
|
||||
import { APP_VERSION } from '@src/routes/utils'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
/* eslint-disable suggest-no-throw/suggest-no-throw --
|
||||
* All the throws in CoreDumpManager are intentional and should be caught and handled properly
|
||||
@ -35,7 +35,7 @@ export class CoreDumpManager {
|
||||
codeManager: CodeManager
|
||||
rustContext: RustContext
|
||||
token: string | undefined
|
||||
baseUrl: string = VITE_KC_API_BASE_URL
|
||||
baseUrl: string = withAPIBaseURL('')
|
||||
|
||||
constructor(
|
||||
engineCommandManager: EngineCommandManager,
|
||||
|
@ -26,6 +26,7 @@ import { err } from '@src/lib/trap'
|
||||
import type { DeepPartial } from '@src/lib/types'
|
||||
import { getInVariableCase } from '@src/lib/utils'
|
||||
import { IS_STAGING } from '@src/routes/utils'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export async function renameProjectDirectory(
|
||||
projectPath: string,
|
||||
@ -697,7 +698,9 @@ export const readTokenFile = async () => {
|
||||
export const writeTokenFile = async (token: string) => {
|
||||
const tokenFilePath = await getTokenFilePath()
|
||||
if (err(token)) return Promise.reject(token)
|
||||
return window.electron.writeFile(tokenFilePath, token)
|
||||
const result = window.electron.writeFile(tokenFilePath, token)
|
||||
console.log('token written to disk')
|
||||
return result
|
||||
}
|
||||
|
||||
export const writeTelemetryFile = async (content: string) => {
|
||||
@ -722,12 +725,9 @@ export const setState = async (state: Project | undefined): Promise<void> => {
|
||||
appStateStore = state
|
||||
}
|
||||
|
||||
export const getUser = async (
|
||||
token: string,
|
||||
hostname: string
|
||||
): Promise<Models['User_type']> => {
|
||||
export const getUser = async (token: string): Promise<Models['User_type']> => {
|
||||
try {
|
||||
const user = await fetch(`${hostname}/users/me`, {
|
||||
const user = await fetch(withAPIBaseURL('/users/me'), {
|
||||
headers: new Headers({
|
||||
Authorization: `Bearer ${token}`,
|
||||
}),
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { VITE_KC_API_BASE_URL, VITE_KC_SITE_APP_URL } from '@src/env'
|
||||
import { VITE_KC_SITE_APP_URL } from '@src/env'
|
||||
import toast from 'react-hot-toast'
|
||||
|
||||
import { stringToBase64 } from '@src/lib/base64'
|
||||
@ -7,6 +7,7 @@ import {
|
||||
CREATE_FILE_URL_PARAM,
|
||||
} from '@src/lib/constants'
|
||||
import { err } from '@src/lib/trap'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export interface FileLinkParams {
|
||||
code: string
|
||||
@ -96,7 +97,7 @@ export async function createShortlink(
|
||||
if (password) {
|
||||
body.password = password
|
||||
}
|
||||
const response = await fetch(`${VITE_KC_API_BASE_URL}/user/shortlinks`, {
|
||||
const response = await fetch(withAPIBaseURL('/user/shortlinks'), {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-type': 'application/json',
|
||||
|
@ -1,7 +1,6 @@
|
||||
import type { SelectionRange } from '@codemirror/state'
|
||||
import { EditorSelection, Transaction } from '@codemirror/state'
|
||||
import type { Models } from '@kittycad/lib'
|
||||
import { VITE_KC_API_BASE_URL, VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { diffLines } from 'diff'
|
||||
import toast from 'react-hot-toast'
|
||||
import type { TextToCadMultiFileIteration_type } from '@kittycad/lib/dist/types/src/models'
|
||||
@ -28,6 +27,7 @@ import { uuidv4 } from '@src/lib/utils'
|
||||
import type { File as KittyCadLibFile } from '@kittycad/lib/dist/types/src/models'
|
||||
import type { FileMeta } from '@src/lib/types'
|
||||
import type { RequestedKCLFile } from '@src/machines/systemIO/utils'
|
||||
import { withAPIBaseURL, withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
type KclFileMetaMap = {
|
||||
[execStateFileNamesIndex: number]: Extract<FileMeta, { type: 'kcl' }>
|
||||
@ -77,7 +77,7 @@ async function submitTextToCadRequest(
|
||||
})
|
||||
|
||||
const response = await fetch(
|
||||
`${VITE_KC_API_BASE_URL}/ml/text-to-cad/multi-file/iteration`,
|
||||
withAPIBaseURL('/ml/text-to-cad/multi-file/iteration'),
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
@ -304,7 +304,7 @@ export async function getPromptToEditResult(
|
||||
id: string,
|
||||
token?: string
|
||||
): Promise<Models['TextToCadMultiFileIteration_type'] | Error> {
|
||||
const url = VITE_KC_API_BASE_URL + '/async/operations/' + id
|
||||
const url = withAPIBaseURL(`/async/operations/${id}`)
|
||||
const data: Models['TextToCadMultiFileIteration_type'] | Error =
|
||||
await crossPlatformFetch(
|
||||
url,
|
||||
@ -340,7 +340,7 @@ export async function doPromptEdit({
|
||||
;(window as any).process = {
|
||||
env: {
|
||||
ZOO_API_TOKEN: token,
|
||||
ZOO_HOST: VITE_KC_API_BASE_URL,
|
||||
ZOO_HOST: withAPIBaseURL(''),
|
||||
},
|
||||
}
|
||||
try {
|
||||
@ -438,7 +438,7 @@ export async function promptToEditFlow({
|
||||
return Promise.reject(result)
|
||||
}
|
||||
const oldCodeWebAppOnly = codeManager.code
|
||||
const downloadLink = `${VITE_KC_SITE_BASE_URL}/${APP_DOWNLOAD_PATH}`
|
||||
const downloadLink = withSiteBaseURL(`/${APP_DOWNLOAD_PATH}`)
|
||||
|
||||
if (!isDesktop() && Object.values(result.outputs).length > 1) {
|
||||
const toastId = uuidv4()
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { VITE_KC_API_BASE_URL } from '@src/env'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
import EditorManager from '@src/editor/manager'
|
||||
import { KclManager } from '@src/lang/KclSingleton'
|
||||
@ -171,7 +171,7 @@ const appMachine = setup({
|
||||
systemId: BILLING,
|
||||
input: {
|
||||
...BILLING_CONTEXT_DEFAULTS,
|
||||
urlUserService: VITE_KC_API_BASE_URL,
|
||||
urlUserService: withAPIBaseURL(''),
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
@ -1,5 +1,4 @@
|
||||
import type { Models } from '@kittycad/lib'
|
||||
import { VITE_KC_API_BASE_URL } from '@src/env'
|
||||
import toast from 'react-hot-toast'
|
||||
import type { NavigateFunction } from 'react-router-dom'
|
||||
import {
|
||||
@ -19,6 +18,7 @@ import { err, reportRejection } from '@src/lib/trap'
|
||||
import { toSync } from '@src/lib/utils'
|
||||
import { getAllSubDirectoriesAtProjectRoot } from '@src/machines/systemIO/snapshotContext'
|
||||
import { joinOSPaths } from '@src/lib/paths'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export async function submitTextToCadPrompt(
|
||||
prompt: string,
|
||||
@ -32,7 +32,7 @@ export async function submitTextToCadPrompt(
|
||||
kcl_version: kclManager.kclVersion,
|
||||
}
|
||||
// Glb has a smaller footprint than gltf, should we want to render it.
|
||||
const url = VITE_KC_API_BASE_URL + '/ai/text-to-cad/glb?kcl=true'
|
||||
const url = withAPIBaseURL('/ai/text-to-cad/glb?kcl=true')
|
||||
const data: Models['TextToCad_type'] | Error = await crossPlatformFetch(
|
||||
url,
|
||||
{
|
||||
@ -58,7 +58,7 @@ export async function getTextToCadResult(
|
||||
id: string,
|
||||
token?: string
|
||||
): Promise<Models['TextToCad_type'] | Error> {
|
||||
const url = VITE_KC_API_BASE_URL + '/user/text-to-cad/' + id
|
||||
const url = withAPIBaseURL(`/user/text-to-cad/${id}`)
|
||||
const data: Models['TextToCad_type'] | Error = await crossPlatformFetch(
|
||||
url,
|
||||
{
|
||||
|
@ -1,14 +1,13 @@
|
||||
import type { Models } from '@kittycad/lib/dist/types/src'
|
||||
import { VITE_KC_API_BASE_URL } from '@src/env'
|
||||
import crossPlatformFetch from '@src/lib/crossPlatformFetch'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export async function sendTelemetry(
|
||||
id: string,
|
||||
feedback: Models['MlFeedback_type'],
|
||||
token?: string
|
||||
): Promise<void> {
|
||||
const url =
|
||||
VITE_KC_API_BASE_URL + '/user/text-to-cad/' + id + '?feedback=' + feedback
|
||||
const url = withAPIBaseURL(`/user/text-to-cad/${id}?feedback=${feedback}`)
|
||||
await crossPlatformFetch(
|
||||
url,
|
||||
{
|
||||
|
@ -11,6 +11,7 @@ import {
|
||||
pipeHasCircle,
|
||||
} from '@src/machines/modelingMachine'
|
||||
import { IS_ML_EXPERIMENTAL } from '@src/lib/constants'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
export type ToolbarModeName = 'modeling' | 'sketching'
|
||||
|
||||
@ -105,7 +106,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-sketch-startSketchOn',
|
||||
url: withSiteBaseURL(
|
||||
'/docs/kcl-std/functions/std-sketch-startSketchOn'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -125,7 +128,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-sketch-extrude',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-sketch-extrude'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -145,7 +148,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-sketch-sweep',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-sketch-sweep'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -165,7 +168,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-sketch-loft',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-sketch-loft'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -185,11 +188,11 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-sketch-revolve',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-sketch-revolve'),
|
||||
},
|
||||
{
|
||||
label: 'KCL example',
|
||||
url: 'https://zoo.dev/docs/kcl-samples/ball-bearing',
|
||||
url: withSiteBaseURL('/docs/kcl-samples/ball-bearing'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -209,7 +212,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-solid-fillet',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-solid-fillet'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -234,7 +237,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
},
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-solid-chamfer',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-solid-chamfer'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -253,7 +256,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-solid-shell',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-solid-shell'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -275,7 +278,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-solid-union',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-solid-union'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -293,7 +296,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-solid-subtract',
|
||||
url: withSiteBaseURL(
|
||||
'/docs/kcl-std/functions/std-solid-subtract'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -311,7 +316,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-solid-intersect',
|
||||
url: withSiteBaseURL(
|
||||
'/docs/kcl-std/functions/std-solid-intersect'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -337,7 +344,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-offsetPlane',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-offsetPlane'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -368,7 +375,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-helix',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-helix'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -389,7 +396,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'API docs',
|
||||
url: 'https://zoo.dev/docs/kcl-lang/modules',
|
||||
url: withSiteBaseURL('/docs/kcl-lang/modules'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -410,7 +417,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'API docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-transform-translate',
|
||||
url: withSiteBaseURL(
|
||||
'/docs/kcl-std/functions/std-transform-translate'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -428,7 +437,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'API docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-transform-rotate',
|
||||
url: withSiteBaseURL(
|
||||
'/docs/kcl-std/functions/std-transform-rotate'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -446,7 +457,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'API docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-clone',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-clone'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -482,7 +493,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'API docs',
|
||||
url: 'https://zoo.dev/docs/api/ml/generate-a-cad-model-from-text',
|
||||
url: withSiteBaseURL(
|
||||
'/docs/api/ml/generate-a-cad-model-from-text'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -739,7 +752,7 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-sketch-polygon',
|
||||
url: withSiteBaseURL('/docs/kcl-std/functions/std-sketch-polygon'),
|
||||
},
|
||||
],
|
||||
},
|
||||
@ -755,7 +768,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
||||
links: [
|
||||
{
|
||||
label: 'KCL docs',
|
||||
url: 'https://zoo.dev/docs/kcl-std/functions/std-transform-mirror2d',
|
||||
url: withSiteBaseURL(
|
||||
'/docs/kcl-std/functions/std-transform-mirror2d'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
|
87
src/lib/withBaseURL.test.ts
Normal file
87
src/lib/withBaseURL.test.ts
Normal file
@ -0,0 +1,87 @@
|
||||
import {
|
||||
withAPIBaseURL,
|
||||
withSiteBaseURL,
|
||||
withWebSocketURL,
|
||||
} from '@src/lib/withBaseURL'
|
||||
|
||||
describe('withBaseURL', () => {
|
||||
/**
|
||||
* running in the development environment
|
||||
* the .env.development should load
|
||||
*/
|
||||
describe('withAPIBaseURL', () => {
|
||||
it('should return base url', () => {
|
||||
const expected = 'https://api.dev.zoo.dev'
|
||||
const actual = withAPIBaseURL('')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should return base url with /users', () => {
|
||||
const expected = 'https://api.dev.zoo.dev/users'
|
||||
const actual = withAPIBaseURL('/users')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should return a longer base url with /oauth2/token/revoke', () => {
|
||||
const expected = 'https://api.dev.zoo.dev/oauth2/token/revoke'
|
||||
const actual = withAPIBaseURL('/oauth2/token/revoke')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should ensure base url does not have ending slash', () => {
|
||||
const expected = 'https://api.dev.zoo.dev'
|
||||
const actual = withAPIBaseURL('')
|
||||
expect(actual).toBe(expected)
|
||||
const expectedEndsWith = expected[expected.length - 1]
|
||||
const actualEndsWith = actual[actual.length - 1]
|
||||
expect(actual).toBe(expected)
|
||||
expect(actualEndsWith).toBe(expectedEndsWith)
|
||||
})
|
||||
})
|
||||
|
||||
describe('withSiteBaseURL', () => {
|
||||
it('should return base url', () => {
|
||||
const expected = 'https://dev.zoo.dev'
|
||||
const actual = withSiteBaseURL('')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should return base url with /docs', () => {
|
||||
const expected = 'https://dev.zoo.dev/docs'
|
||||
const actual = withSiteBaseURL('/docs')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should return a longer base base url with /docs/kcl-samples/car-wheel-assembly', () => {
|
||||
const expected = 'https://dev.zoo.dev/docs/kcl-samples/car-wheel-assembly'
|
||||
const actual = withSiteBaseURL('/docs/kcl-samples/car-wheel-assembly')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should ensure base url does not have ending slash', () => {
|
||||
const expected = 'https://dev.zoo.dev'
|
||||
const actual = withSiteBaseURL('')
|
||||
expect(actual).toBe(expected)
|
||||
const expectedEndsWith = expected[expected.length - 1]
|
||||
const actualEndsWith = actual[actual.length - 1]
|
||||
expect(actual).toBe(expected)
|
||||
expect(actualEndsWith).toBe(expectedEndsWith)
|
||||
})
|
||||
})
|
||||
|
||||
describe('withWebSocketURL', () => {
|
||||
it('should return url', () => {
|
||||
const expected = 'wss://api.dev.zoo.dev/ws/modeling/commands'
|
||||
const actual = withWebSocketURL('')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should return url with /docs', () => {
|
||||
const expected = 'wss://api.dev.zoo.dev/ws/modeling/commands?'
|
||||
const actual = withWebSocketURL('?')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should ensure url does not have ending slash', () => {
|
||||
const expected = 'wss://api.dev.zoo.dev/ws/modeling/commands'
|
||||
const actual = withWebSocketURL('')
|
||||
expect(actual).toBe(expected)
|
||||
const expectedEndsWith = expected[expected.length - 1]
|
||||
const actualEndsWith = actual[actual.length - 1]
|
||||
expect(actual).toBe(expected)
|
||||
expect(actualEndsWith).toBe(expectedEndsWith)
|
||||
})
|
||||
})
|
||||
})
|
@ -1,5 +1,17 @@
|
||||
import { VITE_KC_API_BASE_URL } from '@src/env'
|
||||
import {
|
||||
VITE_KC_API_BASE_URL,
|
||||
VITE_KC_SITE_BASE_URL,
|
||||
VITE_KC_API_WS_MODELING_URL,
|
||||
} from '@src/env'
|
||||
|
||||
export default function withBaseUrl(path: string): string {
|
||||
export function withAPIBaseURL(path: string): string {
|
||||
return VITE_KC_API_BASE_URL + path
|
||||
}
|
||||
|
||||
export function withSiteBaseURL(path: string): string {
|
||||
return VITE_KC_SITE_BASE_URL + path
|
||||
}
|
||||
|
||||
export function withWebSocketURL(path: string): string {
|
||||
return VITE_KC_API_WS_MODELING_URL + path
|
||||
}
|
||||
|
30
src/lib/withBaseURLNode.test.ts
Normal file
30
src/lib/withBaseURLNode.test.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import { withSiteBaseURLNode } from '@src/lib/withBaseURLNode'
|
||||
|
||||
describe('withBaseURL', () => {
|
||||
describe('withSiteBaseURL', () => {
|
||||
it('should return base url', () => {
|
||||
const expected = 'https://dev.zoo.dev'
|
||||
const actual = withSiteBaseURLNode('')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should return base url with /docs', () => {
|
||||
const expected = 'https://dev.zoo.dev/docs'
|
||||
const actual = withSiteBaseURLNode('/docs')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should return a longer base base url with /docs/kcl-samples/car-wheel-assembly', () => {
|
||||
const expected = 'https://dev.zoo.dev/docs/kcl-samples/car-wheel-assembly'
|
||||
const actual = withSiteBaseURLNode('/docs/kcl-samples/car-wheel-assembly')
|
||||
expect(actual).toBe(expected)
|
||||
})
|
||||
it('should ensure base url does not have ending slash', () => {
|
||||
const expected = 'https://dev.zoo.dev'
|
||||
const actual = withSiteBaseURLNode('')
|
||||
expect(actual).toBe(expected)
|
||||
const expectedEndsWith = expected[expected.length - 1]
|
||||
const actualEndsWith = actual[actual.length - 1]
|
||||
expect(actual).toBe(expected)
|
||||
expect(actualEndsWith).toBe(expectedEndsWith)
|
||||
})
|
||||
})
|
||||
})
|
6
src/lib/withBaseURLNode.ts
Normal file
6
src/lib/withBaseURLNode.ts
Normal file
@ -0,0 +1,6 @@
|
||||
/**
|
||||
* This will not run in the browser, look at withBaseURL
|
||||
*/
|
||||
export function withSiteBaseURLNode(path: string): string {
|
||||
return process.env.VITE_KC_SITE_BASE_URL + path
|
||||
}
|
@ -1,10 +1,5 @@
|
||||
import type { Models } from '@kittycad/lib'
|
||||
import {
|
||||
DEV,
|
||||
VITE_KC_API_BASE_URL,
|
||||
VITE_KC_DEV_TOKEN,
|
||||
VITE_KC_SKIP_AUTH,
|
||||
} from '@src/env'
|
||||
import { VITE_KC_DEV_TOKEN } from '@src/env'
|
||||
import { assign, fromPromise, setup } from 'xstate'
|
||||
|
||||
import { COOKIE_NAME, OAUTH2_DEVICE_CLIENT_ID } from '@src/lib/constants'
|
||||
@ -15,32 +10,9 @@ import {
|
||||
} from '@src/lib/desktop'
|
||||
import { isDesktop } from '@src/lib/isDesktop'
|
||||
import { markOnce } from '@src/lib/performance'
|
||||
import {
|
||||
default as withBaseURL,
|
||||
default as withBaseUrl,
|
||||
} from '@src/lib/withBaseURL'
|
||||
import { withAPIBaseURL } from '@src/lib/withBaseURL'
|
||||
import { ACTOR_IDS } from '@src/machines/machineConstants'
|
||||
|
||||
const SKIP_AUTH = VITE_KC_SKIP_AUTH === 'true' && DEV
|
||||
|
||||
const LOCAL_USER: Models['User_type'] = {
|
||||
id: '8675309',
|
||||
name: 'Test User',
|
||||
email: 'kittycad.sidebar.test@example.com',
|
||||
image: 'https://placekitten.com/200/200',
|
||||
created_at: 'yesteryear',
|
||||
updated_at: 'today',
|
||||
company: 'Test Company',
|
||||
discord: 'Test User#1234',
|
||||
github: 'testuser',
|
||||
phone: '555-555-5555',
|
||||
first_name: 'Test',
|
||||
last_name: 'User',
|
||||
can_train_on_data: false,
|
||||
is_service_account: false,
|
||||
deletion_scheduled: false,
|
||||
}
|
||||
|
||||
export interface UserContext {
|
||||
user?: Models['User_type']
|
||||
token: string
|
||||
@ -56,11 +28,21 @@ export type Events =
|
||||
}
|
||||
|
||||
export const TOKEN_PERSIST_KEY = 'TOKEN_PERSIST_KEY'
|
||||
|
||||
/**
|
||||
* Determine which token do we have persisted to initialize the auth machine
|
||||
*/
|
||||
const persistedCookie = getCookie(COOKIE_NAME)
|
||||
const persistedLocalStorage = localStorage?.getItem(TOKEN_PERSIST_KEY) || ''
|
||||
const persistedDevToken = VITE_KC_DEV_TOKEN
|
||||
export const persistedToken =
|
||||
VITE_KC_DEV_TOKEN ||
|
||||
getCookie(COOKIE_NAME) ||
|
||||
localStorage?.getItem(TOKEN_PERSIST_KEY) ||
|
||||
''
|
||||
persistedDevToken || persistedCookie || persistedLocalStorage
|
||||
console.log('Initial persisted token')
|
||||
console.table([
|
||||
['cookie', !!persistedCookie],
|
||||
['local storage', !!persistedLocalStorage],
|
||||
['dev token', !!persistedDevToken],
|
||||
])
|
||||
|
||||
export const authMachine = setup({
|
||||
types: {} as {
|
||||
@ -157,7 +139,7 @@ export const authMachine = setup({
|
||||
|
||||
async function getUser(input: { token?: string }) {
|
||||
const token = await getAndSyncStoredToken(input)
|
||||
const url = withBaseURL('/user')
|
||||
const url = withAPIBaseURL('/user')
|
||||
const headers: { [key: string]: string } = {
|
||||
'Content-Type': 'application/json',
|
||||
}
|
||||
@ -165,21 +147,8 @@ async function getUser(input: { token?: string }) {
|
||||
if (!token && isDesktop()) return Promise.reject(new Error('No token found'))
|
||||
if (token) headers['Authorization'] = `Bearer ${token}`
|
||||
|
||||
if (SKIP_AUTH) {
|
||||
// For local tests
|
||||
if (localStorage.getItem('FORCE_NO_IMAGE')) {
|
||||
LOCAL_USER.image = ''
|
||||
}
|
||||
|
||||
markOnce('code/didAuth')
|
||||
return {
|
||||
user: LOCAL_USER,
|
||||
token,
|
||||
}
|
||||
}
|
||||
|
||||
const userPromise = isDesktop()
|
||||
? getUserDesktop(token, VITE_KC_API_BASE_URL)
|
||||
? getUserDesktop(token)
|
||||
: fetch(url, {
|
||||
method: 'GET',
|
||||
credentials: 'include',
|
||||
@ -228,12 +197,24 @@ async function getAndSyncStoredToken(input: {
|
||||
token?: string
|
||||
}): Promise<string> {
|
||||
// dev mode
|
||||
if (VITE_KC_DEV_TOKEN) return VITE_KC_DEV_TOKEN
|
||||
if (VITE_KC_DEV_TOKEN) {
|
||||
console.log('Token used for authentication')
|
||||
console.table([['dev token', !!VITE_KC_DEV_TOKEN]])
|
||||
return VITE_KC_DEV_TOKEN
|
||||
}
|
||||
|
||||
const token =
|
||||
input.token && input.token !== ''
|
||||
? input.token
|
||||
: getCookie(COOKIE_NAME) || localStorage?.getItem(TOKEN_PERSIST_KEY) || ''
|
||||
const inputToken = input.token && input.token !== '' ? input.token : ''
|
||||
const cookieToken = getCookie(COOKIE_NAME)
|
||||
const localStorageToken = localStorage?.getItem(TOKEN_PERSIST_KEY) || ''
|
||||
const token = inputToken || cookieToken || localStorageToken
|
||||
|
||||
console.log('Token used for authentication')
|
||||
console.table([
|
||||
['persisted token', !!inputToken],
|
||||
['cookie', !!cookieToken],
|
||||
['local storage', !!localStorageToken],
|
||||
['dev token', !!VITE_KC_DEV_TOKEN],
|
||||
])
|
||||
if (token) {
|
||||
// has just logged in, update storage
|
||||
localStorage.setItem(TOKEN_PERSIST_KEY, token)
|
||||
@ -259,7 +240,7 @@ async function logout() {
|
||||
|
||||
if (token) {
|
||||
try {
|
||||
await fetch(withBaseUrl('/oauth2/token/revoke'), {
|
||||
await fetch(withAPIBaseURL('/oauth2/token/revoke'), {
|
||||
method: 'POST',
|
||||
credentials: 'include',
|
||||
headers: {
|
||||
@ -282,7 +263,7 @@ async function logout() {
|
||||
}
|
||||
}
|
||||
|
||||
return fetch(withBaseUrl('/logout'), {
|
||||
return fetch(withAPIBaseURL('/logout'), {
|
||||
method: 'POST',
|
||||
credentials: 'include',
|
||||
})
|
||||
|
@ -75,7 +75,6 @@ process.env.VITE_KC_API_WS_MODELING_URL ??= viteEnv.VITE_KC_API_WS_MODELING_URL
|
||||
process.env.VITE_KC_API_BASE_URL ??= viteEnv.VITE_KC_API_BASE_URL
|
||||
process.env.VITE_KC_SITE_BASE_URL ??= viteEnv.VITE_KC_SITE_BASE_URL
|
||||
process.env.VITE_KC_SITE_APP_URL ??= viteEnv.VITE_KC_SITE_APP_URL
|
||||
process.env.VITE_KC_SKIP_AUTH ??= viteEnv.VITE_KC_SKIP_AUTH
|
||||
process.env.VITE_KC_CONNECTION_TIMEOUT_MS ??=
|
||||
viteEnv.VITE_KC_CONNECTION_TIMEOUT_MS
|
||||
|
||||
|
@ -5,6 +5,7 @@ import { reportRejection } from '@src/lib/trap'
|
||||
import { typeSafeWebContentsSend } from '@src/menu/channels'
|
||||
import type { ZooMenuItemConstructorOptions } from '@src/menu/roles'
|
||||
import { getAutoUpdater } from '@src/updater'
|
||||
import { withSiteBaseURLNode } from '@src/lib/withBaseURLNode'
|
||||
|
||||
export const helpRole = (
|
||||
mainWindow: BrowserWindow
|
||||
@ -26,14 +27,16 @@ export const helpRole = (
|
||||
id: 'Help.KCL code samples',
|
||||
click: () => {
|
||||
shell
|
||||
.openExternal('https://zoo.dev/docs/kcl-samples')
|
||||
.openExternal(withSiteBaseURLNode('/docs/kcl-samples'))
|
||||
.catch(reportRejection)
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'KCL Docs',
|
||||
click: () => {
|
||||
shell.openExternal('https://zoo.dev/docs/kcl').catch(reportRejection)
|
||||
shell
|
||||
.openExternal(withSiteBaseURLNode('/docs/kcl'))
|
||||
.catch(reportRejection)
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -116,7 +119,9 @@ export const helpRole = (
|
||||
{
|
||||
label: 'Manage Account',
|
||||
click: () => {
|
||||
shell.openExternal('https://zoo.dev/account').catch(reportRejection)
|
||||
shell
|
||||
.openExternal(withSiteBaseURLNode('/account'))
|
||||
.catch(reportRejection)
|
||||
},
|
||||
},
|
||||
],
|
||||
|
@ -292,7 +292,6 @@ contextBridge.exposeInMainWorld('electron', {
|
||||
'VITE_KC_API_BASE_URL',
|
||||
'VITE_KC_SITE_BASE_URL',
|
||||
'VITE_KC_SITE_APP_URL',
|
||||
'VITE_KC_SKIP_AUTH',
|
||||
'VITE_KC_CONNECTION_TIMEOUT_MS',
|
||||
'VITE_KC_DEV_TOKEN',
|
||||
|
||||
|
@ -67,6 +67,7 @@ import {
|
||||
defaultGlobalStatusBarItems,
|
||||
} from '@src/components/StatusBar/defaultStatusBarItems'
|
||||
import { useSelector } from '@xstate/react'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
type ReadWriteProjectState = {
|
||||
value: boolean
|
||||
@ -367,9 +368,9 @@ const Home = () => {
|
||||
<li className="contents">
|
||||
<ActionButton
|
||||
Element="externalLink"
|
||||
to="https://zoo.dev/docs"
|
||||
to={withSiteBaseURL('/docs')}
|
||||
onClick={openExternalBrowserIfDesktop(
|
||||
'https://zoo.dev/account'
|
||||
withSiteBaseURL('/account')
|
||||
)}
|
||||
className={sidebarButtonClasses}
|
||||
iconStart={{
|
||||
@ -384,8 +385,8 @@ const Home = () => {
|
||||
<li className="contents">
|
||||
<ActionButton
|
||||
Element="externalLink"
|
||||
to="https://zoo.dev/blog"
|
||||
onClick={openExternalBrowserIfDesktop('https://zoo.dev/blog')}
|
||||
to={withSiteBaseURL('/blog')}
|
||||
onClick={openExternalBrowserIfDesktop(withSiteBaseURL('/blog'))}
|
||||
className={sidebarButtonClasses}
|
||||
iconStart={{
|
||||
icon: 'glasses',
|
||||
|
@ -25,12 +25,12 @@ import { systemIOActor, commandBarActor } from '@src/lib/singletons'
|
||||
import type { IndexLoaderData } from '@src/lib/types'
|
||||
import { SystemIOMachineEvents } from '@src/machines/systemIO/utils'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { openExternalBrowserIfDesktop } from '@src/lib/openWindow'
|
||||
import {
|
||||
browserAxialFan,
|
||||
browserAxialFanAfterTextToCad,
|
||||
} from '@src/lib/exampleKcl'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
type BrowserOnboaringRoute = RouteObject & {
|
||||
path: keyof typeof browserOnboardingPaths
|
||||
@ -461,7 +461,7 @@ function PromptToEditResult() {
|
||||
function OnboardingConclusion() {
|
||||
// Close the panes on mount, close on unmount
|
||||
useOnboardingPanes()
|
||||
const downloadLink = `${VITE_KC_SITE_BASE_URL}/${APP_DOWNLOAD_PATH}`
|
||||
const downloadLink = withSiteBaseURL(`/${APP_DOWNLOAD_PATH}`)
|
||||
|
||||
return (
|
||||
<div className="cursor-not-allowed fixed inset-0 z-50 p-16 grid justify-center items-center">
|
||||
|
@ -27,8 +27,8 @@ import {
|
||||
modifiedFanHousingBrowser,
|
||||
modifiedParametersDesktop,
|
||||
} from '@src/lib/exampleKcl'
|
||||
import { VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { openExternalBrowserIfDesktop } from '@src/lib/openWindow'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
type DesktopOnboardingRoute = RouteObject & {
|
||||
path: keyof typeof desktopOnboardingPaths
|
||||
@ -642,10 +642,8 @@ function OnboardingConclusion() {
|
||||
project, click the Zoo button in the top left. To learn more detailed
|
||||
and advanced techniques,{' '}
|
||||
<a
|
||||
onClick={openExternalBrowserIfDesktop(
|
||||
`${VITE_KC_SITE_BASE_URL}/docs`
|
||||
)}
|
||||
href={`${VITE_KC_SITE_BASE_URL}/docs`}
|
||||
onClick={openExternalBrowserIfDesktop(withSiteBaseURL('/docs'))}
|
||||
href={`${withSiteBaseURL('/docs')}`}
|
||||
>
|
||||
check out our docs
|
||||
</a>
|
||||
|
@ -6,7 +6,6 @@ import { Link } from 'react-router-dom'
|
||||
import { ActionButton } from '@src/components/ActionButton'
|
||||
import { CustomIcon } from '@src/components/CustomIcon'
|
||||
import { Logo } from '@src/components/Logo'
|
||||
import { VITE_KC_API_BASE_URL, VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { APP_NAME } from '@src/lib/constants'
|
||||
import { isDesktop } from '@src/lib/isDesktop'
|
||||
import { openExternalBrowserIfDesktop } from '@src/lib/openWindow'
|
||||
@ -15,6 +14,7 @@ import { reportRejection } from '@src/lib/trap'
|
||||
import { toSync } from '@src/lib/utils'
|
||||
import { authActor, useSettings } from '@src/lib/singletons'
|
||||
import { APP_VERSION, generateSignInUrl } from '@src/routes/utils'
|
||||
import { withAPIBaseURL, withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
const subtleBorder =
|
||||
'border border-solid border-chalkboard-30 dark:border-chalkboard-80'
|
||||
@ -36,7 +36,7 @@ const SignIn = () => {
|
||||
app: { theme },
|
||||
} = useSettings()
|
||||
const signInUrl = generateSignInUrl()
|
||||
const kclSampleUrl = `${VITE_KC_SITE_BASE_URL}/docs/kcl-samples/car-wheel-assembly`
|
||||
const kclSampleUrl = withSiteBaseURL('/docs/kcl-samples/car-wheel-assembly')
|
||||
|
||||
const getThemeText = useCallback(
|
||||
(shouldContrast = true) =>
|
||||
@ -54,7 +54,7 @@ const SignIn = () => {
|
||||
const signInDesktop = async () => {
|
||||
// We want to invoke our command to login via device auth.
|
||||
const userCodeToDisplay = await window.electron
|
||||
.startDeviceFlow(VITE_KC_API_BASE_URL + location.search)
|
||||
.startDeviceFlow(withAPIBaseURL(location.search))
|
||||
.catch(reportError)
|
||||
if (!userCodeToDisplay) {
|
||||
console.error('No user code received while trying to log in')
|
||||
@ -260,7 +260,7 @@ const SignIn = () => {
|
||||
<div className="flex gap-4 flex-wrap items-center">
|
||||
<ActionButton
|
||||
Element="externalLink"
|
||||
to="https://zoo.dev/docs/kcl-samples/pillow-block-bearing"
|
||||
to={withSiteBaseURL('/docs/kcl-samples/pillow-block-bearing')}
|
||||
iconStart={{
|
||||
icon: 'settings',
|
||||
bgClassName: '!bg-transparent',
|
||||
@ -273,7 +273,7 @@ const SignIn = () => {
|
||||
</ActionButton>
|
||||
<ActionButton
|
||||
Element="externalLink"
|
||||
to="https://zoo.dev/docs/zoo-design-studio/text-to-cad"
|
||||
to={withSiteBaseURL('/docs/zoo-design-studio/text-to-cad')}
|
||||
iconStart={{
|
||||
icon: 'sparkles',
|
||||
bgClassName: '!bg-transparent',
|
||||
@ -296,7 +296,7 @@ const SignIn = () => {
|
||||
<div className="flex gap-4 flex-wrap items-center">
|
||||
<ActionButton
|
||||
Element="externalLink"
|
||||
to="https://zoo.dev/design-api"
|
||||
to={withSiteBaseURL('/design-api')}
|
||||
iconStart={{ icon: 'sketch', bgClassName: '!bg-transparent' }}
|
||||
className="!bg-primary !text-chalkboard-10 !border-transarent"
|
||||
>
|
||||
@ -304,7 +304,7 @@ const SignIn = () => {
|
||||
</ActionButton>
|
||||
<ActionButton
|
||||
Element="externalLink"
|
||||
to="https://zoo.dev/machine-learning-api"
|
||||
to={withSiteBaseURL('/machine-learning-api')}
|
||||
iconStart={{
|
||||
icon: 'elephant',
|
||||
bgClassName: '!bg-transparent',
|
||||
|
@ -1,10 +1,11 @@
|
||||
import { NODE_ENV, VITE_KC_SITE_BASE_URL } from '@src/env'
|
||||
import { NODE_ENV } from '@src/env'
|
||||
import { isDesktop } from '@src/lib/isDesktop'
|
||||
import {
|
||||
IS_PLAYWRIGHT_KEY,
|
||||
IMMEDIATE_SIGN_IN_IF_NECESSARY_QUERY_PARAM,
|
||||
} from '@src/lib/constants'
|
||||
import { PATHS } from '@src/lib/paths'
|
||||
import { withSiteBaseURL } from '@src/lib/withBaseURL'
|
||||
|
||||
const isTestEnv = window?.localStorage.getItem(IS_PLAYWRIGHT_KEY) === 'true'
|
||||
|
||||
@ -54,7 +55,7 @@ export function generateSignInUrl() {
|
||||
'?'
|
||||
)
|
||||
|
||||
return `${VITE_KC_SITE_BASE_URL}${
|
||||
PATHS.SIGN_IN
|
||||
}?callbackUrl=${encodeURIComponent(finalURL)}`
|
||||
return withSiteBaseURL(
|
||||
`${PATHS.SIGN_IN}?callbackUrl=${encodeURIComponent(finalURL)}`
|
||||
)
|
||||
}
|
||||
|
Reference in New Issue
Block a user