diff --git a/src-tauri/capabilities/capabilities.json b/src-tauri/capabilities/capabilities.json index a1c625c2..456d75d6 100644 --- a/src-tauri/capabilities/capabilities.json +++ b/src-tauri/capabilities/capabilities.json @@ -7,6 +7,7 @@ "*" ], "permissions": [ + "core:app:allow-identifier", "core:event:allow-emit", "core:event:allow-listen", "core:event:allow-unlisten", diff --git a/src-web/components/IsDev.tsx b/src-web/components/IsDev.tsx index 3c380688..d850c5e3 100644 --- a/src-web/components/IsDev.tsx +++ b/src-web/components/IsDev.tsx @@ -1,12 +1,11 @@ import type { ReactNode } from 'react'; -import { useAppInfo } from '../hooks/useAppInfo'; +import { appInfo } from '../lib/appInfo'; interface Props { children: ReactNode; } export function IsDev({ children }: Props) { - const appInfo = useAppInfo(); if (!appInfo.isDev) { return null; } diff --git a/src-web/components/LicenseBadge.tsx b/src-web/components/LicenseBadge.tsx index caa37d4f..5868cb5c 100644 --- a/src-web/components/LicenseBadge.tsx +++ b/src-web/components/LicenseBadge.tsx @@ -2,7 +2,7 @@ import type { LicenseCheckStatus } from '@yaakapp-internal/license'; import { useLicense } from '@yaakapp-internal/license'; import type { ReactNode } from 'react'; import { openSettings } from '../commands/openSettings'; -import { appInfo } from '../hooks/useAppInfo'; +import { appInfo } from '../lib/appInfo'; import { useLicenseConfirmation } from '../hooks/useLicenseConfirmation'; import { BadgeButton } from './core/BadgeButton'; import type { ButtonProps } from './core/Button'; diff --git a/src-web/components/Settings/SettingsGeneral.tsx b/src-web/components/Settings/SettingsGeneral.tsx index ec6b0ebe..a58f8d26 100644 --- a/src-web/components/Settings/SettingsGeneral.tsx +++ b/src-web/components/Settings/SettingsGeneral.tsx @@ -3,7 +3,7 @@ import { patchModel, settingsAtom } from '@yaakapp-internal/models'; import { useAtomValue } from 'jotai'; import React from 'react'; import { activeWorkspaceAtom } from '../../hooks/useActiveWorkspace'; -import { useAppInfo } from '../../hooks/useAppInfo'; +import { appInfo } from '../../lib/appInfo'; import { useCheckForUpdates } from '../../hooks/useCheckForUpdates'; import { revealInFinderText } from '../../lib/reveal'; import { Checkbox } from '../core/Checkbox'; @@ -18,7 +18,6 @@ import { VStack } from '../core/Stacks'; export function SettingsGeneral() { const workspace = useAtomValue(activeWorkspaceAtom); const settings = useAtomValue(settingsAtom); - const appInfo = useAppInfo(); const checkForUpdates = useCheckForUpdates(); if (settings == null || workspace == null) { diff --git a/src-web/components/SettingsDropdown.tsx b/src-web/components/SettingsDropdown.tsx index 38f693c3..6710cebc 100644 --- a/src-web/components/SettingsDropdown.tsx +++ b/src-web/components/SettingsDropdown.tsx @@ -2,7 +2,7 @@ import { openUrl } from '@tauri-apps/plugin-opener'; import { useLicense } from '@yaakapp-internal/license'; import { useRef } from 'react'; import { openSettings } from '../commands/openSettings'; -import { useAppInfo } from '../hooks/useAppInfo'; +import { appInfo } from '../lib/appInfo'; import { useCheckForUpdates } from '../hooks/useCheckForUpdates'; import { useExportData } from '../hooks/useExportData'; import { useImportData } from '../hooks/useImportData'; @@ -17,7 +17,6 @@ import { KeyboardShortcutsDialog } from './KeyboardShortcutsDialog'; export function SettingsDropdown() { const importData = useImportData(); const exportData = useExportData(); - const appInfo = useAppInfo(); const dropdownRef = useRef(null); const checkForUpdates = useCheckForUpdates(); const { check } = useLicense(); diff --git a/src-web/components/core/Link.tsx b/src-web/components/core/Link.tsx index 2e0988ce..7dbd3d1e 100644 --- a/src-web/components/core/Link.tsx +++ b/src-web/components/core/Link.tsx @@ -1,6 +1,7 @@ import { Link as RouterLink } from '@tanstack/react-router'; import classNames from 'classnames'; import type { HTMLAttributes } from 'react'; +import { appInfo } from '../../lib/appInfo'; import { Icon } from './Icon'; interface Props extends HTMLAttributes { @@ -13,9 +14,15 @@ export function Link({ href, children, className, ...other }: Props) { className = classNames(className, 'relative underline hover:text-violet-600'); if (isExternal) { + let finalHref = href; + if (href.startsWith('https://yaak.app')) { + const url = new URL(href); + url.searchParams.set('ref', appInfo.identifier); + finalHref = url.toString(); + } return ( { diff --git a/src-web/hooks/useSyncWorkspaceRequestTitle.ts b/src-web/hooks/useSyncWorkspaceRequestTitle.ts index 50af0265..5a4a3113 100644 --- a/src-web/hooks/useSyncWorkspaceRequestTitle.ts +++ b/src-web/hooks/useSyncWorkspaceRequestTitle.ts @@ -1,11 +1,11 @@ import { setWindowTitle } from '@yaakapp-internal/mac-window'; import { useAtomValue } from 'jotai'; import { useEffect } from 'react'; +import { appInfo } from '../lib/appInfo'; import { resolvedModelName } from '../lib/resolvedModelName'; import { useActiveEnvironment } from './useActiveEnvironment'; import { activeRequestAtom } from './useActiveRequest'; import { activeWorkspaceAtom } from './useActiveWorkspace'; -import { appInfo } from './useAppInfo'; export function useSyncWorkspaceRequestTitle() { const activeWorkspace = useAtomValue(activeWorkspaceAtom); diff --git a/src-web/lib/appInfo.ts b/src-web/lib/appInfo.ts new file mode 100644 index 00000000..4f4e5264 --- /dev/null +++ b/src-web/lib/appInfo.ts @@ -0,0 +1,16 @@ +import { getIdentifier } from '@tauri-apps/api/app'; +import { invokeCmd } from './tauri'; + +export interface AppInfo { + isDev: boolean; + version: string; + name: string; + appDataDir: string; + appLogDir: string; + identifier: string; +} + +export const appInfo = { + ...(await invokeCmd('cmd_metadata')), + identifier: await getIdentifier(), +} as AppInfo;