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": {