diff --git a/app/index.html b/app/index.html index beb67844..5dbbad4a 100644 --- a/app/index.html +++ b/app/index.html @@ -88,7 +88,8 @@ "ethers": "./vendor/ethers/ethers.js", "@preact/signals-core": "./vendor/@preact/signals-core/signals-core.module.js", "@preact/signals": "./vendor/@preact/signals/signals.module.js", - "funtypes": "./vendor/funtypes/index.mjs" + "funtypes": "./vendor/funtypes/index.mjs", + "multiformats": "./vendor/multiformats/index.js" } } diff --git a/app/ts/components/App.tsx b/app/ts/components/App.tsx index 3b8e9f9a..34b2761d 100644 --- a/app/ts/components/App.tsx +++ b/app/ts/components/App.tsx @@ -5,11 +5,14 @@ import { TransferPage } from './TransferPage/index.js' import { EthereumProvider } from '../context/Ethereum.js' import { WalletProvider } from '../context/Wallet.js' import { NotificationProvider } from '../context/Notification.js' +import { IPFSSubpathRedirect } from './IPFSSubpathRedirect.js' import { TemplatesProvider } from '../context/TransferTemplates.js' export function App() { + return ( + diff --git a/app/ts/components/IPFSSubpathRedirect.tsx b/app/ts/components/IPFSSubpathRedirect.tsx new file mode 100644 index 00000000..837bb7ef --- /dev/null +++ b/app/ts/components/IPFSSubpathRedirect.tsx @@ -0,0 +1,34 @@ +import { CID } from 'multiformats' +import { useEffect } from 'preact/hooks' + +export const IPFSSubpathRedirect = () => { + function extractHashFromBasePath() { + const htmlBase = document.querySelector('base') + if (!htmlBase || !htmlBase.href.includes('/ipfs/')) return + const cidRegex = /\/ipfs\/(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})/ + const [_, maybeCidMatch] = htmlBase.href.match(cidRegex) || [] + return maybeCidMatch + } + + function generateIPFSRedirectUrl() { + const cidFromPath = extractHashFromBasePath() + console.log(cidFromPath) + + if (!cidFromPath) { + console.log('No IPFS subpath detected') + return + } + + const v1CidString = CID.parse(cidFromPath).toV1().toString() + if (!v1CidString) return + return `${location.protocol}//${v1CidString}.ipfs.${location.host}` + } + + useEffect(() => { + const redirectUrl = generateIPFSRedirectUrl() + if (!redirectUrl) return + window.location.href = redirectUrl + }, []) + + return <> +} diff --git a/build-scripts/vendor.mts b/build-scripts/vendor.mts index 29873ff6..48337642 100755 --- a/build-scripts/vendor.mts +++ b/build-scripts/vendor.mts @@ -17,6 +17,7 @@ const dependencyPaths: Dependency[] = [ { packageName: '@preact/signals-core', subfolderToVendor: 'dist', mainEntrypointFile: 'signals-core.module.js', alternateEntrypoints: {} }, { packageName: '@preact/signals', subfolderToVendor: 'dist', mainEntrypointFile: 'signals.module.js', alternateEntrypoints: {} }, { packageName: 'funtypes', subfolderToVendor: 'lib', mainEntrypointFile: 'index.mjs', alternateEntrypoints: {} }, + { packageName: 'multiformats', subfolderToVendor: 'dist/src', mainEntrypointFile: 'index.js', alternateEntrypoints: {} }, ] async function vendorDependencies() { diff --git a/package-lock.json b/package-lock.json index 9e877d1d..792d14c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "@preact/signals": "1.1.1", "ethers": "6.7.1", "funtypes": "5.0.3", + "multiformats": "13.0.1", "preact": "10.8.1" }, "devDependencies": { @@ -123,6 +124,11 @@ "resolved": "https://registry.npmjs.org/funtypes/-/funtypes-5.0.3.tgz", "integrity": "sha512-8BYH+AEBVvYKL6tRDyD9W8MYi8uvaZ9QrqepPP8hu8IfOzsrVyf08MYKWGc2h8fCDrOVqBhoeOykT8xfHSu55Q==" }, + "node_modules/multiformats": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", + "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" + }, "node_modules/preact": { "version": "10.8.1", "resolved": "https://registry.npmjs.org/preact/-/preact-10.8.1.tgz", diff --git a/package.json b/package.json index 320afcf1..e799ad3c 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@preact/signals": "1.1.1", "ethers": "6.7.1", "funtypes": "5.0.3", + "multiformats": "13.0.1", "preact": "10.8.1" }, "scripts": {