Merge pull request 'devel' (#164) from devel into main

Reviewed-on: #164
This commit is contained in:
inhji 2023-07-03 20:38:52 +02:00
commit f61a187bce
13 changed files with 289 additions and 103 deletions

View file

@ -23,7 +23,7 @@ import { LiveSocket } from "phoenix_live_view"
import topbar from "../vendor/topbar"
import lolight from "../vendor/lolight"
import React from "react"
import { createRoot } from 'react-dom'
import { createRoot } from 'react-dom/client'
import KBar from "./kbar"
lolight("pre code")

View file

@ -44,7 +44,7 @@ function RenderResults() {
items={results}
onRender={({ item, active }) =>
typeof item === "string" ? (
<div style={groupNameStyle} class="dark:text-white">{item}</div>
<div style={groupNameStyle} className="dark:text-white">{item}</div>
) : (
<ResultItem
action={item}

190
assets/package-lock.json generated
View file

@ -16,19 +16,19 @@
"esbuild": "^0.18.0"
},
"peerDependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
"react": "^18.0",
"react-dom": "^18.0"
}
},
"../deps/phoenix": {
"version": "1.7.3",
"version": "1.7.6",
"license": "MIT"
},
"../deps/phoenix_html": {
"version": "3.3.1"
},
"../deps/phoenix_live_view": {
"version": "0.19.1",
"version": "0.19.3",
"license": "MIT"
},
"node_modules/@babel/runtime": {
@ -43,9 +43,9 @@
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.0.tgz",
"integrity": "sha512-+uLHSiWK3qOeyDYCf/nuvIgCnQsYjXWNa3TlGYLW1pPG7OYMawllU+VyBgHQPjF2aIUVFpfrvz5aAfxGk/0qNg==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz",
"integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==",
"cpu": [
"arm"
],
@ -59,9 +59,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.0.tgz",
"integrity": "sha512-nAwRCs5+jxi3gBMVkOqmRvsITB/UtfpvkbMwAwJUIbp66NnPbV2KGCFnjNn7IEqabJQXfBLe/QLdjCGpHU+yEw==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz",
"integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==",
"cpu": [
"arm64"
],
@ -75,9 +75,9 @@
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.0.tgz",
"integrity": "sha512-TiOJmHQ8bXCGlYLpBd3Qy7N8dxi4n6q+nOmTzPr5Hb/bUr+PKuP4e5lWaOlpkaKc1Q9wsFt+sHfQpFCrM7SMow==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz",
"integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==",
"cpu": [
"x64"
],
@ -91,9 +91,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.0.tgz",
"integrity": "sha512-5GsFovtGyjMIXJrcCzmI1hX3TneCrmFncFIlo0WrRvWcVU6H094P854ZaP8qoLgevXhggO2dhlEGYY0Zv6/S9Q==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz",
"integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==",
"cpu": [
"arm64"
],
@ -107,9 +107,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.0.tgz",
"integrity": "sha512-4K/QCksQ8F58rvC1D62Xi4q4E7YWpiyc3zy2H/n1W7y0hjQpOBBxciLn0qycMskP/m/I5h9HNbRlu1aK821sHg==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz",
"integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==",
"cpu": [
"x64"
],
@ -123,9 +123,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.0.tgz",
"integrity": "sha512-DMazN0UGzipD0Fi1O9pRX0xfp+JC3gSnFWxTWq88Dr/odWhZzm8Jqy44LN2veYeipb1fBMxhoEp7eCr902SWqg==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz",
"integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==",
"cpu": [
"arm64"
],
@ -139,9 +139,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.0.tgz",
"integrity": "sha512-GdkJAB3ZBiYnie9iFO9v/CM4ko0dm5SYkUs97lBKNLHw9mo4H9IXwGNKtUztisEsmUP0IWfEi4YTWOJF3DIO4w==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz",
"integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==",
"cpu": [
"x64"
],
@ -155,9 +155,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.0.tgz",
"integrity": "sha512-A3Ue/oZdb43znNpeY71FrAjZF20MtnBKCGb1vXLIVg5qg8rRM1gRgn6X2ixYwATiw5dE04JnP+aV4OBf8c5ZvQ==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz",
"integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==",
"cpu": [
"arm"
],
@ -171,9 +171,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.0.tgz",
"integrity": "sha512-Mb3yCN9PXA6G5qf84UF0IEuXP22eyNlquF17Zs2F1vVBM0CtyWLYosC5JaxBxfK6EzWwB2IkPBIjMeK3ek+ItA==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz",
"integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==",
"cpu": [
"arm64"
],
@ -187,9 +187,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.0.tgz",
"integrity": "sha512-WNDXgJdfDhN6ZxHU7HgR2BRDVx9iGN8SpmebUUGdENg4MZJndGcaQuf2kCJjMwoK0+es1g61TeJzAMxfgDcmcA==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz",
"integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==",
"cpu": [
"ia32"
],
@ -203,9 +203,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.0.tgz",
"integrity": "sha512-PBr8Lf+L8amvheTGFVNK/0qionszkOKMq2WyfFlVz8D41v0+uSth6fYYHwtASkMk4xf+oh0vW8NYuav3/3RHuQ==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz",
"integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==",
"cpu": [
"loong64"
],
@ -219,9 +219,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.0.tgz",
"integrity": "sha512-Lg4ygah5bwfDDCOMFsBJjSVbD1UzNwWt4f7DhpaSIFOrJqoECX1VTByKw3iSDAVRlwl1cljlfy7wlysrRZcdiQ==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz",
"integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==",
"cpu": [
"mips64el"
],
@ -235,9 +235,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.0.tgz",
"integrity": "sha512-obz/firdtou244DIjHzdKmJChwGseqA3tWGa6xPMfuq54Ca4Pp1a4ANMrqy2IZ67rfpRHcJTlb2h3rSfW6tvAA==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz",
"integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==",
"cpu": [
"ppc64"
],
@ -251,9 +251,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.0.tgz",
"integrity": "sha512-UkuBdxQsxi39wWrRLMOkJl//82/hpQw79TD+OBLw3IBYyVQ4Wfvpe56RfEGK/j439sIm79ccnD5RUNQceHvZdQ==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz",
"integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==",
"cpu": [
"riscv64"
],
@ -267,9 +267,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.0.tgz",
"integrity": "sha512-MgyuC30oYB465hyAqsb3EH6Y4zTeqqgixRAOpsDNMCelyDiW9ZDPXvMPfBgCZGJlDZFGKDm2I9ou8E3VI+v7pg==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz",
"integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==",
"cpu": [
"s390x"
],
@ -283,9 +283,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.0.tgz",
"integrity": "sha512-oLLKU3F4pKWAsNmfi7Rd4qkj0qvg1S923ZjlcISA2IMgHsODA9xzwerqWayI5nOhLGgKXviDofn9exTeA4EUQQ==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz",
"integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==",
"cpu": [
"x64"
],
@ -299,9 +299,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.0.tgz",
"integrity": "sha512-BEfJrZsZ/gMtpS2vC+2YoFGxmfLKiYQvj8lZrBfjKzQrwyMpH53CzQJj9ypOx9ldjM/MVxf9i9wi/rS4BWV7WA==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz",
"integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==",
"cpu": [
"x64"
],
@ -315,9 +315,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.0.tgz",
"integrity": "sha512-eDolHeG3REnEIgwl7Lw2S0znUMY4PFVtCAzLKqdRO0HD+iPKJR8n2MEJJyhPdUjcobo8SEQ2AG6gtYfft9VFHg==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz",
"integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==",
"cpu": [
"x64"
],
@ -331,9 +331,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.0.tgz",
"integrity": "sha512-kl7vONem2wmRQke015rSrknmc6TYXKVNs2quiVTdvkSufscrjegpNqKyP7v6EHqXtvkzrB92ySjpfzazKG627g==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz",
"integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==",
"cpu": [
"x64"
],
@ -347,9 +347,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.0.tgz",
"integrity": "sha512-WohArFQ3HStBu9MAsx3JUk2wfC2v8QoadnMoNfx3Y26ac54tD/wQhPzw4QOzQbSqOFqzIMLKWbxindTsko+9OA==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz",
"integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==",
"cpu": [
"arm64"
],
@ -363,9 +363,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.0.tgz",
"integrity": "sha512-SdnpSOxpeoewYCurmfLVepLuhOAphWkGTxWHifFjp37DaUHwF1fpGzyxhZoXMt5MKGuAO5aE3c5668YYtno+9Q==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz",
"integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==",
"cpu": [
"ia32"
],
@ -379,9 +379,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.0.tgz",
"integrity": "sha512-WJxImv0Pehpbo+pgg7Xrn88/b6ZzSweNHTw/2LW95JjeQUIS6ToJeQmjAdud9H3yiHJmhLOmEAOvUdNLhptD0w==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz",
"integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==",
"cpu": [
"x64"
],
@ -491,9 +491,9 @@
"integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w=="
},
"node_modules/esbuild": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.0.tgz",
"integrity": "sha512-/2sQaWHNX2jkglLu85EjmEAR2ANpKOa1kp2rAE3wjKcuYjEHFlB+D60tn6W9BRgHiAQEKYtl4hEygKWothfDEA==",
"version": "0.18.11",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz",
"integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==",
"dev": true,
"hasInstallScript": true,
"bin": {
@ -503,28 +503,28 @@
"node": ">=12"
},
"optionalDependencies": {
"@esbuild/android-arm": "0.18.0",
"@esbuild/android-arm64": "0.18.0",
"@esbuild/android-x64": "0.18.0",
"@esbuild/darwin-arm64": "0.18.0",
"@esbuild/darwin-x64": "0.18.0",
"@esbuild/freebsd-arm64": "0.18.0",
"@esbuild/freebsd-x64": "0.18.0",
"@esbuild/linux-arm": "0.18.0",
"@esbuild/linux-arm64": "0.18.0",
"@esbuild/linux-ia32": "0.18.0",
"@esbuild/linux-loong64": "0.18.0",
"@esbuild/linux-mips64el": "0.18.0",
"@esbuild/linux-ppc64": "0.18.0",
"@esbuild/linux-riscv64": "0.18.0",
"@esbuild/linux-s390x": "0.18.0",
"@esbuild/linux-x64": "0.18.0",
"@esbuild/netbsd-x64": "0.18.0",
"@esbuild/openbsd-x64": "0.18.0",
"@esbuild/sunos-x64": "0.18.0",
"@esbuild/win32-arm64": "0.18.0",
"@esbuild/win32-ia32": "0.18.0",
"@esbuild/win32-x64": "0.18.0"
"@esbuild/android-arm": "0.18.11",
"@esbuild/android-arm64": "0.18.11",
"@esbuild/android-x64": "0.18.11",
"@esbuild/darwin-arm64": "0.18.11",
"@esbuild/darwin-x64": "0.18.11",
"@esbuild/freebsd-arm64": "0.18.11",
"@esbuild/freebsd-x64": "0.18.11",
"@esbuild/linux-arm": "0.18.11",
"@esbuild/linux-arm64": "0.18.11",
"@esbuild/linux-ia32": "0.18.11",
"@esbuild/linux-loong64": "0.18.11",
"@esbuild/linux-mips64el": "0.18.11",
"@esbuild/linux-ppc64": "0.18.11",
"@esbuild/linux-riscv64": "0.18.11",
"@esbuild/linux-s390x": "0.18.11",
"@esbuild/linux-x64": "0.18.11",
"@esbuild/netbsd-x64": "0.18.11",
"@esbuild/openbsd-x64": "0.18.11",
"@esbuild/sunos-x64": "0.18.11",
"@esbuild/win32-arm64": "0.18.11",
"@esbuild/win32-ia32": "0.18.11",
"@esbuild/win32-x64": "0.18.11"
}
},
"node_modules/fast-equals": {

View file

@ -11,7 +11,7 @@
"phoenix_live_view": "file:../deps/phoenix_live_view"
},
"peerDependencies": {
"react": "^17.0.0",
"react-dom": "^17.0.0"
"react": "^18.0",
"react-dom": "^18.0"
}
}

