add mention to composer

This commit is contained in:
Ren Amamiya 2023-07-21 18:07:17 +07:00
parent 64cd17389d
commit 17d2a8cb56
11 changed files with 250 additions and 183 deletions

View File

@ -21,10 +21,11 @@
"@nostr-fetch/adapter-ndk": "^0.11.0",
"@radix-ui/react-popover": "^1.0.6",
"@radix-ui/react-tooltip": "^1.0.6",
"@tanstack/react-query": "^4.29.25",
"@tanstack/react-query-devtools": "^4.29.25",
"@tanstack/react-query": "^4.30.0",
"@tanstack/react-query-devtools": "^4.30.0",
"@tanstack/react-virtual": "3.0.0-beta.54",
"@tauri-apps/api": "^1.4.0",
"@tiptap/extension-image": "^2.0.4",
"@tiptap/extension-mention": "^2.0.4",
"@tiptap/extension-placeholder": "^2.0.4",
"@tiptap/pm": "^2.0.4",
@ -60,7 +61,7 @@
"devDependencies": {
"@tailwindcss/typography": "^0.5.9",
"@tauri-apps/cli": "^1.4.0",
"@trivago/prettier-plugin-sort-imports": "^4.1.1",
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
"@types/node": "^18.16.19",
"@types/react": "^18.2.15",
"@types/react-dom": "^18.2.7",
@ -75,7 +76,7 @@
"eslint": "^8.45.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.32.2",
"eslint-plugin-react": "^7.33.0",
"eslint-plugin-simple-import-sort": "^10.0.0",
"husky": "^8.0.3",
"lint-staged": "^13.2.3",
@ -85,7 +86,7 @@
"prop-types": "^15.8.1",
"tailwindcss": "^3.3.3",
"typescript": "^4.9.5",
"vite": "^4.4.4",
"vite": "^4.4.6",
"vite-plugin-top-level-await": "^1.3.1",
"vite-tsconfig-paths": "^4.2.0"
}

View File

