dialog-string.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { z } from "zod"
  2. import { onMount } from "solid-js"
  3. import { createDialog } from "./context-dialog"
  4. import { Button } from "./button"
  5. export const DialogString = createDialog({
  6. size: "sm",
  7. schema: z.object({
  8. title: z.string(),
  9. placeholder: z.string(),
  10. action: z.string(),
  11. onSubmit: z.function().args(z.string()).returns(z.void()),
  12. }),
  13. render: (ctx) => {
  14. let input: HTMLInputElement
  15. onMount(() => {
  16. setTimeout(() => {
  17. input.focus()
  18. input.value = ""
  19. }, 50)
  20. })
  21. function submit() {
  22. const value = input.value.trim()
  23. if (value) {
  24. ctx.input.onSubmit(value)
  25. ctx.control.close()
  26. }
  27. }
  28. return (
  29. <>
  30. <div data-slot="header">
  31. <label
  32. data-size="md"
  33. data-slot="title"
  34. data-component="label"
  35. for={`dialog-string-${ctx.input.title}`}
  36. >
  37. {ctx.input.title}
  38. </label>
  39. </div>
  40. <div data-slot="main">
  41. <input
  42. data-slot="input"
  43. data-size="lg"
  44. data-component="input"
  45. ref={(r) => (input = r)}
  46. placeholder={ctx.input.placeholder}
  47. id={`dialog-string-${ctx.input.title}`}
  48. onKeyDown={(e) => {
  49. if (e.key === "Enter") {
  50. e.preventDefault()
  51. submit()
  52. }
  53. }}
  54. />
  55. </div>
  56. <div data-slot="footer">
  57. <Button size="md" color="ghost" onClick={() => ctx.control.close()}>
  58. Cancel
  59. </Button>
  60. <Button size="md" color="secondary" onClick={submit}>
  61. {ctx.input.action}
  62. </Button>
  63. </div>
  64. </>
  65. )
  66. },
  67. })