View file

@ -116,6 +116,19 @@ defmodule Chiya.Accounts do
User.email_changeset(user, attrs, validate_email: false)
end
@doc """
Returns an `%Ecto.Changeset{}` for changing the user profile.
## Examples
iex> change_user_profile(user)
%Ecto.Changeset{data: %User{}}
"""
def change_user_profile(user, attrs \\ %{}) do
User.profile_changeset(user, attrs)
end
@doc """
Returns an `%Ecto.Changeset{}` for changing the user avatar.
@ -149,6 +162,15 @@ defmodule Chiya.Accounts do
|> Ecto.Changeset.apply_action(:update)
end
@doc """
Updates the user profile.
"""
def update_user_profile(user, attrs) do
user
|> User.profile_changeset(attrs)
|> Repo.update()
end
@doc """
Updates the user email using the given token.

View file

@ -4,6 +4,10 @@ defmodule Chiya.Accounts.User do
import Ecto.Changeset
schema "users" do
field :name, :string
field :handle, :string
field :bio, :string
field :email, :string
field :password, :string, virtual: true, redact: true
field :hashed_password, :string, redact: true
@ -116,6 +120,14 @@ defmodule Chiya.Accounts.User do
end
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking user profile changes.
"""
def profile_changeset(user, attrs) do
user
|> cast(attrs, [:name, :handle, :bio])
end
@doc """
A user changeset for changing the password.