@ -17,17 +17,20 @@ dependencies:
specifier: ^1.0.6
version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0)
'@tanstack/react-query':
specifier: ^4.29.25
version: 4.29.25(react-dom@18.2.0)(react@18.2.0)
specifier: ^4.30.0
version: 4.30.0(react-dom@18.2.0)(react@18.2.0)
'@tanstack/react-query-devtools':
specifier: ^4.29.25
version: 4.29.25(@tanstack/react-query@4.29.25)(react-dom@18.2.0)(react@18.2.0)
specifier: ^4.30.0
version: 4.30.0(@tanstack/react-query@4.30.0)(react-dom@18.2.0)(react@18.2.0)
'@tanstack/react-virtual':
specifier: 3.0.0-beta.54
version: 3.0.0-beta.54(react@18.2.0)
'@tauri-apps/api':
specifier: ^1.4.0
version: 1.4.0
'@tiptap/extension-image':
specifier: ^2.0.4
version: 2.0.4(@tiptap/core@2.0.4)
'@tiptap/extension-mention':
specifier: ^2.0.4
version: 2.0.4(@tiptap/core@2.0.4)(@tiptap/pm@2.0.4)(@tiptap/suggestion@2.0.4)
@ -130,8 +133,8 @@ devDependencies:
specifier: ^1.4.0
version: 1.4.0
'@trivago/prettier-plugin-sort-imports':
specifier: ^4.1.1
version: 4.1.1(prettier@2.8.8)
specifier: ^4.2.0
version: 4.2.0(prettier@2.8.8)
'@types/node':
specifier: ^18.16.19
version: 18.16.19
@ -152,7 +155,7 @@ devDependencies:
version: 5.62.0(eslint@8.45.0)(typescript@4.9.5)
'@vitejs/plugin-react-swc':
specifier: ^3.3.2
version: 3.3.2(vite@4.4.4)
version: 3.3.2(vite@4.4.6)
autoprefixer:
specifier: ^10.4.14
version: 10.4.14(postcss@8.4.26)
@ -175,8 +178,8 @@ devDependencies:
specifier: ^6.7.1
version: 6.7.1(eslint@8.45.0)
eslint-plugin-react:
specifier: ^7.32.2
version: 7.32.2(eslint@8.45.0)
specifier: ^7.33.0
version: 7.33.0(eslint@8.45.0)
eslint-plugin-simple-import-sort:
specifier: ^10.0.0
version: 10.0.0(eslint@8.45.0)
@ -194,7 +197,7 @@ devDependencies:
version: 2.8.8
prettier-plugin-tailwindcss:
specifier: ^0.3.0
version: 0.3.0(@trivago/prettier-plugin-sort-imports@4.1.1)(prettier@2.8.8)
version: 0.3.0(@trivago/prettier-plugin-sort-imports@4.2.0)(prettier@2.8.8)
prop-types:
specifier: ^15.8.1
version: 15.8.1
@ -205,14 +208,14 @@ devDependencies:
specifier: ^4.9.5
version: 4.9.5
vite:
specifier: ^4.4.4
version: 4.4.4(@types/node@18.16.19)
specifier: ^4.4.6
version: 4.4.6(@types/node@18.16.19)
vite-plugin-top-level-await:
specifier: ^1.3.1
version: 1.3.1(vite@4.4.4)
version: 1.3.1(vite@4.4.6)
vite-tsconfig-paths:
specifier: ^4.2.0
version: 4.2.0(typescript@4.9.5)(vite@4.4.4)
version: 4.2.0(typescript@4.9.5)(vite@4.4.6)
packages:
@ -523,8 +526,8 @@ packages:
dev: false
optional: true
/@esbuild/android-arm64@0.18.14:
resolution: {integrity: sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg==}
/@esbuild/android-arm64@0.18.15:
resolution: {integrity: sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
@ -541,8 +544,8 @@ packages:
dev: false
optional: true
/@esbuild/android-arm@0.18.14:
resolution: {integrity: sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg==}
/@esbuild/android-arm@0.18.15:
resolution: {integrity: sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
@ -559,8 +562,8 @@ packages:
dev: false
optional: true
/@esbuild/android-x64@0.18.14:
resolution: {integrity: sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg==}
/@esbuild/android-x64@0.18.15:
resolution: {integrity: sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
@ -577,8 +580,8 @@ packages:
dev: false
optional: true
/@esbuild/darwin-arm64@0.18.14:
resolution: {integrity: sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q==}
/@esbuild/darwin-arm64@0.18.15:
resolution: {integrity: sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
@ -595,8 +598,8 @@ packages:
dev: false
optional: true
/@esbuild/darwin-x64@0.18.14:
resolution: {integrity: sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ==}
/@esbuild/darwin-x64@0.18.15:
resolution: {integrity: sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
@ -613,8 +616,8 @@ packages:
dev: false
optional: true
/@esbuild/freebsd-arm64@0.18.14:
resolution: {integrity: sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw==}
/@esbuild/freebsd-arm64@0.18.15:
resolution: {integrity: sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
@ -631,8 +634,8 @@ packages:
dev: false
optional: true
/@esbuild/freebsd-x64@0.18.14:
resolution: {integrity: sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ==}
/@esbuild/freebsd-x64@0.18.15:
resolution: {integrity: sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
@ -649,8 +652,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-arm64@0.18.14:
resolution: {integrity: sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w==}
/@esbuild/linux-arm64@0.18.15:
resolution: {integrity: sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
@ -667,8 +670,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-arm@0.18.14:
resolution: {integrity: sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg==}
/@esbuild/linux-arm@0.18.15:
resolution: {integrity: sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
@ -685,8 +688,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-ia32@0.18.14:
resolution: {integrity: sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ==}
/@esbuild/linux-ia32@0.18.15:
resolution: {integrity: sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
@ -703,8 +706,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-loong64@0.18.14:
resolution: {integrity: sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw==}
/@esbuild/linux-loong64@0.18.15:
resolution: {integrity: sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
@ -721,8 +724,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-mips64el@0.18.14:
resolution: {integrity: sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A==}
/@esbuild/linux-mips64el@0.18.15:
resolution: {integrity: sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
@ -739,8 +742,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-ppc64@0.18.14:
resolution: {integrity: sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg==}
/@esbuild/linux-ppc64@0.18.15:
resolution: {integrity: sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
@ -757,8 +760,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-riscv64@0.18.14:
resolution: {integrity: sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw==}
/@esbuild/linux-riscv64@0.18.15:
resolution: {integrity: sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
@ -775,8 +778,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-s390x@0.18.14:
resolution: {integrity: sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw==}
/@esbuild/linux-s390x@0.18.15:
resolution: {integrity: sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
@ -793,8 +796,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-x64@0.18.14:
resolution: {integrity: sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw==}
/@esbuild/linux-x64@0.18.15:
resolution: {integrity: sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
@ -811,8 +814,8 @@ packages:
dev: false
optional: true
/@esbuild/netbsd-x64@0.18.14:
resolution: {integrity: sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg==}
/@esbuild/netbsd-x64@0.18.15:
resolution: {integrity: sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
@ -829,8 +832,8 @@ packages:
dev: false
optional: true
/@esbuild/openbsd-x64@0.18.14:
resolution: {integrity: sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw==}
/@esbuild/openbsd-x64@0.18.15:
resolution: {integrity: sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
@ -847,8 +850,8 @@ packages:
dev: false
optional: true
/@esbuild/sunos-x64@0.18.14:
resolution: {integrity: sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ==}
/@esbuild/sunos-x64@0.18.15:
resolution: {integrity: sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
@ -865,8 +868,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-arm64@0.18.14:
resolution: {integrity: sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q==}
/@esbuild/win32-arm64@0.18.15:
resolution: {integrity: sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
@ -883,8 +886,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-ia32@0.18.14:
resolution: {integrity: sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw==}
/@esbuild/win32-ia32@0.18.15:
resolution: {integrity: sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
@ -901,8 +904,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-x64@0.18.14:
resolution: {integrity: sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg==}
/@esbuild/win32-x64@0.18.15:
resolution: {integrity: sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
@ -1834,27 +1837,27 @@ packages:
remove-accents: 0.4.2
dev: false
/@tanstack/query-core@4.29.25:
resolution: {integrity: sha512-DI4y4VC6Uw4wlTpOocEXDky69xeOScME1ezLKsj+hOk7DguC9fkqXtp6Hn39BVb9y0b5IBrY67q6kIX623Zj4Q==}
/@tanstack/query-core@4.30.0:
resolution: {integrity: sha512-R5ozHCm3CJL9cT3j8cN6ztA0rdjw6pJN9e3zNeCPkwqfp89H1mQsn6W1RSJGuykzydQ+gFhAzteTM7NI3hz32g==}
dev: false
/@tanstack/react-query-devtools@4.29.25(@tanstack/react-query@4.29.25)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-XlrGUqmjv1O+6Ny23rAiyNSWYKep90SKT3IixDQRnIuTGaZej+hVCOh7wZSxq6qkzadIvsblc4SLtyJsOiIXBQ==}
/@tanstack/react-query-devtools@4.30.0(@tanstack/react-query@4.30.0)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-9QAivSCVwkHzNVhaWXo8O/ApCXzFqd0hlr8uwEZMsTOG+g60q4BEGFm8Cin4QJx9gCQ17Dnb6QH1VQHF0lanbQ==}
peerDependencies:
'@tanstack/react-query': 4.29.25
'@tanstack/react-query': 4.30.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@tanstack/match-sorter-utils': 8.8.4
'@tanstack/react-query': 4.29.25(react-dom@18.2.0)(react@18.2.0)
'@tanstack/react-query': 4.30.0(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
superjson: 1.13.1
use-sync-external-store: 1.2.0(react@18.2.0)
dev: false
/@tanstack/react-query@4.29.25(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-c1+Ezu+XboYrdAMdusK2fTdRqXPMgPAnyoTrzHOZQqr8Hqz6PNvV9DSKl8agUo6nXX4np7fdWabIprt+838dLg==}
/@tanstack/react-query@4.30.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-uDURvabCVYtEamap4kmyLHCVOtzGSts83OsLpPvyzXMTHNptQwhU+YBH/vrgGAtceAuWn7JQfs9R9jJwPOJXXg==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
@ -1865,7 +1868,7 @@ packages:
react-native:
optional: true
dependencies:
'@tanstack/query-core': 4.29.25
'@tanstack/query-core': 4.30.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
use-sync-external-store: 1.2.0(react@18.2.0)
@ -2132,6 +2135,14 @@ packages:
'@tiptap/pm': 2.0.4(@tiptap/core@2.0.4)
dev: false
/@tiptap/extension-image@2.0.4(@tiptap/core@2.0.4):
resolution: {integrity: sha512-5iQ96pt9xppM8sWzwhGgc99PPoYPQuokTaCXAQKDI0Y1CFCjZ+/duUG3al1VUMpBXsjJw3/RVO1+7CEhRTd3mA==}
peerDependencies:
'@tiptap/core': ^2.0.0
dependencies:
'@tiptap/core': 2.0.4(@tiptap/pm@2.0.4)
dev: false
/@tiptap/extension-italic@2.0.4(@tiptap/core@2.0.4):
resolution: {integrity: sha512-C/6+qs4Jh8xERRP0wcOopA1+emK8MOkBE4RQx5NbPnT2iCpERP0GlmHBFQIjaYPctZgKFHxsCfRnneS5Xe76+A==}
peerDependencies:
@ -2287,11 +2298,11 @@ packages:
engines: {node: '>= 10'}
dev: false
/@trivago/prettier-plugin-sort-imports@4.1.1(prettier@2.8.8):
resolution: {integrity: sha512-dQ2r2uzNr1x6pJsuh/8x0IRA3CBUB+pWEW3J/7N98axqt7SQSm+2fy0FLNXvXGg77xEDC7KHxJlHfLYyi7PDcw==}
/@trivago/prettier-plugin-sort-imports@4.2.0(prettier@2.8.8):
resolution: {integrity: sha512-YBepjbt+ZNBVmN3ev1amQH3lWCmHyt5qTbLCp/syXJRu/Kw2koXh44qayB1gMRxcL/gV8egmjN5xWSrYyfUtyw==}
peerDependencies:
'@vue/compiler-sfc': 3.x
prettier: 2.x
prettier: 2.x - 3.x
peerDependenciesMeta:
'@vue/compiler-sfc':
optional: true
@ -2526,13 +2537,13 @@ packages:
'@typescript-eslint/types': 5.62.0
eslint-visitor-keys: 3.4.1
/@vitejs/plugin-react-swc@3.3.2(vite@4.4.4):
/@vitejs/plugin-react-swc@3.3.2(vite@4.4.6):
resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==}
peerDependencies:
vite: ^4
dependencies:
'@swc/core': 1.3.70
vite: 4.4.4(@types/node@18.16.19)
vite: 4.4.6(@types/node@18.16.19)
transitivePeerDependencies:
- '@swc/helpers'
dev: true
@ -2821,7 +2832,7 @@ packages:
hasBin: true
dependencies:
caniuse-lite: 1.0.30001517
electron-to-chromium: 1.4.466
electron-to-chromium: 1.4.467
node-releases: 2.0.13
update-browserslist-db: 1.0.11(browserslist@4.21.9)
@ -3294,8 +3305,8 @@ packages:
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
/electron-to-chromium@1.4.466:
resolution: {integrity: sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA==}
/electron-to-chromium@1.4.467:
resolution: {integrity: sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==}
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@ -3457,34 +3468,34 @@ packages:
'@esbuild/win32-x64': 0.17.19
dev: false
/esbuild@0.18.14:
resolution: {integrity: sha512-uNPj5oHPYmj+ZhSQeYQVFZ+hAlJZbAGOmmILWIqrGvPVlNLbyOvU5Bu6Woi8G8nskcx0vwY0iFoMPrzT86Ko+w==}
/esbuild@0.18.15:
resolution: {integrity: sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.18.14
'@esbuild/android-arm64': 0.18.14
'@esbuild/android-x64': 0.18.14
'@esbuild/darwin-arm64': 0.18.14
'@esbuild/darwin-x64': 0.18.14
'@esbuild/freebsd-arm64': 0.18.14
'@esbuild/freebsd-x64': 0.18.14
'@esbuild/linux-arm': 0.18.14
'@esbuild/linux-arm64': 0.18.14
'@esbuild/linux-ia32': 0.18.14
'@esbuild/linux-loong64': 0.18.14
'@esbuild/linux-mips64el': 0.18.14
'@esbuild/linux-ppc64': 0.18.14
'@esbuild/linux-riscv64': 0.18.14
'@esbuild/linux-s390x': 0.18.14
'@esbuild/linux-x64': 0.18.14
'@esbuild/netbsd-x64': 0.18.14
'@esbuild/openbsd-x64': 0.18.14
'@esbuild/sunos-x64': 0.18.14
'@esbuild/win32-arm64': 0.18.14
'@esbuild/win32-ia32': 0.18.14
'@esbuild/win32-x64': 0.18.14
'@esbuild/android-arm': 0.18.15
'@esbuild/android-arm64': 0.18.15
'@esbuild/android-x64': 0.18.15
'@esbuild/darwin-arm64': 0.18.15
'@esbuild/darwin-x64': 0.18.15
'@esbuild/freebsd-arm64': 0.18.15
'@esbuild/freebsd-x64': 0.18.15
'@esbuild/linux-arm': 0.18.15
'@esbuild/linux-arm64': 0.18.15
'@esbuild/linux-ia32': 0.18.15
'@esbuild/linux-loong64': 0.18.15
'@esbuild/linux-mips64el': 0.18.15
'@esbuild/linux-ppc64': 0.18.15
'@esbuild/linux-riscv64': 0.18.15
'@esbuild/linux-s390x': 0.18.15
'@esbuild/linux-x64': 0.18.15
'@esbuild/netbsd-x64': 0.18.15
'@esbuild/openbsd-x64': 0.18.15
'@esbuild/sunos-x64': 0.18.15
'@esbuild/win32-arm64': 0.18.15
'@esbuild/win32-ia32': 0.18.15
'@esbuild/win32-x64': 0.18.15
dev: true
/escalade@3.1.1:
@ -3623,8 +3634,8 @@ packages:
semver: 6.3.1
dev: true
/eslint-plugin-react@7.32.2(eslint@8.45.0):
resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==}
/eslint-plugin-react@7.33.0(eslint@8.45.0):
resolution: {integrity: sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==}
engines: {node: '>=4'}
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
@ -5841,7 +5852,7 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
/prettier-plugin-tailwindcss@0.3.0(@trivago/prettier-plugin-sort-imports@4.1.1)(prettier@2.8.8):
/prettier-plugin-tailwindcss@0.3.0(@trivago/prettier-plugin-sort-imports@4.2.0)(prettier@2.8.8):
resolution: {integrity: sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA==}
engines: {node: '>=12.17.0'}
peerDependencies:
@ -5893,7 +5904,7 @@ packages:
prettier-plugin-twig-melody:
optional: true
dependencies:
'@trivago/prettier-plugin-sort-imports': 4.1.1(prettier@2.8.8)
'@trivago/prettier-plugin-sort-imports': 4.2.0(prettier@2.8.8)
prettier: 2.8.8
dev: true
@ -7257,7 +7268,7 @@ packages:
vfile-message: 3.1.4
dev: false
/vite-plugin-top-level-await@1.3.1(vite@4.4.4):
/vite-plugin-top-level-await@1.3.1(vite@4.4.6):
resolution: {integrity: sha512-55M1h4NAwkrpxPNOJIBzKZFihqLUzIgnElLSmPNPMR2Fn9+JHKaNg3sVX1Fq+VgvuBksQYxiD3OnwQAUu7kaPQ==}
peerDependencies:
vite: '>=2.8'
@ -7265,13 +7276,13 @@ packages:
'@rollup/plugin-virtual': 3.0.1
'@swc/core': 1.3.70
uuid: 9.0.0
vite: 4.4.4(@types/node@18.16.19)
vite: 4.4.6(@types/node@18.16.19)
transitivePeerDependencies:
- '@swc/helpers'
- rollup
dev: true
/vite-tsconfig-paths@4.2.0(typescript@4.9.5)(vite@4.4.4):
/vite-tsconfig-paths@4.2.0(typescript@4.9.5)(vite@4.4.6):
resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==}
peerDependencies:
vite: '*'
@ -7282,14 +7293,14 @@ packages:
debug: 4.3.4
globrex: 0.1.2
tsconfck: 2.1.2(typescript@4.9.5)
vite: 4.4.4(@types/node@18.16.19)
vite: 4.4.6(@types/node@18.16.19)
transitivePeerDependencies:
- supports-color
- typescript
dev: true
/vite@4.4.4(@types/node@18.16.19):
resolution: {integrity: sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==}
/vite@4.4.6(@types/node@18.16.19):
resolution: {integrity: sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
@ -7317,7 +7328,7 @@ packages:
optional: true
dependencies:
'@types/node': 18.16.19
esbuild: 0.18.14
esbuild: 0.18.15
postcss: 8.4.26
rollup: 3.26.3
optionalDependencies:

View File

@ -2,7 +2,7 @@ import destr from 'destr';
import Database from 'tauri-plugin-sql-api';
import { getParentID } from '@utils/transform';
import { Account, Block, Chats, LumeEvent, Settings } from '@utils/types';
import { Account, Block, Chats, LumeEvent, Profile, Settings } from '@utils/types';
let db: null | Database = null;
@ -451,7 +451,20 @@ export async function createMetadata(id: string, pubkey: string, content: string
);
}
// get metadata
export async function getAllMetadata() {
const db = await connect();
const result: LumeEvent[] = await db.select(`SELECT * FROM metadata;`);
const users: Profile[] = result.map((el) => {
const profile: Profile = destr(el.content);
return {
pubkey: el.pubkey,
ident: profile.name || profile.display_name || profile.username,
};
});
return users;
}
// get user metadata
export async function getUserMetadata(pubkey: string) {
const db = await connect();
const result = await db.select(`SELECT * FROM metadata WHERE pubkey = "${pubkey}";`);

View File

@ -2,11 +2,13 @@ import Mention from '@tiptap/extension-mention';
import Placeholder from '@tiptap/extension-placeholder';
import { EditorContent, useEditor } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
import { nip19 } from 'nostr-tools';
import { useState } from 'react';
import { twMerge } from 'tailwind-merge';
import { Button } from '@shared/button';
import { Suggestion } from '@shared/composer';
import { CancelIcon } from '@shared/icons';
import { CancelIcon, LoaderIcon } from '@shared/icons';
import { MentionNote } from '@shared/notes';
import { useComposer } from '@stores/composer';
@ -15,6 +17,7 @@ import { FULL_RELAYS } from '@stores/constants';
import { usePublish } from '@utils/hooks/usePublish';
export function Composer() {
const [loading, setLoading] = useState(false);
const [reply, clearReply, toggle] = useComposer((state) => [
state.reply,
state.clearReply,
@ -27,17 +30,17 @@ export function Composer() {
StarterKit,
Placeholder.configure({ placeholder: "What's on your mind?" }),
Mention.configure({
HTMLAttributes: {
class: 'mention',
},
suggestion: Suggestion,
renderLabel({ node }) {
return `nostr:${nip19.npubEncode(node.attrs.id.pubkey)} `;
},
}),
],
content: '',
editorProps: {
attributes: {
class: twMerge(
'markdown max-h-[500px] overflow-y-auto outline-none',
'markdown break-all max-h-[500px] overflow-y-auto outline-none',
`${reply.id ? '!min-h-42' : '!min-h-[86px]'}`
),
},
@ -45,25 +48,40 @@ export function Composer() {
});
const submit = async () => {
let tags: string[][] = [];
setLoading(true);
try {
let tags: string[][] = [];
if (reply.id && reply.pubkey) {
tags = [
['e', reply.id, FULL_RELAYS[0], 'reply'],
['p', reply.pubkey],
];
} else {
tags = [];
if (reply.id && reply.pubkey) {
if (reply.root) {
tags = [
['e', reply.root, FULL_RELAYS[0], 'root'],
['e', reply.id, FULL_RELAYS[0], 'reply'],
['p', reply.pubkey],
];
} else {
tags = [
['e', reply.id, FULL_RELAYS[0], 'reply'],
['p', reply.pubkey],
];
}
} else {
tags = [];
}
// get plaintext content
const serializedContent = editor.getText();
// publish message
await publish({ content: serializedContent, kind: 1, tags });
// close modal
setLoading(false);
toggle(false);
} catch {
setLoading(false);
console.log('failed to publish');
}
// serialize content
const serializedContent = editor.getText();
// publish message
// await publish({ content: serializedContent, kind: 1, tags });
// close modal
toggle(false);
};
return (
@ -91,7 +109,11 @@ export function Composer() {
<div className="mt-4 flex items-center justify-between">
<div />
<Button onClick={() => submit()} preset="publish">
Publish
{loading ? (
<LoaderIcon className="h-4 w-4 animate-spin text-zinc-100" />
) : (
'Publish'
)}
</Button>
</div>
</div>

View File

@ -2,4 +2,5 @@ export * from './user';
export * from './modal';
export * from './composer';
export * from './mention/list';
export * from './mention/item';
export * from './mention/suggestion';

View File

@ -0,0 +1,31 @@
import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@stores/constants';
import { displayNpub } from '@utils/shortenKey';
import { Profile } from '@utils/types';
export function MentionItem({ profile }: { profile: Profile }) {
return (
<div className="flex items-center gap-2">
<div className="h-8 w-8 shrink-0 overflow-hidden rounded-md bg-zinc-900">
<Image
src={profile.picture || profile.image}
fallback={DEFAULT_AVATAR}
alt={profile.pubkey}
className="h-8 w-8 object-cover"
/>
</div>
<div className="flex flex-col gap-px">
<h5 className="max-w-[15rem] text-sm font-medium leading-none text-zinc-100">
{profile.ident || (
<div className="h-3 w-20 animate-pulse rounded-sm bg-zinc-700" />
)}
</h5>
<span className="text-sm leading-none text-zinc-400">
{profile.nip05 || profile.username || displayNpub(profile.pubkey, 16)}
</span>
</div>
</div>
);
}

View File

@ -1,4 +1,8 @@
import { NDKUserProfile } from '@nostr-dev-kit/ndk';
import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
import { twMerge } from 'tailwind-merge';
import { MentionItem } from '@shared/composer';
export const MentionList = forwardRef((props: any, ref: any) => {
const [selectedIndex, setSelectedIndex] = useState(0);
@ -47,19 +51,22 @@ export const MentionList = forwardRef((props: any, ref: any) => {
}));
return (
<div className="items">
<div className="flex w-[250px] flex-col rounded-xl border-t border-zinc-700/50 bg-zinc-800 px-3 py-3">
{props.items.length ? (
props.items.map((item, index) => (
props.items.map((item: NDKUserProfile, index: number) => (
<button
className={`item ${index === selectedIndex ? 'is-selected' : ''}`}
className={twMerge(
'h-11 w-full rounded-lg px-2 text-start text-sm font-medium hover:bg-zinc-700',
`${index === selectedIndex ? 'is-selected' : ''}`
)}
key={index}
onClick={() => selectItem(index)}
>
{item}
<MentionItem profile={item} />
</button>
))
) : (
<div className="item">No result</div>
<div>No result</div>
)}
</div>
);

View File

@ -1,38 +1,16 @@
import { ReactRenderer } from '@tiptap/react';
import tippy from 'tippy.js';
import { getAllMetadata } from '@libs/storage';
import { MentionList } from '@shared/composer';
const users = await getAllMetadata();
export const Suggestion = {
items: ({ query }) => {
return [
'Lea Thompson',
'Cyndi Lauper',
'Tom Cruise',
'Madonna',
'Jerry Hall',
'Joan Collins',
'Winona Ryder',
'Christina Applegate',
'Alyssa Milano',
'Molly Ringwald',
'Ally Sheedy',
'Debbie Harry',
'Olivia Newton-John',
'Elton John',
'Michael J. Fox',
'Axl Rose',
'Emilio Estevez',
'Ralph Macchio',
'Rob Lowe',
'Jennifer Grey',
'Mickey Rourke',
'John Cusack',
'Matthew Broderick',
'Justine Bateman',
'Lisa Bonet',
]
.filter((item) => item.toLowerCase().startsWith(query.toLowerCase()))
return users
.filter((item) => item.ident.toLowerCase().startsWith(query.toLowerCase()))
.slice(0, 5);
},

View File

@ -71,15 +71,13 @@ export function ComposerModal() {
<ChevronDownIcon width={14} height={14} />
</div>
</div>
<div
<button
onClick={closeModal}
onKeyDown={closeModal}
role="button"
tabIndex={0}
type="button"
className="inline-flex h-5 w-5 items-center justify-center rounded hover:bg-zinc-800"
>
<CancelIcon width={16} height={16} className="text-zinc-500" />
</div>
</button>
</div>
<Composer />
</Dialog.Panel>

View File

@ -2,7 +2,7 @@ import { create } from 'zustand';
interface ComposerState {
open: boolean;
reply: { id: string; pubkey: string };
reply: { id: string; pubkey: string; root?: string };
toggleModal: (status: boolean) => void;
setReply: (id: string, pubkey: string) => void;
clearReply: () => void;
@ -14,11 +14,11 @@ export const useComposer = create<ComposerState>((set) => ({
toggleModal: (status: boolean) => {
set({ open: status });
},
setReply: (id: string, pubkey: string) => {
set({ reply: { id: id, pubkey: pubkey } });
setReply: (id: string, pubkey: string, root?: string) => {
set({ reply: { id: id, root: root, pubkey: pubkey } });
set({ open: true });
},
clearReply: () => {
set({ reply: { id: null, pubkey: null } });
set({ reply: { id: null, root: null, pubkey: null } });
},
}));

View File

@ -1,4 +1,4 @@
import { NDKEvent } from '@nostr-dev-kit/ndk';
import { NDKEvent, NDKUserProfile } from '@nostr-dev-kit/ndk';
export interface LumeEvent extends NDKEvent {
event_id?: string;
@ -15,6 +15,11 @@ export interface Account {
is_active: number;
}
export interface Profile extends NDKUserProfile {
ident?: string;
pubkey?: string;
}
export interface Block {
id: string;
account_id: number;