collaborative editing (hocuspocus), lib updates, fixes
This commit is contained in:
parent
cb8d3f0f0b
commit
9583ccdc81
|
@ -1,4 +1,4 @@
|
|||
import { renderPage } from 'vite-plugin-ssr'
|
||||
import { renderPage } from 'vite-plugin-ssr/server'
|
||||
|
||||
export default async function handler(req, res) {
|
||||
const { url, cookies } = req
|
||||
|
|
5599
package-lock.json
generated
5599
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
302
package.json
302
package.json
|
@ -29,155 +29,161 @@
|
|||
"typecheck:watch": "tsc --noEmit --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/abort-controller": "^3.272.0",
|
||||
"@aws-sdk/client-s3": "^3.282.0",
|
||||
"@aws-sdk/lib-storage": "^3.282.0",
|
||||
"@hocuspocus/provider": "^1.1.3",
|
||||
"formidable": "^2.1.1",
|
||||
"i18next": "^22.4.11",
|
||||
"mailgun.js": "^8.2.1",
|
||||
"node-fetch": "^3.3.1"
|
||||
"@aws-sdk/abort-controller": "3.303.0",
|
||||
"@aws-sdk/client-s3": "3.303.0",
|
||||
"@aws-sdk/lib-storage": "3.303.0",
|
||||
"@hocuspocus/provider": "2.0.1",
|
||||
"formidable": "2.1.1",
|
||||
"i18next": "22.4.13",
|
||||
"mailgun.js": "8.2.1",
|
||||
"node-fetch": "3.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.21.0",
|
||||
"@graphql-codegen/cli": "^3.2.2",
|
||||
"@graphql-codegen/typescript": "^3.0.2",
|
||||
"@graphql-codegen/typescript-operations": "^3.0.2",
|
||||
"@graphql-codegen/typescript-urql": "^3.7.3",
|
||||
"@graphql-codegen/urql-introspection": "^2.2.1",
|
||||
"@graphql-tools/url-loader": "^7.17.14",
|
||||
"@graphql-typed-document-node/core": "^3.1.2",
|
||||
"@nanostores/router": "^0.8.2",
|
||||
"@nanostores/solid": "^0.3.2",
|
||||
"@popperjs/core": "^2.11.6",
|
||||
"@solid-primitives/memo": "^1.2.0",
|
||||
"@solid-primitives/share": "^2.0.3",
|
||||
"@solid-primitives/storage": "^1.3.7",
|
||||
"@solid-primitives/upload": "^0.0.109",
|
||||
"@solidjs/meta": "^0.28.2",
|
||||
"@thisbeyond/solid-select": "^0.13.0",
|
||||
"@tiptap/core": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-blockquote": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-bold": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-bubble-menu": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-bullet-list": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-character-count": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-collaboration": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-collaboration-cursor": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-document": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-dropcursor": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-floating-menu": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-focus": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-gapcursor": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-hard-break": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-heading": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-highlight": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-history": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-horizontal-rule": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-image": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-italic": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-link": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-list-item": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-ordered-list": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-paragraph": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-placeholder": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-strike": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-text": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-underline": "^2.0.0-beta.220",
|
||||
"@tiptap/extension-youtube": "^2.0.0-beta.220",
|
||||
"@types/express": "^4.17.15",
|
||||
"@types/node": "^18.14.6",
|
||||
"@types/uuid": "^9.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.54.1",
|
||||
"@typescript-eslint/parser": "^5.54.1",
|
||||
"@urql/core": "^3.1.1",
|
||||
"@urql/devtools": "^2.0.3",
|
||||
"@urql/exchange-graphcache": "^5.0.9",
|
||||
"babel-preset-solid": "^1.6.12",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"bootstrap": "^5.2.3",
|
||||
"clsx": "^1.2.1",
|
||||
"cookie": "^0.5.0",
|
||||
"cookie-signature": "^1.2.1",
|
||||
"cosmiconfig-toml-loader": "^1.0.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"eslint": "^8.35.0",
|
||||
"eslint-config-stylelint": "^18.0.0",
|
||||
"eslint-import-resolver-typescript": "^3.5.3",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||
"eslint-plugin-promise": "^6.1.1",
|
||||
"eslint-plugin-solid": "^0.11.0",
|
||||
"eslint-plugin-sonarjs": "^0.18.0",
|
||||
"eslint-plugin-unicorn": "^46.0.0",
|
||||
"graphql": "^16.6.0",
|
||||
"graphql-tag": "^2.12.6",
|
||||
"graphql-ws": "^5.12.0",
|
||||
"hast-util-select": "^5.0.4",
|
||||
"husky": "^8.0.3",
|
||||
"hygen": "^6.2.11",
|
||||
"i18next-http-backend": "^2.1.1",
|
||||
"idb": "^7.1.1",
|
||||
"install": "^0.13.0",
|
||||
"jest": "^29.5.0",
|
||||
"js-cookie": "^3.0.1",
|
||||
"lint-staged": "^13.1.2",
|
||||
"loglevel": "^1.8.1",
|
||||
"loglevel-plugin-prefix": "^0.8.4",
|
||||
"markdown-it": "^13.0.1",
|
||||
"markdown-it-container": "^3.0.0",
|
||||
"markdown-it-implicit-figures": "^0.11.0",
|
||||
"markdown-it-mark": "^3.0.1",
|
||||
"markdown-it-replace-link": "^1.1.0",
|
||||
"nanostores": "^0.7.4",
|
||||
"npm": "^9.6.0",
|
||||
"orderedmap": "^2.1.0",
|
||||
"prettier": "^2.7.1",
|
||||
"prettier-eslint": "^15.0.1",
|
||||
"prosemirror-commands": "^1.5.1",
|
||||
"prosemirror-dropcursor": "^1.7.1",
|
||||
"prosemirror-example-setup": "^1.2.1",
|
||||
"prosemirror-gapcursor": "^1.3.1",
|
||||
"prosemirror-history": "^1.3.0",
|
||||
"prosemirror-inputrules": "^1.2.0",
|
||||
"prosemirror-keymap": "^1.2.1",
|
||||
"prosemirror-markdown": "^1.10.1",
|
||||
"prosemirror-menu": "^1.2.1",
|
||||
"prosemirror-model": "^1.19.0",
|
||||
"prosemirror-schema-list": "^1.2.2",
|
||||
"prosemirror-state": "^1.4.2",
|
||||
"prosemirror-view": "^1.30.0",
|
||||
"rollup": "^3.18.0",
|
||||
"rollup-plugin-visualizer": "^5.9.0",
|
||||
"sass": "^1.58.3",
|
||||
"solid-js": "^1.6.12",
|
||||
"solid-tiptap": "^0.5.1",
|
||||
"solid-transition-group": "^0.0.13",
|
||||
"sort-package-json": "^2.3.0",
|
||||
"stylelint": "^15.2.0",
|
||||
"stylelint-config-css-modules": "^4.1.0",
|
||||
"stylelint-config-prettier-scss": "^0.0.1",
|
||||
"stylelint-config-standard-scss": "^7.0.1",
|
||||
"stylelint-order": "^6.0.3",
|
||||
"stylelint-scss": "^4.4.0",
|
||||
"swiper": "^8.4.7",
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^4.9.4",
|
||||
"undici": "^5.20.0",
|
||||
"uniqolor": "^1.1.0",
|
||||
"unique-names-generator": "^4.7.1",
|
||||
"uuid": "^9.0.0",
|
||||
"vite": "^4.1.4",
|
||||
"vite-plugin-sass-dts": "^1.2.16",
|
||||
"vite-plugin-solid": "^2.6.1",
|
||||
"vite-plugin-ssr": "^0.4.91",
|
||||
"wonka": "^6.2.3",
|
||||
"ws": "^8.12.1",
|
||||
"y-indexeddb": "^9.0.9",
|
||||
"y-prosemirror": "^1.0.20",
|
||||
"y-protocols": "^1.0.5",
|
||||
"y-webrtc": "^10.2.4",
|
||||
"y-websocket": "^1.5.0",
|
||||
"yjs": "^13.5.51"
|
||||
"@babel/core": "7.21.3",
|
||||
"@graphql-codegen/cli": "3.2.2",
|
||||
"@graphql-codegen/typescript": "3.0.2",
|
||||
"@graphql-codegen/typescript-operations": "3.0.2",
|
||||
"@graphql-codegen/typescript-urql": "3.7.3",
|
||||
"@graphql-codegen/urql-introspection": "2.2.1",
|
||||
"@graphql-tools/url-loader": "7.17.14",
|
||||
"@graphql-typed-document-node/core": "3.2.0",
|
||||
"@nanostores/router": "0.8.3",
|
||||
"@nanostores/solid": "0.3.2",
|
||||
"@popperjs/core": "2.11.7",
|
||||
"@solid-primitives/memo": "1.2.3",
|
||||
"@solid-primitives/share": "2.0.4",
|
||||
"@solid-primitives/storage": "1.3.8",
|
||||
"@solid-primitives/upload": "0.0.110",
|
||||
"@solidjs/meta": "0.28.2",
|
||||
"@thisbeyond/solid-select": "0.13.0",
|
||||
"@tiptap/core": "2.0.1",
|
||||
"@tiptap/extension-blockquote": "2.0.1",
|
||||
"@tiptap/extension-bold": "2.0.1",
|
||||
"@tiptap/extension-bubble-menu": "2.0.1",
|
||||
"@tiptap/extension-bullet-list": "2.0.1",
|
||||
"@tiptap/extension-character-count": "2.0.1",
|
||||
"@tiptap/extension-collaboration": "2.0.1",
|
||||
"@tiptap/extension-collaboration-cursor": "2.0.1",
|
||||
"@tiptap/extension-document": "2.0.1",
|
||||
"@tiptap/extension-dropcursor": "2.0.1",
|
||||
"@tiptap/extension-floating-menu": "2.0.1",
|
||||
"@tiptap/extension-focus": "2.0.1",
|
||||
"@tiptap/extension-gapcursor": "2.0.1",
|
||||
"@tiptap/extension-hard-break": "2.0.1",
|
||||
"@tiptap/extension-heading": "2.0.1",
|
||||
"@tiptap/extension-highlight": "2.0.1",
|
||||
"@tiptap/extension-history": "2.0.1",
|
||||
"@tiptap/extension-horizontal-rule": "2.0.1",
|
||||
"@tiptap/extension-image": "2.0.1",
|
||||
"@tiptap/extension-italic": "2.0.1",
|
||||
"@tiptap/extension-link": "2.0.1",
|
||||
"@tiptap/extension-list-item": "2.0.1",
|
||||
"@tiptap/extension-ordered-list": "2.0.1",
|
||||
"@tiptap/extension-paragraph": "2.0.1",
|
||||
"@tiptap/extension-placeholder": "2.0.1",
|
||||
"@tiptap/extension-strike": "2.0.1",
|
||||
"@tiptap/extension-text": "2.0.1",
|
||||
"@tiptap/extension-underline": "2.0.1",
|
||||
"@tiptap/extension-youtube": "2.0.1",
|
||||
"@types/express": "4.17.17",
|
||||
"@types/node": "18.15.11",
|
||||
"@types/uuid": "9.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "5.57.0",
|
||||
"@typescript-eslint/parser": "5.57.0",
|
||||
"@urql/core": "3.2.2",
|
||||
"@urql/devtools": "2.0.3",
|
||||
"@urql/exchange-graphcache": "5.2.0",
|
||||
"babel-preset-solid": "1.7.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"bootstrap": "5.2.3",
|
||||
"clsx": "1.2.1",
|
||||
"cookie": "0.5.0",
|
||||
"cookie-signature": "1.2.1",
|
||||
"cosmiconfig-toml-loader": "1.0.0",
|
||||
"cross-env": "7.0.3",
|
||||
"eslint": "8.37.0",
|
||||
"eslint-config-stylelint": "18.0.0",
|
||||
"eslint-import-resolver-typescript": "3.5.4",
|
||||
"eslint-plugin-import": "2.27.5",
|
||||
"eslint-plugin-jsx-a11y": "6.7.1",
|
||||
"eslint-plugin-promise": "6.1.1",
|
||||
"eslint-plugin-solid": "0.12.0",
|
||||
"eslint-plugin-sonarjs": "0.19.0",
|
||||
"eslint-plugin-unicorn": "46.0.0",
|
||||
"graphql": "16.6.0",
|
||||
"graphql-tag": "2.12.6",
|
||||
"graphql-ws": "5.12.0",
|
||||
"hast-util-select": "5.0.5",
|
||||
"husky": "8.0.3",
|
||||
"hygen": "6.2.11",
|
||||
"i18next-http-backend": "2.2.0",
|
||||
"idb": "7.1.1",
|
||||
"install": "0.13.0",
|
||||
"jest": "29.5.0",
|
||||
"js-cookie": "3.0.1",
|
||||
"lint-staged": "13.2.0",
|
||||
"loglevel": "1.8.1",
|
||||
"loglevel-plugin-prefix": "0.8.4",
|
||||
"markdown-it": "13.0.1",
|
||||
"markdown-it-container": "3.0.0",
|
||||
"markdown-it-implicit-figures": "0.11.0",
|
||||
"markdown-it-mark": "3.0.1",
|
||||
"markdown-it-replace-link": "1.2.0",
|
||||
"nanostores": "0.7.4",
|
||||
"npm": "9.6.3",
|
||||
"orderedmap": "2.1.0",
|
||||
"prettier": "2.8.7",
|
||||
"prettier-eslint": "15.0.1",
|
||||
"prosemirror-commands": "1.5.1",
|
||||
"prosemirror-dropcursor": "1.8.0",
|
||||
"prosemirror-example-setup": "1.2.1",
|
||||
"prosemirror-gapcursor": "1.3.1",
|
||||
"prosemirror-history": "1.3.0",
|
||||
"prosemirror-inputrules": "1.2.0",
|
||||
"prosemirror-keymap": "1.2.1",
|
||||
"prosemirror-markdown": "1.10.1",
|
||||
"prosemirror-menu": "1.2.1",
|
||||
"prosemirror-model": "1.19.0",
|
||||
"prosemirror-schema-list": "1.2.2",
|
||||
"prosemirror-state": "1.4.2",
|
||||
"prosemirror-view": "1.30.2",
|
||||
"rollup": "3.20.2",
|
||||
"rollup-plugin-visualizer": "5.9.0",
|
||||
"sass": "1.60.0",
|
||||
"solid-js": "1.7.0",
|
||||
"solid-tiptap": "0.5.1",
|
||||
"solid-transition-group": "0.2.2",
|
||||
"sort-package-json": "2.4.1",
|
||||
"stylelint": "15.3.0",
|
||||
"stylelint-config-standard-scss": "7.0.1",
|
||||
"stylelint-order": "6.0.3",
|
||||
"stylelint-scss": "4.6.0",
|
||||
"swiper": "8.4.7",
|
||||
"ts-node": "10.9.1",
|
||||
"typescript": "5.0.3",
|
||||
"undici": "5.21.0",
|
||||
"uniqolor": "1.1.0",
|
||||
"unique-names-generator": "4.7.1",
|
||||
"uuid": "9.0.0",
|
||||
"vite": "4.2.1",
|
||||
"vite-plugin-sass-dts": "1.3.2",
|
||||
"vite-plugin-solid": "2.6.1",
|
||||
"vite-plugin-ssr": "0.4.108",
|
||||
"wonka": "6.3.1",
|
||||
"ws": "8.13.0",
|
||||
"y-indexeddb": "9.0.10",
|
||||
"y-prosemirror": "1.2.0",
|
||||
"y-protocols": "1.0.5",
|
||||
"y-webrtc": "10.2.5",
|
||||
"y-websocket": "1.5.0",
|
||||
"yjs": "13.5.51"
|
||||
},
|
||||
"overrides": {
|
||||
"@tiptap/extension-collaboration": {
|
||||
"y-prosemirror": "1.2.0"
|
||||
},
|
||||
"@tiptap/extension-collaboration-cursor": {
|
||||
"y-prosemirror": "1.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -132,11 +132,11 @@ export const Comment = (props: Props) => {
|
|||
</Show>
|
||||
|
||||
<div class={styles.commentDates}>
|
||||
<div class={styles.date}>{formattedDate(comment()?.createdAt)}</div>
|
||||
<div class={styles.date}>{formattedDate(comment()?.createdAt)()}</div>
|
||||
<Show when={comment()?.updatedAt}>
|
||||
<div class={styles.date}>
|
||||
<Icon name="edit" class={styles.icon} />
|
||||
{t('Edited')} {formattedDate(comment()?.updatedAt)}
|
||||
{t('Edited')} {formattedDate(comment()?.updatedAt)()}
|
||||
</div>
|
||||
</Show>
|
||||
</div>
|
||||
|
|
|
@ -54,18 +54,20 @@ export const Editor = (props: EditorProps) => {
|
|||
const { user } = useSession()
|
||||
|
||||
const docName = `shout-${props.shoutId}`
|
||||
if (!persisters[docName]) {
|
||||
persisters[docName] = new IndexeddbPersistence(docName, yDoc)
|
||||
}
|
||||
|
||||
if (!providers[docName]) {
|
||||
providers[docName] = new HocuspocusProvider({
|
||||
url: 'wss://hocuspocus.discours.io',
|
||||
// url: 'wss://hocuspocus.discours.io',
|
||||
url: 'ws://localhost:4242',
|
||||
name: docName,
|
||||
document: yDoc
|
||||
})
|
||||
}
|
||||
|
||||
if (!persisters[docName]) {
|
||||
persisters[docName] = new IndexeddbPersistence(docName, yDoc)
|
||||
}
|
||||
|
||||
const editorElRef: {
|
||||
current: HTMLDivElement
|
||||
} = {
|
||||
|
|
|
@ -31,9 +31,9 @@ const getById = (letter: string) =>
|
|||
colors[Math.abs(Number(BigInt(letter.toLowerCase().codePointAt(0) - 97) % BigInt(colors.length)))]
|
||||
|
||||
const DialogAvatar = (props: Props) => {
|
||||
const nameFirstLetter = props.name.slice(0, 1)
|
||||
const nameFirstLetter = createMemo(() => props.name.slice(0, 1))
|
||||
const randomBg = createMemo(() => {
|
||||
return getById(nameFirstLetter)
|
||||
return getById(nameFirstLetter())
|
||||
})
|
||||
|
||||
return (
|
||||
|
@ -45,7 +45,7 @@ const DialogAvatar = (props: Props) => {
|
|||
})}
|
||||
style={{ 'background-color': `${randomBg()}` }}
|
||||
>
|
||||
<Show when={props.url} fallback={() => <div class={styles.letter}>{nameFirstLetter}</div>}>
|
||||
<Show when={Boolean(props.url)} fallback={<div class={styles.letter}>{nameFirstLetter()}</div>}>
|
||||
<div class={styles.imageHolder} style={{ 'background-image': `url(${props.url})` }} />
|
||||
</Show>
|
||||
</div>
|
||||
|
|
|
@ -61,7 +61,7 @@ const DialogCard = (props: DialogProps) => {
|
|||
<Show when={!props.isChatHeader}>
|
||||
<div class={styles.activity}>
|
||||
<Show when={props.lastUpdate}>
|
||||
<div class={styles.time}>{formattedTime(props.lastUpdate * 1000)}</div>
|
||||
<div class={styles.time}>{formattedTime(props.lastUpdate * 1000)()}</div>
|
||||
</Show>
|
||||
<Show when={props.counter > 0}>
|
||||
<div class={styles.counter}>
|
||||
|
|
|
@ -53,7 +53,7 @@ export const Message = (props: Props) => {
|
|||
<div innerHTML={md.render(props.content.body)} />
|
||||
</div>
|
||||
</div>
|
||||
<div class={styles.time}>{formattedTime(props.content.createdAt * 1000)}</div>
|
||||
<div class={styles.time}>{formattedTime(props.content.createdAt * 1000)()}</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { generateHydrationScript, renderToString } from 'solid-js/web'
|
||||
import { escapeInject, dangerouslySkipEscape } from 'vite-plugin-ssr'
|
||||
import { escapeInject, dangerouslySkipEscape } from 'vite-plugin-ssr/server'
|
||||
import { App } from '../components/App'
|
||||
import { initRouter } from '../stores/router'
|
||||
import type { PageContext } from './types'
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import { createMemo } from 'solid-js'
|
||||
import { Accessor, createMemo } from 'solid-js'
|
||||
import { useLocalize } from '../context/localize'
|
||||
|
||||
// unix timestamp in seconds
|
||||
const formattedTime = (time: number) => {
|
||||
const formattedTime = (time: number): Accessor<string> => {
|
||||
// FIXME: maybe it's better to move it from here
|
||||
const { lang } = useLocalize()
|
||||
|
||||
return createMemo<string>(() => {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"importsNotUsedAsValues": "error",
|
||||
// Solid specific settings
|
||||
"jsx": "preserve",
|
||||
"jsxImportSource": "solid-js",
|
||||
|
|
Loading…
Reference in New Issue
Block a user