View file

@ -43,7 +43,12 @@ defmodule Chiya.Tags.TagUpdater do
end
def update_tags(%{tags: tags} = schema, new_tags) when is_list(new_tags) do
old_tags = Enum.map(tags, fn tag -> tag.name end)
old_tags = Enum.map(tags, fn tag -> String.downcase(tag.slug) end)
new_tags = Enum.map(new_tags, fn tag ->
tag
|> String.downcase()
|> Slugger.slugify()
end)
Logger.info("Adding tags #{inspect(new_tags -- old_tags)}")
Logger.info("Removing tags #{inspect(old_tags -- new_tags)}")

View file

@ -55,9 +55,15 @@ defmodule ChiyaWeb.PageController do
end
end
### ========= REDIRECTS
def about(conn, _params) do
redirect(conn, to: ~p"/note/about")
note = Chiya.Notes.get_note_by_slug_preloaded("about")
user = Chiya.Accounts.get_user!(1)
render(conn, :about,
layout: {ChiyaWeb.Layouts, "public.html"},
note: note,
user: user,
page_title: "About"
)
end
end

View file

@ -0,0 +1,24 @@
<article class="h-card hcard">
<section class="mx-auto max-w-2xl p-10 bg-theme-background1 flex gap-3 items-start">
<div>
<img
class="rounded-lg w-28 | u-photo"
src={ChiyaWeb.Uploaders.UserImage.url({@user.user_image, @current_user}, :thumb)}
/>
</div>
<div>
<h1 class="text-3xl font-extrabold leading-10 tracking-tight text-theme-primary | p-name">
<%= @user.name %>
</h1>
<section class="mx-auto mt-8 prose prose-gruvbox | p-note">
<%= Markdown.render(@user.bio) |> raw() %>
</section>
</div>
</section>
<%= if @note do %>
<section class="mx-auto mt-8 prose prose-gruvbox md:prose-lg lg:prose-xl | p-summary e-content">
<%= Markdown.render(@note.content) |> raw %>
</section>
<% end %>
</article>

