Merge pull request #25 from Crossbell-Box/dev
This commit is contained in:
commit
e4441fcddb
|
|
@ -1,7 +1,7 @@
|
|||
##### BASE
|
||||
FROM node:16-bullseye-slim as base
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get update || : && apt-get install python3 build-essential -y
|
||||
|
||||
RUN npm i -g pnpm
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ function apply_path {
|
|||
if [ -n "$configValue" ] && [ -n "$envValue" ]; then
|
||||
# replace all
|
||||
echo "Replace: ${configValue} with: ${envValue}"
|
||||
find $nextFolder \( -type d -wholename .next/cache -prune \) \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i "s#$configValue#$envValue#g"
|
||||
find $nextFolder \( -type d -name cache -prune \) \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i "s#$configValue#$envValue#g"
|
||||
fi
|
||||
done < $envFilename
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@ module.exports = withBundleAnalyzer(
|
|||
|
||||
images: {
|
||||
dangerouslyAllowSVG: true,
|
||||
contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
|
||||
contentSecurityPolicy:
|
||||
"default-src 'self'; script-src 'none'; sandbox; style-src 'unsafe-inline';",
|
||||
remotePatterns: [{ hostname: "**" }],
|
||||
},
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -60,7 +60,9 @@
|
|||
"nanoid": "^4.0.0",
|
||||
"next": "^12.3.1",
|
||||
"nextjs-progressbar": "^0.0.14",
|
||||
"nodejieba": "^2.6.0",
|
||||
"pica": "^9.0.1",
|
||||
"pinyin": "3.0.0-alpha.5",
|
||||
"posthtml": "^0.16.6",
|
||||
"prismjs": "^1.29.0",
|
||||
"react": "^18.1.0",
|
||||
|
|
|
|||
409
pnpm-lock.yaml
409
pnpm-lock.yaml
|
|
@ -78,7 +78,9 @@ specifiers:
|
|||
nanoid: ^4.0.0
|
||||
next: ^12.3.1
|
||||
nextjs-progressbar: ^0.0.14
|
||||
nodejieba: ^2.6.0
|
||||
pica: ^9.0.1
|
||||
pinyin: 3.0.0-alpha.5
|
||||
postcss-import: ^15.0.0
|
||||
posthtml: ^0.16.6
|
||||
prettier: ^2.7.1
|
||||
|
|
@ -164,7 +166,9 @@ dependencies:
|
|||
nanoid: 4.0.0
|
||||
next: 12.3.1_biqbaboplfbrettd7655fr4n2y
|
||||
nextjs-progressbar: 0.0.14_next@12.3.1+react@18.2.0
|
||||
nodejieba: 2.6.0
|
||||
pica: 9.0.1
|
||||
pinyin: 3.0.0-alpha.5
|
||||
posthtml: 0.16.6
|
||||
prismjs: 1.29.0
|
||||
react: 18.2.0
|
||||
|
|
@ -1570,6 +1574,24 @@ packages:
|
|||
unist-util-visit: 1.4.1
|
||||
dev: false
|
||||
|
||||
/@mapbox/node-pre-gyp/1.0.10:
|
||||
resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
detect-libc: 2.0.1
|
||||
https-proxy-agent: 5.0.1
|
||||
make-dir: 3.1.0
|
||||
node-fetch: 2.6.7
|
||||
nopt: 5.0.0
|
||||
npmlog: 5.0.1
|
||||
rimraf: 3.0.2
|
||||
semver: 7.3.7
|
||||
tar: 6.1.11
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/@metamask/safe-event-emitter/2.0.0:
|
||||
resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==}
|
||||
dev: false
|
||||
|
|
@ -1732,6 +1754,144 @@ packages:
|
|||
resolution: {integrity: sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw==}
|
||||
dev: false
|
||||
|
||||
/@node-rs/jieba-android-arm-eabi/1.6.1:
|
||||
resolution: {integrity: sha512-R1YQfsPr7sK3Tq1sM0//6lNAGJK9RnMT0ShITT+7EJYr5OufUBb38lf/mRhrLxR0NF1pycEsMjdCAwrWrHd8rA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [android]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-android-arm64/1.6.1:
|
||||
resolution: {integrity: sha512-hBRbj2uLmRFYDw2lWppTAPoyjeXkBKUT84h4fHUQj7CMU94Gc1IWkE4ocCqhvUhbaUXlCpocS9mB0/fc2641bw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-darwin-arm64/1.6.1:
|
||||
resolution: {integrity: sha512-GeoDe7XVTF6z8JUtD98QvwudsMaHV5EBXs5uO43SobeIkShH3Nujq5gLMD5kWoJXTxDrTgJe4wT42EwUaBEH2Q==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-darwin-x64/1.6.1:
|
||||
resolution: {integrity: sha512-ENHYIS8b8JdMaUXEm0f8Y3+sHXu2UdukG1D/XGUNx+q5cn07HbwIg6L0tlGhE8dw4AhqoWHsExVaZ241Igh4iA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-freebsd-x64/1.6.1:
|
||||
resolution: {integrity: sha512-chwB/9edtxqS8Jm3j4RMaJjH9AlXmijUgKv02oMw36e77HKpko+tENUN25Vrn/9GKsKGqIPeXpmCjeXCN1HVQA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-linux-arm-gnueabihf/1.6.1:
|
||||
resolution: {integrity: sha512-tsb5fMGj4p8bHGfkf7bJ+HE2jxaixLTp3YnGg5D+kp8+HQRq8cp3ScG5cn8cq0phnJS/zfAp8rVfWInDagzKKQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-linux-arm64-gnu/1.6.1:
|
||||
resolution: {integrity: sha512-bSInORkJFfeZNR+i4rFoSZGbwkQtQlnZ0XfT/noTK9JUBDYErqQZPFjoaYAU45NWTk7p6Zkg30SuV1NTdWLaPw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-linux-arm64-musl/1.6.1:
|
||||
resolution: {integrity: sha512-qphL6xM7owfU8Hsh7GX73SDr/iApbnc+35mSLxbibAfCQnY89+WcBeWUUOSGM/Ov3VFaq4pyVlDFj0YjR01W2w==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-linux-x64-gnu/1.6.1:
|
||||
resolution: {integrity: sha512-f6hhlrbi2wel0xZG7m3Wvksimt9MSu1f3aYO2Kwavf4qjMRZqJzLz9HlCJAal6AXB9Qgg+685P+gftsWve47qw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-linux-x64-musl/1.6.1:
|
||||
resolution: {integrity: sha512-cTVcdR6zWqpnmdEUyWEII9zfE5lTeWN53TbiOPx8TCA+291/31Vqd7GA8YEPndUO8qgCx5uShSDFStBAEIhYNQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-win32-arm64-msvc/1.6.1:
|
||||
resolution: {integrity: sha512-YuOTrjHazDraXcGXRHgPQ53nyJuH8QtTCngYKjAzxsdt8uN+txb1AY69OLMLBBZqLTOwY9dgcW70vGiLQMCTeg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-win32-ia32-msvc/1.6.1:
|
||||
resolution: {integrity: sha512-4+E843ImGpVlZ+LlT9E/13NHmmUg3UHQx419D6fFMorJUUQuK4cZJfE1z4tCgcrbV8S5Wew5LIFywlJeJLu0LQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba-win32-x64-msvc/1.6.1:
|
||||
resolution: {integrity: sha512-veXNwm2VlseOzl7vaC7A/nZ4okp5/6edN7/Atj6mXnUbze/m/my5Rv5zUcW3U1D9VElnQ3srCHCa5vXljJuk6g==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@node-rs/jieba/1.6.1:
|
||||
resolution: {integrity: sha512-pISKu8NIYKRvZp7mhYZYA8VCjJMqTsCe+mQcFFnAi3GNJsijGjef2peMFeDcvP72X8MsnNeYeg3rHkAybtefyQ==}
|
||||
engines: {node: '>= 10'}
|
||||
requiresBuild: true
|
||||
optionalDependencies:
|
||||
'@node-rs/jieba-android-arm-eabi': 1.6.1
|
||||
'@node-rs/jieba-android-arm64': 1.6.1
|
||||
'@node-rs/jieba-darwin-arm64': 1.6.1
|
||||
'@node-rs/jieba-darwin-x64': 1.6.1
|
||||
'@node-rs/jieba-freebsd-x64': 1.6.1
|
||||
'@node-rs/jieba-linux-arm-gnueabihf': 1.6.1
|
||||
'@node-rs/jieba-linux-arm64-gnu': 1.6.1
|
||||
'@node-rs/jieba-linux-arm64-musl': 1.6.1
|
||||
'@node-rs/jieba-linux-x64-gnu': 1.6.1
|
||||
'@node-rs/jieba-linux-x64-musl': 1.6.1
|
||||
'@node-rs/jieba-win32-arm64-msvc': 1.6.1
|
||||
'@node-rs/jieba-win32-ia32-msvc': 1.6.1
|
||||
'@node-rs/jieba-win32-x64-msvc': 1.6.1
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@nodelib/fs.scandir/2.1.5:
|
||||
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
||||
engines: {node: '>= 8'}
|
||||
|
|
@ -2158,6 +2318,11 @@ packages:
|
|||
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
|
||||
dev: false
|
||||
|
||||
/@types/parse-json/4.0.0:
|
||||
resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@types/parse5/6.0.3:
|
||||
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
|
||||
dev: false
|
||||
|
|
@ -3013,6 +3178,10 @@ packages:
|
|||
through: 2.3.8
|
||||
dev: false
|
||||
|
||||
/abbrev/1.1.1:
|
||||
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
|
||||
dev: false
|
||||
|
||||
/abort-controller/3.0.0:
|
||||
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
|
||||
engines: {node: '>=6.5'}
|
||||
|
|
@ -3081,6 +3250,15 @@ packages:
|
|||
resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==}
|
||||
dev: false
|
||||
|
||||
/agent-base/6.0.2:
|
||||
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
||||
engines: {node: '>= 6.0.0'}
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/aggregate-error/3.1.0:
|
||||
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
|
||||
engines: {node: '>=8'}
|
||||
|
|
@ -3194,10 +3372,22 @@ packages:
|
|||
picomatch: 2.3.1
|
||||
dev: true
|
||||
|
||||
/aproba/2.0.0:
|
||||
resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
|
||||
dev: false
|
||||
|
||||
/are-passive-events-supported/1.1.1:
|
||||
resolution: {integrity: sha512-5wnvlvB/dTbfrCvJ027Y4L4gW/6Mwoy1uFSavney0YO++GU+0e/flnjiBBwH+1kh7xNCgCOGvmJC3s32joYbww==}
|
||||
dev: false
|
||||
|
||||
/are-we-there-yet/2.0.0:
|
||||
resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
|
||||
engines: {node: '>=10'}
|
||||
dependencies:
|
||||
delegates: 1.0.0
|
||||
readable-stream: 3.6.0
|
||||
dev: false
|
||||
|
||||
/arg/5.0.2:
|
||||
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
|
||||
dev: true
|
||||
|
|
@ -3351,6 +3541,15 @@ packages:
|
|||
resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==}
|
||||
dev: true
|
||||
|
||||
/babel-plugin-macros/2.8.0:
|
||||
resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==}
|
||||
dependencies:
|
||||
'@babel/runtime': 7.19.0
|
||||
cosmiconfig: 6.0.0
|
||||
resolve: 1.22.1
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/babel-plugin-polyfill-corejs2/0.3.3:
|
||||
resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==}
|
||||
peerDependencies:
|
||||
|
|
@ -3384,6 +3583,16 @@ packages:
|
|||
- supports-color
|
||||
dev: false
|
||||
|
||||
/babel-plugin-preval/4.0.0:
|
||||
resolution: {integrity: sha512-fZI/4cYneinlj2k/FsXw0/lTWSC5KKoepUueS1g25Gb5vx3GrRyaVwxWCshYqx11GEU4mZnbbFhee8vpquFS2w==}
|
||||
engines: {node: '>=8', npm: '>=6'}
|
||||
dependencies:
|
||||
'@babel/runtime': 7.19.0
|
||||
babel-plugin-macros: 2.8.0
|
||||
require-from-string: 2.0.2
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/bail/2.0.2:
|
||||
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
|
||||
dev: false
|
||||
|
|
@ -3740,6 +3949,11 @@ packages:
|
|||
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
|
||||
dev: false
|
||||
|
||||
/chownr/2.0.0:
|
||||
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
|
||||
engines: {node: '>=10'}
|
||||
dev: false
|
||||
|
||||
/chrome-trace-event/1.0.3:
|
||||
resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
|
||||
engines: {node: '>=6.0'}
|
||||
|
|
@ -3850,6 +4064,11 @@ packages:
|
|||
simple-swizzle: 0.2.2
|
||||
dev: false
|
||||
|
||||
/color-support/1.1.3:
|
||||
resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/color/4.2.3:
|
||||
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
|
||||
engines: {node: '>=12.5.0'}
|
||||
|
|
@ -3873,6 +4092,13 @@ packages:
|
|||
resolution: {integrity: sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==}
|
||||
dev: false
|
||||
|
||||
/commander/1.1.1:
|
||||
resolution: {integrity: sha512-71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==}
|
||||
engines: {node: '>= 0.6.x'}
|
||||
dependencies:
|
||||
keypress: 0.1.0
|
||||
dev: false
|
||||
|
||||
/commander/2.20.3:
|
||||
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
||||
|
||||
|
|
@ -3893,6 +4119,10 @@ packages:
|
|||
resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==}
|
||||
dev: true
|
||||
|
||||
/console-control-strings/1.1.0:
|
||||
resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
|
||||
dev: false
|
||||
|
||||
/cookie/0.5.0:
|
||||
resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
|
@ -3930,6 +4160,18 @@ packages:
|
|||
requiresBuild: true
|
||||
dev: true
|
||||
|
||||
/cosmiconfig/6.0.0:
|
||||
resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@types/parse-json': 4.0.0
|
||||
import-fresh: 3.3.0
|
||||
parse-json: 5.2.0
|
||||
path-type: 4.0.0
|
||||
yaml: 1.10.2
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/create-hash/1.2.0:
|
||||
resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
|
||||
dependencies:
|
||||
|
|
@ -4161,6 +4403,10 @@ packages:
|
|||
engines: {node: '>=0.4.0'}
|
||||
dev: false
|
||||
|
||||
/delegates/1.0.0:
|
||||
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
|
||||
dev: false
|
||||
|
||||
/denque/2.1.0:
|
||||
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
|
||||
engines: {node: '>=0.10'}
|
||||
|
|
@ -5724,6 +5970,13 @@ packages:
|
|||
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
|
||||
dev: false
|
||||
|
||||
/fs-minipass/2.1.0:
|
||||
resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
|
||||
engines: {node: '>= 8'}
|
||||
dependencies:
|
||||
minipass: 3.3.4
|
||||
dev: false
|
||||
|
||||
/fs.realpath/1.0.0:
|
||||
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
||||
|
||||
|
|
@ -5754,6 +6007,21 @@ packages:
|
|||
/functions-have-names/1.2.3:
|
||||
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
|
||||
|
||||
/gauge/3.0.2:
|
||||
resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
|
||||
engines: {node: '>=10'}
|
||||
dependencies:
|
||||
aproba: 2.0.0
|
||||
color-support: 1.1.3
|
||||
console-control-strings: 1.1.0
|
||||
has-unicode: 2.0.1
|
||||
object-assign: 4.1.1
|
||||
signal-exit: 3.0.7
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
wide-align: 1.1.5
|
||||
dev: false
|
||||
|
||||
/get-caller-file/2.0.5:
|
||||
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
|
||||
engines: {node: 6.* || 8.* || >= 10.*}
|
||||
|
|
@ -5942,6 +6210,10 @@ packages:
|
|||
dependencies:
|
||||
has-symbols: 1.0.3
|
||||
|
||||
/has-unicode/2.0.1:
|
||||
resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
|
||||
dev: false
|
||||
|
||||
/has/1.0.3:
|
||||
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
|
||||
engines: {node: '>= 0.4.0'}
|
||||
|
|
@ -6102,6 +6374,16 @@ packages:
|
|||
entities: 3.0.1
|
||||
dev: false
|
||||
|
||||
/https-proxy-agent/5.0.1:
|
||||
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
|
||||
engines: {node: '>= 6'}
|
||||
dependencies:
|
||||
agent-base: 6.0.2
|
||||
debug: 4.3.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/human-signals/2.1.0:
|
||||
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
||||
engines: {node: '>=10.17.0'}
|
||||
|
|
@ -6859,6 +7141,10 @@ packages:
|
|||
readable-stream: 3.6.0
|
||||
dev: false
|
||||
|
||||
/keypress/0.1.0:
|
||||
resolution: {integrity: sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA==}
|
||||
dev: false
|
||||
|
||||
/keyvaluestorage-interface/1.0.0:
|
||||
resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==}
|
||||
dev: false
|
||||
|
|
@ -7089,6 +7375,13 @@ packages:
|
|||
sourcemap-codec: 1.4.8
|
||||
dev: true
|
||||
|
||||
/make-dir/3.1.0:
|
||||
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
semver: 6.3.0
|
||||
dev: false
|
||||
|
||||
/map-obj/1.0.1:
|
||||
resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
|
@ -7604,10 +7897,31 @@ packages:
|
|||
/minimist/1.2.6:
|
||||
resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
|
||||
|
||||
/minipass/3.3.4:
|
||||
resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
yallist: 4.0.0
|
||||
dev: false
|
||||
|
||||
/minizlib/2.1.2:
|
||||
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
|
||||
engines: {node: '>= 8'}
|
||||
dependencies:
|
||||
minipass: 3.3.4
|
||||
yallist: 4.0.0
|
||||
dev: false
|
||||
|
||||
/mkdirp-classic/0.5.3:
|
||||
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
|
||||
dev: false
|
||||
|
||||
/mkdirp/1.0.4:
|
||||
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/move-file/2.1.0:
|
||||
resolution: {integrity: sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA==}
|
||||
engines: {node: '>=10.17'}
|
||||
|
|
@ -7791,6 +8105,10 @@ packages:
|
|||
resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==}
|
||||
dev: false
|
||||
|
||||
/node-addon-api/3.2.1:
|
||||
resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==}
|
||||
dev: false
|
||||
|
||||
/node-addon-api/5.0.0:
|
||||
resolution: {integrity: sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==}
|
||||
dev: false
|
||||
|
|
@ -7829,6 +8147,39 @@ packages:
|
|||
/node-releases/2.0.6:
|
||||
resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
|
||||
|
||||
/nodejieba/2.5.2:
|
||||
resolution: {integrity: sha512-ByskJvaBrQ2eV+5M0OeD80S5NKoGaHc9zi3Z/PTKl/95eac2YF8RmWduq9AknLpkQLrLAIcqurrtC6BzjpKwwg==}
|
||||
engines: {node: '>= 10.20.0'}
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
'@mapbox/node-pre-gyp': 1.0.10
|
||||
node-addon-api: 3.2.1
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
- supports-color
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/nodejieba/2.6.0:
|
||||
resolution: {integrity: sha512-cyEOLRGLjDuxbTuv6nuMAK3NpML4ft9i7st98TFHvXtg+m3RFhIuf4INBHGp3VhUaqPsCTfAkhHB/ZNTFiwJjg==}
|
||||
engines: {node: '>= 10.20.0'}
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
'@mapbox/node-pre-gyp': 1.0.10
|
||||
node-addon-api: 3.2.1
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/nopt/5.0.0:
|
||||
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
|
||||
engines: {node: '>=6'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
abbrev: 1.1.1
|
||||
dev: false
|
||||
|
||||
/normalize-package-data/2.5.0:
|
||||
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
|
||||
dependencies:
|
||||
|
|
@ -7872,6 +8223,15 @@ packages:
|
|||
path-key: 4.0.0
|
||||
dev: true
|
||||
|
||||
/npmlog/5.0.1:
|
||||
resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
|
||||
dependencies:
|
||||
are-we-there-yet: 2.0.0
|
||||
console-control-strings: 1.1.0
|
||||
gauge: 3.0.2
|
||||
set-blocking: 2.0.0
|
||||
dev: false
|
||||
|
||||
/nprogress/0.2.0:
|
||||
resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
|
||||
dev: false
|
||||
|
|
@ -8217,6 +8577,20 @@ packages:
|
|||
engines: {node: '>=10'}
|
||||
dev: false
|
||||
|
||||
/pinyin/3.0.0-alpha.5:
|
||||
resolution: {integrity: sha512-Sc8+Ch8uxZsVO0zvzHxvy24fEIixSl7V4kZoX4ThSyQ1BI0H8jIAqf0kxT8WMCX2xEHr1CYslKGDgSE4yj71hg==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
commander: 1.1.1
|
||||
optionalDependencies:
|
||||
'@node-rs/jieba': 1.6.1
|
||||
nodejieba: 2.5.2
|
||||
segmentit: 2.0.3
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/pkg-conf/3.1.0:
|
||||
resolution: {integrity: sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==}
|
||||
engines: {node: '>=6'}
|
||||
|
|
@ -8389,6 +8763,13 @@ packages:
|
|||
hasBin: true
|
||||
dev: true
|
||||
|
||||
/preval.macro/4.0.0:
|
||||
resolution: {integrity: sha512-sJJnE71X+MPr64CVD2AurmUj4JEDqbudYbStav3L9Xjcqm4AR0ymMm6sugw1mUmfI/7gw4JWA4JXo/k6w34crw==}
|
||||
dependencies:
|
||||
babel-plugin-preval: 4.0.0
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/prismjs/1.29.0:
|
||||
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
|
||||
engines: {node: '>=6'}
|
||||
|
|
@ -9085,6 +9466,14 @@ packages:
|
|||
node-gyp-build: 4.5.0
|
||||
dev: false
|
||||
|
||||
/segmentit/2.0.3:
|
||||
resolution: {integrity: sha512-7mn2XL3OdTUQ+AhHz7SbgyxLTaQRzTWQNVwiK+UlTO8aePGbSwvKUzTwE4238+OUY9MoR6ksAg35zl8sfTunQQ==}
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
preval.macro: 4.0.0
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/semver/5.7.1:
|
||||
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
|
||||
hasBin: true
|
||||
|
|
@ -9157,7 +9546,6 @@ packages:
|
|||
|
||||
/signal-exit/3.0.7:
|
||||
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
||||
dev: true
|
||||
|
||||
/simple-concat/1.0.1:
|
||||
resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
|
||||
|
|
@ -9596,6 +9984,18 @@ packages:
|
|||
readable-stream: 3.6.0
|
||||
dev: false
|
||||
|
||||
/tar/6.1.11:
|
||||
resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==}
|
||||
engines: {node: '>= 10'}
|
||||
dependencies:
|
||||
chownr: 2.0.0
|
||||
fs-minipass: 2.1.0
|
||||
minipass: 3.3.4
|
||||
minizlib: 2.1.2
|
||||
mkdirp: 1.0.4
|
||||
yallist: 4.0.0
|
||||
dev: false
|
||||
|
||||
/terser-webpack-plugin/5.3.6_k7xlqms7gtkxek3uz4vwbhfvde:
|
||||
resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==}
|
||||
engines: {node: '>= 10.13.0'}
|
||||
|
|
@ -10536,6 +10936,12 @@ packages:
|
|||
dependencies:
|
||||
isexe: 2.0.0
|
||||
|
||||
/wide-align/1.1.5:
|
||||
resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
|
||||
dependencies:
|
||||
string-width: 4.2.3
|
||||
dev: false
|
||||
|
||||
/wonka/4.0.15:
|
||||
resolution: {integrity: sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==}
|
||||
dev: false
|
||||
|
|
@ -10651,7 +11057,6 @@ packages:
|
|||
/yaml/1.10.2:
|
||||
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
|
||||
engines: {node: '>= 6'}
|
||||
dev: true
|
||||
|
||||
/yaml/2.1.1:
|
||||
resolution: {integrity: sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ import { Button } from "../ui/Button"
|
|||
import { UniLink } from "../ui/UniLink"
|
||||
import { nanoid } from "nanoid"
|
||||
import { renderPageContent } from "~/markdown"
|
||||
import { Tooltip } from "../ui/Tooltip"
|
||||
import { APP_NAME } from "~/lib/env"
|
||||
|
||||
export const PagesManager: React.FC<{
|
||||
isPost: boolean
|
||||
|
|
@ -56,8 +58,12 @@ export const PagesManager: React.FC<{
|
|||
toast.success("Converted!", {
|
||||
id: convertToastId,
|
||||
})
|
||||
} else if (createOrUpdatePage.isError) {
|
||||
toast.error("Failed to convert.", {
|
||||
id: convertToastId,
|
||||
})
|
||||
}
|
||||
}, [createOrUpdatePage.isSuccess, convertToastId])
|
||||
}, [createOrUpdatePage.isSuccess, createOrUpdatePage.isError, convertToastId])
|
||||
|
||||
const pages = useGetPagesBySite({
|
||||
type: isPost ? "post" : "page",
|
||||
|
|
@ -84,6 +90,10 @@ export const PagesManager: React.FC<{
|
|||
value: PageVisibilityEnum.Scheduled,
|
||||
text: "Scheduled",
|
||||
},
|
||||
{
|
||||
value: PageVisibilityEnum.Crossbell,
|
||||
text: "Others on Crossbell",
|
||||
},
|
||||
].map((item) => ({
|
||||
text: item.text,
|
||||
onClick: () => {
|
||||
|
|
@ -110,6 +120,7 @@ export const PagesManager: React.FC<{
|
|||
|
||||
const queryClient = useQueryClient()
|
||||
const getPageMenuItems = (page: Note) => {
|
||||
const isCrossbell = !page.applications?.includes("xlog")
|
||||
return [
|
||||
{
|
||||
text: "Edit",
|
||||
|
|
@ -132,21 +143,18 @@ export const PagesManager: React.FC<{
|
|||
},
|
||||
},
|
||||
{
|
||||
text: "Convert to " + (isPost ? "Page" : "Post"),
|
||||
text:
|
||||
"Convert to " +
|
||||
(isCrossbell
|
||||
? `${APP_NAME} ${isPost ? "Post" : "Page"}`
|
||||
: isPost
|
||||
? "Page"
|
||||
: "Post"),
|
||||
icon: <span className="i-tabler:transform inline-block"></span>,
|
||||
onClick() {
|
||||
if (!page.metadata) {
|
||||
const toastId = toast.loading("Converting...")
|
||||
const data = getStorage(`draft-${subdomain}-${page.id}`)
|
||||
data.isPost = !isPost
|
||||
setStorage(`draft-${subdomain}-${page.id}`, data)
|
||||
queryClient.invalidateQueries(["getPagesBySite", subdomain])
|
||||
queryClient.invalidateQueries(["getPage", page.id])
|
||||
toast.success("Converted!", {
|
||||
id: toastId,
|
||||
})
|
||||
} else {
|
||||
setConvertToastId(toast.loading("Converting..."))
|
||||
const toastId = toast.loading("Converting...")
|
||||
if (isCrossbell) {
|
||||
setConvertToastId(toastId)
|
||||
createOrUpdatePage.mutate({
|
||||
published: true,
|
||||
pageId: page.id,
|
||||
|
|
@ -154,8 +162,32 @@ export const PagesManager: React.FC<{
|
|||
tags: page.tags
|
||||
?.filter((tag) => tag !== "post" && tag !== "page")
|
||||
?.join(", "),
|
||||
isPost: !isPost,
|
||||
isPost: isPost,
|
||||
applications: page.applications,
|
||||
})
|
||||
} else {
|
||||
if (!page.metadata) {
|
||||
const data = getStorage(`draft-${subdomain}-${page.id}`)
|
||||
data.isPost = !isPost
|
||||
setStorage(`draft-${subdomain}-${page.id}`, data)
|
||||
queryClient.invalidateQueries(["getPagesBySite", subdomain])
|
||||
queryClient.invalidateQueries(["getPage", page.id])
|
||||
toast.success("Converted!", {
|
||||
id: toastId,
|
||||
})
|
||||
} else {
|
||||
setConvertToastId(toastId)
|
||||
createOrUpdatePage.mutate({
|
||||
published: true,
|
||||
pageId: page.id,
|
||||
siteId: subdomain,
|
||||
tags: page.tags
|
||||
?.filter((tag) => tag !== "post" && tag !== "page")
|
||||
?.join(", "),
|
||||
isPost: !isPost,
|
||||
applications: page.applications,
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
|
|
@ -198,6 +230,55 @@ export const PagesManager: React.FC<{
|
|||
]
|
||||
}
|
||||
|
||||
const importFile = () => {
|
||||
const input = document.createElement("input")
|
||||
input.type = "file"
|
||||
input.accept = ".md"
|
||||
input.addEventListener("change", async (e: any) => {
|
||||
const file = e.target?.files?.[0]
|
||||
const reader = new FileReader()
|
||||
reader.readAsText(file, "UTF-8")
|
||||
reader.onload = (evt) => {
|
||||
if (evt.target?.result) {
|
||||
const pageContent = renderPageContent(evt.target.result as string)
|
||||
|
||||
const id = nanoid()
|
||||
const key = `draft-${subdomain}-local-${id}`
|
||||
const tags =
|
||||
pageContent.frontMatter.tags || pageContent.frontMatter.categories
|
||||
setStorage(key, {
|
||||
date: +new Date(),
|
||||
values: {
|
||||
content: evt.target.result,
|
||||
published: false,
|
||||
publishedAt: (
|
||||
pageContent.frontMatter.date ||
|
||||
file.lastModifiedDate ||
|
||||
new Date()
|
||||
).toISOString(),
|
||||
slug:
|
||||
pageContent.frontMatter.permalink ||
|
||||
file.name.split(".").slice(0, -1).join("."),
|
||||
tags: tags?.join?.(", ") || tags,
|
||||
title: pageContent.frontMatter.title,
|
||||
},
|
||||
isPost: isPost,
|
||||
})
|
||||
queryClient.invalidateQueries(["getPagesBySite", subdomain])
|
||||
router.push(
|
||||
`/dashboard/${subdomain}/editor?id=local-${id}&type=${
|
||||
isPost ? "post" : "page"
|
||||
}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
reader.onerror = (evt) => {
|
||||
toast.error("Error reading file")
|
||||
}
|
||||
})
|
||||
input.click()
|
||||
}
|
||||
|
||||
const title = isPost ? "Posts" : "Pages"
|
||||
const description = isPost ? (
|
||||
<>
|
||||
|
|
@ -269,66 +350,18 @@ export const PagesManager: React.FC<{
|
|||
</svg>
|
||||
<span>New {isPost ? "Post" : "Page"}</span>
|
||||
</Button>
|
||||
<Button
|
||||
className={clsx(`space-x-2 inline-flex`)}
|
||||
onClick={() => {
|
||||
const input = document.createElement("input")
|
||||
input.type = "file"
|
||||
input.accept = "text/markdown"
|
||||
input.addEventListener("change", async (e: any) => {
|
||||
const file = e.target?.files?.[0]
|
||||
const reader = new FileReader()
|
||||
reader.readAsText(file, "UTF-8")
|
||||
reader.onload = (evt) => {
|
||||
if (evt.target?.result) {
|
||||
const pageContent = renderPageContent(
|
||||
evt.target.result as string,
|
||||
)
|
||||
|
||||
const id = nanoid()
|
||||
const key = `draft-${subdomain}-local-${id}`
|
||||
const tags =
|
||||
pageContent.frontMatter.tags ||
|
||||
pageContent.frontMatter.categories
|
||||
setStorage(key, {
|
||||
date: +new Date(),
|
||||
values: {
|
||||
content: evt.target.result,
|
||||
published: false,
|
||||
publishedAt: (
|
||||
pageContent.frontMatter.date ||
|
||||
file.lastModifiedDate ||
|
||||
new Date()
|
||||
).toISOString(),
|
||||
slug:
|
||||
pageContent.frontMatter.permalink ||
|
||||
file.name.split(".").slice(0, -1).join("."),
|
||||
tags: tags?.join?.(", ") || tags,
|
||||
title: pageContent.frontMatter.title,
|
||||
},
|
||||
isPost: isPost,
|
||||
})
|
||||
queryClient.invalidateQueries([
|
||||
"getPagesBySite",
|
||||
subdomain,
|
||||
])
|
||||
router.push(
|
||||
`/dashboard/${subdomain}/editor?id=local-${id}&type=${
|
||||
isPost ? "post" : "page"
|
||||
}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
reader.onerror = (evt) => {
|
||||
toast.error("Error reading file")
|
||||
}
|
||||
})
|
||||
input.click()
|
||||
}}
|
||||
<Tooltip
|
||||
label="Import markdown file with front matter supported"
|
||||
placement="bottom"
|
||||
>
|
||||
<span className="i-bxs:duplicate inline-block"></span>
|
||||
<span>Import</span>
|
||||
</Button>
|
||||
<Button
|
||||
className={clsx(`space-x-2 inline-flex`)}
|
||||
onClick={importFile}
|
||||
>
|
||||
<span className="i-bxs:duplicate inline-block"></span>
|
||||
<span>Import</span>
|
||||
</Button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-sm text-zinc-500 leading-relaxed">
|
||||
|
|
@ -346,10 +379,16 @@ export const PagesManager: React.FC<{
|
|||
return (
|
||||
<Link key={page.id} href={getPageEditLink(page)}>
|
||||
<a className="group relative hover:bg-zinc-100 rounded-lg py-3 px-3 transition-colors -mx-3 flex justify-between">
|
||||
<div>
|
||||
<div className="flex items-center">
|
||||
<span>{page.title || "Untitled"}</span>
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
{page.title ? (
|
||||
<div className="flex items-center">
|
||||
<span>{page.title}</span>
|
||||
</div>
|
||||
) : (
|
||||
<div className="text-zinc-500 text-xs mt-1 truncate">
|
||||
<span>{page.summary?.content}</span>
|
||||
</div>
|
||||
)}
|
||||
<div className="text-zinc-400 text-xs mt-1">
|
||||
<span className="capitalize">
|
||||
{getPageVisibility(page).toLowerCase()}
|
||||
|
|
|
|||
|
|
@ -63,8 +63,6 @@ export const SiteHome: React.FC<{
|
|||
className="object-cover rounded w-24 h-24"
|
||||
alt="cover"
|
||||
layout="fill"
|
||||
width={96}
|
||||
height={96}
|
||||
src={post.cover}
|
||||
></Image>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -7,9 +7,6 @@ import { Tooltip } from "./Tooltip"
|
|||
export interface EditorToolbarProps {
|
||||
view: EditorView | null
|
||||
toolbars: ICommand[]
|
||||
modeToolbars: ICommand[]
|
||||
previewVisible: boolean
|
||||
setPreviewVisible: Dispatch<SetStateAction<boolean>>
|
||||
}
|
||||
|
||||
enum ToolbarMode {
|
||||
|
|
@ -17,36 +14,21 @@ enum ToolbarMode {
|
|||
Preview,
|
||||
}
|
||||
|
||||
export const EditorToolbar: FC<EditorToolbarProps> = ({
|
||||
view,
|
||||
toolbars,
|
||||
modeToolbars,
|
||||
previewVisible,
|
||||
setPreviewVisible,
|
||||
}) => {
|
||||
export const EditorToolbar: FC<EditorToolbarProps> = ({ view, toolbars }) => {
|
||||
const renderToolbar =
|
||||
(mode: ToolbarMode) =>
|
||||
// eslint-disable-next-line react/display-name
|
||||
({ name, icon, label, execute }: ICommand) => {
|
||||
const isPreviewModeCommand = mode === ToolbarMode.Preview
|
||||
const active = isPreviewModeCommand && previewVisible
|
||||
const disabled = !isPreviewModeCommand && previewVisible
|
||||
return (
|
||||
<Tooltip key={name} label={label} placement="bottom">
|
||||
<button
|
||||
key={name}
|
||||
type="button"
|
||||
disabled={disabled}
|
||||
className={clsx(
|
||||
"w-7 h-7 transition-colors text-lg border border-transparent rounded flex items-center justify-center",
|
||||
active
|
||||
? `text-white bg-accent border-accent`
|
||||
: disabled
|
||||
? `text-zinc-400 cursor-not-allowed`
|
||||
: `text-zinc-400 group-hover:text-zinc-600 hover:text-zinc-500 hover:border-zinc-300 hover:bg-zinc-100`,
|
||||
)}
|
||||
className={
|
||||
"w-7 h-7 transition-colors text-lg border border-transparent rounded flex items-center justify-center text-zinc-400 group-hover:text-zinc-600 hover:text-zinc-500 hover:border-zinc-300 hover:bg-zinc-100"
|
||||
}
|
||||
onClick={() => {
|
||||
view && execute(view, { setPreviewVisible, container: view.dom })
|
||||
view && execute(view, { container: view.dom })
|
||||
}}
|
||||
>
|
||||
<span className={icon}></span>
|
||||
|
|
@ -60,9 +42,6 @@ export const EditorToolbar: FC<EditorToolbarProps> = ({
|
|||
<div className="flex-1 flex space-x-1">
|
||||
{toolbars?.map(renderToolbar(ToolbarMode.Normal))}
|
||||
</div>
|
||||
<div className="ml-1">
|
||||
{modeToolbars?.map(renderToolbar(ToolbarMode.Preview))}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,33 +14,43 @@ export const Image: React.FC<
|
|||
> = ({ layout, className, alt, src, width, height, ...props }) => {
|
||||
src = toIPFS(src)
|
||||
const [paddingTop, setPaddingTop] = React.useState("0")
|
||||
const [autoWidth, setAutoWidth] = React.useState(0)
|
||||
const autoSize = !width && !height && !layout
|
||||
|
||||
return (
|
||||
<span
|
||||
className={clsx(
|
||||
"inline-flex justify-center",
|
||||
autoSize ? "relative w-full h-full" : "",
|
||||
)}
|
||||
style={autoSize ? { paddingTop } : {}}
|
||||
className="inline-block w-full h-full"
|
||||
style={
|
||||
autoSize
|
||||
? {
|
||||
maxWidth: `${autoWidth}px`,
|
||||
}
|
||||
: {}
|
||||
}
|
||||
>
|
||||
<NextImage
|
||||
{...props}
|
||||
src={toGateway(src, {
|
||||
forceFallback: true,
|
||||
})}
|
||||
className={className}
|
||||
alt={alt}
|
||||
width={width}
|
||||
height={height}
|
||||
layout={autoSize ? "fill" : layout}
|
||||
onLoad={({ target }) => {
|
||||
if (autoSize) {
|
||||
const { naturalWidth, naturalHeight } = target as HTMLImageElement
|
||||
setPaddingTop(`calc(100% / (${naturalWidth} / ${naturalHeight})`)
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<span
|
||||
className="inline-flex justify-center relative w-full h-full"
|
||||
style={autoSize ? { paddingTop } : {}}
|
||||
>
|
||||
<NextImage
|
||||
{...props}
|
||||
src={toGateway(src, {
|
||||
forceFallback: true,
|
||||
})}
|
||||
className={className}
|
||||
alt={alt}
|
||||
width={width}
|
||||
height={height}
|
||||
layout={autoSize ? "fill" : layout}
|
||||
onLoad={({ target }) => {
|
||||
if (autoSize) {
|
||||
const { naturalWidth, naturalHeight } = target as HTMLImageElement
|
||||
setPaddingTop(`calc(100% / (${naturalWidth} / ${naturalHeight})`)
|
||||
setAutoWidth(naturalWidth)
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</span>
|
||||
</span>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
import { ICommand } from "."
|
||||
|
||||
export const Preview: ICommand = {
|
||||
name: "preview",
|
||||
label: "Toggle Preview",
|
||||
icon: "i-bi:eye",
|
||||
execute: (_, options) => {
|
||||
options?.setPreviewVisible?.((visible) => !visible)
|
||||
},
|
||||
}
|
||||
|
|
@ -11,7 +11,6 @@ import { Italic } from "./Italic"
|
|||
import { Link } from "./Link"
|
||||
import { ListOrdered } from "./ListOrdered"
|
||||
import { ListUnordered } from "./ListUnordered"
|
||||
import { Preview } from "./Preview"
|
||||
import { Quote } from "./Quote"
|
||||
import { Strikethrough } from "./Strikethrough"
|
||||
import { Underline } from "./Underline"
|
||||
|
|
@ -131,5 +130,3 @@ export const toolbars: ICommand[] = [
|
|||
Image,
|
||||
UploadImage,
|
||||
]
|
||||
|
||||
export const modeToolbars: ICommand[] = [Preview]
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ export enum PageVisibilityEnum {
|
|||
Published = "published",
|
||||
Scheduled = "scheduled",
|
||||
Draft = "draft",
|
||||
Crossbell = "crossbell",
|
||||
}
|
||||
|
||||
export type PostOnSiteHome = {
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ export async function createOrUpdatePage(input: {
|
|||
/** Only needed when creating page */
|
||||
isPost?: boolean
|
||||
externalUrl?: string
|
||||
applications?: string[]
|
||||
}) {
|
||||
if (!input.published) {
|
||||
return await unidata.notes.set(
|
||||
|
|
@ -78,7 +79,10 @@ export async function createOrUpdatePage(input: {
|
|||
.map((tag) => tag.trim())
|
||||
.filter((tag) => tag) || []),
|
||||
],
|
||||
applications: ["xlog"],
|
||||
applications: [
|
||||
"xlog",
|
||||
...(input.applications?.filter((app) => app !== "xlog") || []),
|
||||
],
|
||||
...(input.slug && {
|
||||
attributes: [
|
||||
{
|
||||
|
|
@ -176,6 +180,7 @@ export async function getPagesBySite(input: {
|
|||
}
|
||||
|
||||
const visibility = input.visibility || PageVisibilityEnum.All
|
||||
const crossbell = visibility === PageVisibilityEnum.Crossbell
|
||||
|
||||
const options = {
|
||||
source: "Crossbell Note",
|
||||
|
|
@ -183,8 +188,8 @@ export async function getPagesBySite(input: {
|
|||
platform: "Crossbell",
|
||||
limit: input.take || 1000,
|
||||
filter: {
|
||||
tags: [...(input.tags || []), input.type],
|
||||
applications: ["xlog"],
|
||||
tags: [...(input.tags || []), ...(crossbell ? [] : [input.type])],
|
||||
applications: [...(crossbell ? [] : ["xlog"])],
|
||||
},
|
||||
cursor: "",
|
||||
}
|
||||
|
|
@ -206,12 +211,14 @@ export async function getPagesBySite(input: {
|
|||
cursor = res.cursor
|
||||
} while (cursor)
|
||||
|
||||
const local = getLocalPages({
|
||||
site: input.site,
|
||||
isPost: input.type === "post",
|
||||
})
|
||||
pages.list = pages.list.concat(local)
|
||||
pages.total += local.length
|
||||
if (!crossbell) {
|
||||
const local = getLocalPages({
|
||||
site: input.site,
|
||||
isPost: input.type === "post",
|
||||
})
|
||||
pages.list = pages.list.concat(local)
|
||||
pages.total += local.length
|
||||
}
|
||||
|
||||
if (pages?.list) {
|
||||
switch (visibility) {
|
||||
|
|
@ -229,6 +236,11 @@ export async function getPagesBySite(input: {
|
|||
(page) => +new Date(page.date_published) > +new Date(),
|
||||
)
|
||||
break
|
||||
case PageVisibilityEnum.Crossbell:
|
||||
pages.list = pages.list.filter(
|
||||
(page) => !page.applications?.includes("xlog"),
|
||||
)
|
||||
break
|
||||
}
|
||||
pages.list = pages.list
|
||||
.filter(
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import dayjs from "dayjs"
|
|||
import { useRouter } from "next/router"
|
||||
import { ChangeEvent, useCallback, useEffect, useMemo, useState } from "react"
|
||||
import toast from "react-hot-toast"
|
||||
import { modeToolbars, toolbars } from "~/editor"
|
||||
import { toolbars } from "~/editor"
|
||||
import { DashboardLayout } from "~/components/dashboard/DashboardLayout"
|
||||
import { DashboardMain } from "~/components/dashboard/DashboardMain"
|
||||
import { PublishButton } from "~/components/dashboard/PublishButton"
|
||||
|
|
@ -23,6 +23,7 @@ import { getStorage, setStorage, delStorage } from "~/lib/storage"
|
|||
import { nanoid } from "nanoid"
|
||||
import { useQueryClient } from "@tanstack/react-query"
|
||||
import { PageContent } from "~/components/common/PageContent"
|
||||
import pinyin from "pinyin"
|
||||
|
||||
const getInputDatetimeValue = (date: Date | string) => {
|
||||
const str = dayjs(date).format()
|
||||
|
|
@ -75,13 +76,24 @@ export default function SubdomainEditor() {
|
|||
content: "",
|
||||
})
|
||||
const [content, setContent] = useState("")
|
||||
|
||||
const [previewVisible, setPreviewVisible] = useState(false)
|
||||
const [defaultSlug, setDefaultSlug] = useState("")
|
||||
|
||||
type Values = typeof values
|
||||
|
||||
const updateValue = useCallback(
|
||||
<K extends keyof Values>(key: K, value: Values[K]) => {
|
||||
if (key === "title") {
|
||||
setDefaultSlug(
|
||||
pinyin(value as string, {
|
||||
style: pinyin.STYLE_NORMAL,
|
||||
compact: true,
|
||||
})?.[0]
|
||||
?.map((word) => word.trim())
|
||||
?.filter((word) => word)
|
||||
?.join("-")
|
||||
?.replace(/\s+/g, "-") || "",
|
||||
)
|
||||
}
|
||||
const newValues = { ...values, [key]: value }
|
||||
if (draftKey) {
|
||||
setStorage(draftKey, {
|
||||
|
|
@ -101,15 +113,17 @@ export default function SubdomainEditor() {
|
|||
const savePage = (published: boolean) => {
|
||||
createOrUpdatePage.mutate({
|
||||
...values,
|
||||
slug: values.slug || defaultSlug,
|
||||
siteId: subdomain,
|
||||
...(visibility === PageVisibilityEnum.Draft ? {} : { pageId: pageId }),
|
||||
isPost: isPost,
|
||||
published,
|
||||
externalUrl:
|
||||
values.slug &&
|
||||
(values.slug || defaultSlug) &&
|
||||
`${getSiteLink({ subdomain, domain: site.data?.custom_domain })}/${
|
||||
values.slug
|
||||
values.slug || defaultSlug
|
||||
}`,
|
||||
applications: page.data?.applications,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -210,13 +224,7 @@ export default function SubdomainEditor() {
|
|||
<DashboardLayout title="Editor">
|
||||
<DashboardMain fullWidth>
|
||||
<header className="flex justify-between absolute top-0 left-0 right-0 z-10 px-5 h-14 border-b items-center text-sm">
|
||||
<EditorToolbar
|
||||
view={view}
|
||||
toolbars={toolbars}
|
||||
modeToolbars={modeToolbars}
|
||||
previewVisible={previewVisible}
|
||||
setPreviewVisible={setPreviewVisible}
|
||||
></EditorToolbar>
|
||||
<EditorToolbar view={view} toolbars={toolbars}></EditorToolbar>
|
||||
<div className="flex items-center space-x-3">
|
||||
<span
|
||||
className={clsx(
|
||||
|
|
@ -293,7 +301,7 @@ export default function SubdomainEditor() {
|
|||
<div>
|
||||
<Input
|
||||
name="slug"
|
||||
value={values.slug}
|
||||
value={values.slug || defaultSlug}
|
||||
label="Page slug"
|
||||
id="slug"
|
||||
isBlock
|
||||
|
|
@ -302,14 +310,14 @@ export default function SubdomainEditor() {
|
|||
}
|
||||
help={
|
||||
<>
|
||||
{values.slug && (
|
||||
{(values.slug || defaultSlug) && (
|
||||
<>
|
||||
This {isPost ? "post" : "page"} will be accessible at{" "}
|
||||
<UniLink
|
||||
href={`${getSiteLink({
|
||||
subdomain,
|
||||
domain: site.data?.custom_domain,
|
||||
})}/${values.slug}`}
|
||||
})}/${values.slug || defaultSlug}`}
|
||||
className="hover:underline"
|
||||
>
|
||||
{getSiteLink({
|
||||
|
|
@ -317,7 +325,7 @@ export default function SubdomainEditor() {
|
|||
domain: site.data?.custom_domain,
|
||||
noProtocol: true,
|
||||
})}
|
||||
/{values.slug}
|
||||
/{values.slug || defaultSlug}
|
||||
</UniLink>
|
||||
</>
|
||||
)}
|
||||
|
|
|
|||
Loading…
Reference in New Issue