diff --git a/package.json b/package.json index 6e16b00..218072e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "modules-app", "private": true, "type": "module", - "version": "0.9.0", + "version": "0.9.1", "engines": { "node": ">=22.18.0" }, diff --git a/src/App.browser.test.tsx b/src/App.browser.test.tsx index 0321314..7a3945e 100644 --- a/src/App.browser.test.tsx +++ b/src/App.browser.test.tsx @@ -389,7 +389,7 @@ describe('App component', () => { .element(installButton) .toHaveAttribute( 'href', - 'https://github.com/jasp-stats-modules/jaspAnova/releases/download/2cbd8a3e_R-4-4-1/jaspAnova_0.95.0_Windows_x86-64_R-4-5-1.JASPModule', + 'https://github.com/jasp-stats-modules/jaspAnova/releases/download/2cbd8a3e_R-4-4-1/jaspAnova_0.95.0_Windows_x86-64_R-4-5-1.JASPModule#t=jaspAnova', ); await expect diff --git a/src/App.qt.browser.test.tsx b/src/App.qt.browser.test.tsx index 07652da..f52d8bf 100644 --- a/src/App.qt.browser.test.tsx +++ b/src/App.qt.browser.test.tsx @@ -169,8 +169,8 @@ describe('App component (Qt mocked browser)', () => { expect(qtMockState.installMany).toHaveBeenCalledTimes(1); expect(qtMockState.installMany).toHaveBeenCalledWith( expect.arrayContaining([ - 'https://github.com/test/test/releases/download/v0.95.5-release.0/test1_MacOS_arm64.JASPModule', - 'https://github.com/test/test/releases/download/v0.95.5-release.0/test2_MacOS_arm64.JASPModule', + 'https://github.com/test/test/releases/download/v0.95.5-release.0/test1_MacOS_arm64.JASPModule#t=jaspAnova', + 'https://github.com/test/test/releases/download/v0.95.5-release.0/test2_MacOS_arm64.JASPModule#t=jaspBayesian', ]), ); }); diff --git a/src/App.tsx b/src/App.tsx index eb69b3c..56c4ec1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,7 +8,7 @@ import { useEffect, useId, useMemo, useState } from 'react'; import { useIntlayer, useMarkdownRenderer } from 'react-intlayer'; import { useDebounceValue } from 'usehooks-ts'; import { cn } from '@/lib/utils'; -import type { Release, Repository } from '@/types'; +import type { Asset, Release, Repository } from '@/types'; import type { Info } from '@/useJaspQtObject'; import { insideQt, useJaspQtObject } from '@/useJaspQtObject'; import { Button, buttonVariants } from './Button'; @@ -801,6 +801,41 @@ function RepositoryCard({ ); } +function enrichDownloadUrlInAsset(name: string, asset: Asset): Asset { + const hashParams = new URLSearchParams({ t: name }).toString(); + return { + ...asset, + downloadUrl: `${asset.downloadUrl}#${hashParams}`, + }; +} + +function enrichDownloadUrlInActions( + name: string, + actions: AnyAction[], +): AnyAction[] { + return actions.map((action) => { + if ('asset' in action) { + return { + ...action, + asset: enrichDownloadUrlInAsset(name, action.asset), + }; + } + return action; + }); +} + +function enrichDownloadUrlInReleaseStats( + releaseStats: ReleaseStats, +): ReleaseStats { + return { + ...releaseStats, + actions: enrichDownloadUrlInActions( + releaseStats.repo.name, + releaseStats.actions, + ), + }; +} + function getInstallableReleaseStats( reposOfChannel: Repository[], info: Pick< @@ -809,9 +844,11 @@ function getInstallableReleaseStats( >, allowPreRelease: boolean, ): ReleaseStats[] { - return reposOfChannel.flatMap((repo) => - getInstallableReleaseStatsFromRepository(repo, info, allowPreRelease), - ); + return reposOfChannel + .flatMap((repo) => + getInstallableReleaseStatsFromRepository(repo, info, allowPreRelease), + ) + .map(enrichDownloadUrlInReleaseStats); } function getInstallableReleaseStatsFromRepository(