View file

@ -13,6 +13,9 @@ defmodule ChiyaWeb.UserProfileLive do
</.header>
<.list>
<:item title="Name"><%= @current_user.name %></:item>
<:item title="Handle"><%= @current_user.handle %></:item>
<:item title="Bio"><%= @current_user.bio %></:item>
<:item title="Email"><%= @current_user.email %></:item>
</.list>
"""

View file

@ -29,6 +29,25 @@ defmodule ChiyaWeb.UserSettingsLive do
<.line />
<.header>Change Profile</.header>
<.simple_form
for={@profile_form}
id="profile_form"
phx-submit="update_profile"
phx-change="validate_profile"
>
<.input field={@profile_form[:name]} label="Name" required />
<.input field={@profile_form[:handle]} label="Handle" required />
<.input field={@profile_form[:bio]} type="textarea" label="Bio" required />
<:actions>
<.button phx-disable-with="Changing...">Change Email</.button>
</:actions>
</.simple_form>
<.line />
<.header>Change Email</.header>
<.simple_form
@ -107,6 +126,7 @@ defmodule ChiyaWeb.UserSettingsLive do
email_changeset = Accounts.change_user_email(user)
password_changeset = Accounts.change_user_password(user)
image_changeset = Accounts.change_user_image(user)
profile_changeset = Accounts.change_user_profile(user)
socket =
socket
@ -116,6 +136,7 @@ defmodule ChiyaWeb.UserSettingsLive do
|> assign(:current_email, user.email)
|> assign(:email_form, to_form(email_changeset))
|> assign(:password_form, to_form(password_changeset))
|> assign(:profile_form, to_form(profile_changeset))
|> assign(:image_form, to_form(image_changeset))
|> assign(:trigger_submit, false)
|> assign(:uploaded_files, [])
@ -150,6 +171,31 @@ defmodule ChiyaWeb.UserSettingsLive do
|> assign(:user, Accounts.get_user!(user.id))}
end
def handle_event("validate_profile", params, socket) do
%{"user" => user_params} = params
profile_form =
socket.assigns.current_user
|> Accounts.change_user_profile(user_params)
|> Map.put(:action, :validate)
|> to_form()
{:noreply, assign(socket, profile_form: profile_form)}
end
def handle_event("update_profile", params, socket) do
%{"user" => user_params} = params
user = socket.assigns.current_user
case Accounts.update_user_profile(user, user_params) do
{:ok, _updated_user} ->
{:noreply, socket |> put_flash(:info, "User updated!")}
{:error, changeset} ->
{:noreply, assign(socket, :profile_form, to_form(Map.put(changeset, :action, :insert)))}
end
end
def handle_event("validate_email", params, socket) do
%{"current_password" => password, "user" => user_params} = params

View file

@ -0,0 +1,11 @@
defmodule Chiya.Repo.Migrations.AddUserFields do
use Ecto.Migration
def change do
alter table(:users) do
add :handle, :string
add :name, :string
add :bio, :text
end
end
end

View file

@ -0,0 +1,57 @@
defmodule Chiya.TagUpdaterTest do
use Chiya.DataCase
import Chiya.NotesFixtures
alias Chiya.Tags.TagUpdater
describe "update_tags/2" do
test "with a single tag updates a note with the given tag" do
note = note_fixture()
assert note.tags == []
TagUpdater.update_tags(note, "foo")
note = Chiya.Notes.get_note_preloaded!(note.id)
assert Enum.count(note.tags) == 1
end
test "with a list of new tags replaces exisiting tags"do
note = note_fixture()
assert note.tags == []
TagUpdater.update_tags(note, "foo")
note = Chiya.Notes.get_note_preloaded!(note.id)
assert Enum.count(note.tags) == 1
TagUpdater.update_tags(note, ["bar", "baz"])
note = Chiya.Notes.get_note_preloaded!(note.id)
assert Enum.count(note.tags) == 2
end
test "with a map representing the attributes replaces existing tags" do
note = note_fixture()
assert note.tags == []
TagUpdater.update_tags(note, %{tags_string: "foo,bar,baz"})
note = Chiya.Notes.get_note_preloaded!(note.id)
assert Enum.count(note.tags) == 3
end
test "with the same tags in different capitalization replaces exisiting tags" do
note = note_fixture()
assert note.tags == []
TagUpdater.update_tags(note, "foo")
note = Chiya.Notes.get_note_preloaded!(note.id)
assert Enum.count(note.tags) == 1
TagUpdater.update_tags(note, ["Foo"])
note = Chiya.Notes.get_note_preloaded!(note.id)
assert Enum.count(note.tags) == 1
tag = List.first(note.tags)
assert tag.name == "Foo"
end
end
end