From 55dde02de30620bfcf4052ba88fed9eefd38a752 Mon Sep 17 00:00:00 2001 From: Delba de Oliveira Date: Thu, 26 Oct 2023 09:26:45 -0700 Subject: [PATCH] Chapter 11 and 12 --- .../app/ui/invoices/create-form.tsx | 52 +---- .../app/ui/invoices/edit-form.tsx | 51 +---- dashboard/starter-example/package.json | 1 - pnpm-lock.yaml | 181 +++++++++--------- 4 files changed, 92 insertions(+), 193 deletions(-) diff --git a/dashboard/starter-example/app/ui/invoices/create-form.tsx b/dashboard/starter-example/app/ui/invoices/create-form.tsx index 2c234d3..0aed26f 100644 --- a/dashboard/starter-example/app/ui/invoices/create-form.tsx +++ b/dashboard/starter-example/app/ui/invoices/create-form.tsx @@ -9,16 +9,10 @@ import { UserCircleIcon, } from '@heroicons/react/24/outline'; import { Button } from '../button'; -import { createInvoice } from '@/app/lib/actions'; -// @ts-ignore React types do not yet include useFormState -import { experimental_useFormState as useFormState } from 'react-dom'; export default function Form({ customers }: { customers: CustomerField[] }) { - const initialState = { message: null, errors: [] }; - const [state, dispatch] = useFormState(createInvoice, initialState); - return ( -
+
{/* Customer Name */}
@@ -31,7 +25,6 @@ export default function Form({ customers }: { customers: CustomerField[] }) { name="customerId" className="peer block w-full rounded-md border border-gray-200 py-2 pl-10 text-sm outline-2 placeholder:text-gray-500" defaultValue="" - aria-describedby="customer-error" >
- - {state.errors?.customerId ? ( -
- {state.errors.customerId.map((error: string) => ( -

{error}

- ))} -
- ) : null}
{/* Invoice Amount */} @@ -72,23 +53,11 @@ export default function Form({ customers }: { customers: CustomerField[] }) { step="0.01" placeholder="Enter USD amount" className="peer block w-full rounded-md border border-gray-200 py-2 pl-10 text-sm outline-2 placeholder:text-gray-500" - aria-describedby="amount-error" /> - - {state.errors?.amount ? ( -
- {state.errors.amount.map((error: string) => ( -

{error}

- ))} -
- ) : null} + s {/* Invoice Status */} @@ -130,24 +99,7 @@ export default function Form({ customers }: { customers: CustomerField[] }) { - {state.errors?.status ? ( -
- {state.errors.status.map((error: string) => ( -

{error}

- ))} -
- ) : null} - - {state.message ? ( -
-

{state.message}

-
- ) : null}
+
{/* Invoice ID */} @@ -39,7 +33,6 @@ export default function EditInvoiceForm({ name="customerId" className="peer block w-full rounded-md border border-gray-200 py-2 pl-10 text-sm outline-2 placeholder:text-gray-500" defaultValue={invoice.customer_id} - aria-describedby="customer-error" >
- - {state.errors?.customerId ? ( -
- {state.errors.customerId.map((error: string) => ( -

{error}

- ))} -
- ) : null}
{/* Invoice Amount */} @@ -80,23 +61,10 @@ export default function EditInvoiceForm({ defaultValue={invoice.amount} placeholder="Enter USD amount" className="peer block w-full rounded-md border border-gray-200 py-2 pl-10 text-sm outline-2 placeholder:text-gray-500" - aria-describedby="amount-error" /> - - {state.errors?.amount ? ( -
- {state.errors.amount.map((error: string) => ( -

{error}

- ))} -
- ) : null} {/* Invoice Status */} @@ -140,24 +108,7 @@ export default function EditInvoiceForm({ - {state.errors?.status ? ( -
- {state.errors.status.map((error: string) => ( -

{error}

- ))} -
- ) : null} - - {state.message ? ( -
-

{state.message}

-
- ) : null}
= 10'} cpu: [arm64] os: [darwin] @@ -751,8 +748,8 @@ packages: dev: false optional: true - /@next/swc-darwin-arm64@13.5.7-canary.27: - resolution: {integrity: sha512-4ups4pgSufJk4oMgMGm9LeFeq3uJOL5Gu3Lzd4RQkoHwLO6NdM0jX5bNuQTr4YNS5sNcdIuQGXTraKAWkGhP9Q==} + /@next/swc-darwin-arm64@14.0.0: + resolution: {integrity: sha512-HQKi159jCz4SRsPesVCiNN6tPSAFUkOuSkpJsqYTIlbHLKr1mD6be/J0TvWV6fwJekj81bZV9V/Tgx3C2HO9lA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -769,8 +766,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.5.6: - resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} + /@next/swc-darwin-x64@13.5.7-canary.27: + resolution: {integrity: sha512-R4PO3dhiQ8n1iSCa+kZALLcgh5KenwVk5IaEJNkoKEhyrQ4sz4fertt+22Z6JJlzfFJQUKqZ6lJFBcMuSzIAHQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -778,8 +775,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.5.7-canary.27: - resolution: {integrity: sha512-R4PO3dhiQ8n1iSCa+kZALLcgh5KenwVk5IaEJNkoKEhyrQ4sz4fertt+22Z6JJlzfFJQUKqZ6lJFBcMuSzIAHQ==} + /@next/swc-darwin-x64@14.0.0: + resolution: {integrity: sha512-4YyQLMSaCgX/kgC1jjF3s3xSoBnwHuDhnF6WA1DWNEYRsbOOPWjcYhv8TKhRe2ApdOam+VfQSffC4ZD+X4u1Cg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -796,8 +793,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.5.6: - resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} + /@next/swc-linux-arm64-gnu@13.5.7-canary.27: + resolution: {integrity: sha512-k2O5AcG0jGEihS60BRKjx/ZIGe9GakmXibxFZcMx5Uoz9RuUPRpYNw5NlxW+vPmjm4GPEZwL2BykrOqeiYhvcw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -805,8 +802,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.5.7-canary.27: - resolution: {integrity: sha512-k2O5AcG0jGEihS60BRKjx/ZIGe9GakmXibxFZcMx5Uoz9RuUPRpYNw5NlxW+vPmjm4GPEZwL2BykrOqeiYhvcw==} + /@next/swc-linux-arm64-gnu@14.0.0: + resolution: {integrity: sha512-io7fMkJ28Glj7SH8yvnlD6naIhRDnDxeE55CmpQkj3+uaA2Hko6WGY2pT5SzpQLTnGGnviK85cy8EJ2qsETj/g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -823,8 +820,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.5.6: - resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} + /@next/swc-linux-arm64-musl@13.5.7-canary.27: + resolution: {integrity: sha512-7kN/tDn9J1exdKOLbCAS93oBJbU4Mhk0lSjBtGqK5G1Enz82ncpY1T2v2Vhr690ihwsLw1UAM24AlwZ0qQnBaQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -832,8 +829,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.5.7-canary.27: - resolution: {integrity: sha512-7kN/tDn9J1exdKOLbCAS93oBJbU4Mhk0lSjBtGqK5G1Enz82ncpY1T2v2Vhr690ihwsLw1UAM24AlwZ0qQnBaQ==} + /@next/swc-linux-arm64-musl@14.0.0: + resolution: {integrity: sha512-nC2h0l1Jt8LEzyQeSs/BKpXAMe0mnHIMykYALWaeddTqCv5UEN8nGO3BG8JAqW/Y8iutqJsaMe2A9itS0d/r8w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -850,8 +847,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.5.6: - resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} + /@next/swc-linux-x64-gnu@13.5.7-canary.27: + resolution: {integrity: sha512-qSh27B6Fv/QmQe4/yxLKICGdV1A3B5KNSwYyAy8loC/7bK+dB/w37vO//23iOndBgQJ/u1rC6B1gmMipqVV4rA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -859,8 +856,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.5.7-canary.27: - resolution: {integrity: sha512-qSh27B6Fv/QmQe4/yxLKICGdV1A3B5KNSwYyAy8loC/7bK+dB/w37vO//23iOndBgQJ/u1rC6B1gmMipqVV4rA==} + /@next/swc-linux-x64-gnu@14.0.0: + resolution: {integrity: sha512-Wf+WjXibJQ7hHXOdNOmSMW5bxeJHVf46Pwb3eLSD2L76NrytQlif9NH7JpHuFlYKCQGfKfgSYYre5rIfmnSwQw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -877,8 +874,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.5.6: - resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} + /@next/swc-linux-x64-musl@13.5.7-canary.27: + resolution: {integrity: sha512-ZpkAyXVe2xqupPfVCj9KzE4FZygLUTzvi3IHdR+wBt41pcEfihz5rhgtoE37WkAu7TkDJTdjW3Lbp39re4NDSw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -886,8 +883,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.5.7-canary.27: - resolution: {integrity: sha512-ZpkAyXVe2xqupPfVCj9KzE4FZygLUTzvi3IHdR+wBt41pcEfihz5rhgtoE37WkAu7TkDJTdjW3Lbp39re4NDSw==} + /@next/swc-linux-x64-musl@14.0.0: + resolution: {integrity: sha512-WTZb2G7B+CTsdigcJVkRxfcAIQj7Lf0ipPNRJ3vlSadU8f0CFGv/ST+sJwF5eSwIe6dxKoX0DG6OljDBaad+rg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -904,8 +901,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.5.6: - resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} + /@next/swc-win32-arm64-msvc@13.5.7-canary.27: + resolution: {integrity: sha512-wPGQ17Hs0XIytgFkFm385J43m3TUEK/Gvr+kqJUPja4/JIha1llCKR11W1whPHon4YQ+GhX8J8QmL09rulStsg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -913,8 +910,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.5.7-canary.27: - resolution: {integrity: sha512-wPGQ17Hs0XIytgFkFm385J43m3TUEK/Gvr+kqJUPja4/JIha1llCKR11W1whPHon4YQ+GhX8J8QmL09rulStsg==} + /@next/swc-win32-arm64-msvc@14.0.0: + resolution: {integrity: sha512-7R8/x6oQODmNpnWVW00rlWX90sIlwluJwcvMT6GXNIBOvEf01t3fBg0AGURNKdTJg2xNuP7TyLchCL7Lh2DTiw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -931,8 +928,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.5.6: - resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} + /@next/swc-win32-ia32-msvc@13.5.7-canary.27: + resolution: {integrity: sha512-SrEymZnyK70LUCJ8TdSma2T5jxjlo2RP35w1glG0a2vFWAQ4s23/1z7kRRNEO4GvQHHXQtD2y3uEL3RcZY12Sw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -940,8 +937,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.5.7-canary.27: - resolution: {integrity: sha512-SrEymZnyK70LUCJ8TdSma2T5jxjlo2RP35w1glG0a2vFWAQ4s23/1z7kRRNEO4GvQHHXQtD2y3uEL3RcZY12Sw==} + /@next/swc-win32-ia32-msvc@14.0.0: + resolution: {integrity: sha512-RLK1nELvhCnxaWPF07jGU4x3tjbyx2319q43loZELqF0+iJtKutZ+Lk8SVmf/KiJkYBc7Cragadz7hb3uQvz4g==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -958,8 +955,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.5.6: - resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} + /@next/swc-win32-x64-msvc@13.5.7-canary.27: + resolution: {integrity: sha512-vbdekFDbPmKuIhN6elPnE5srlsaNiF4j0txuEPlDGF6yn4dd4Tpiko3G1pJgqqrFwftjhtwommAmwJ17nrGnIA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -967,8 +964,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.5.7-canary.27: - resolution: {integrity: sha512-vbdekFDbPmKuIhN6elPnE5srlsaNiF4j0txuEPlDGF6yn4dd4Tpiko3G1pJgqqrFwftjhtwommAmwJ17nrGnIA==} + /@next/swc-win32-x64-msvc@14.0.0: + resolution: {integrity: sha512-g6hLf1SUko+hnnaywQQZzzb3BRecQsoKkF3o/C+F+dOA4w/noVAJngUVkfwF0+2/8FzNznM7ofM6TGZO9svn7w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3925,45 +3922,6 @@ packages: - babel-plugin-macros dev: false - /next@13.5.6(@babel/core@7.23.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} - engines: {node: '>=16.14.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - sass: - optional: true - dependencies: - '@next/env': 13.5.6 - '@swc/helpers': 0.5.2 - busboy: 1.6.0 - caniuse-lite: 1.0.30001541 - postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.23.0)(react@18.2.0) - watchpack: 2.4.0 - optionalDependencies: - '@next/swc-darwin-arm64': 13.5.6 - '@next/swc-darwin-x64': 13.5.6 - '@next/swc-linux-arm64-gnu': 13.5.6 - '@next/swc-linux-arm64-musl': 13.5.6 - '@next/swc-linux-x64-gnu': 13.5.6 - '@next/swc-linux-x64-musl': 13.5.6 - '@next/swc-win32-arm64-msvc': 13.5.6 - '@next/swc-win32-ia32-msvc': 13.5.6 - '@next/swc-win32-x64-msvc': 13.5.6 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false - /next@13.5.7-canary.27(@babel/core@7.23.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-a80Cp8kw6+FWxOEHAVqr4/uoQ4bD/E/JJmDm7+gQfl5oW4g84NnyKVt8B2hqwk8prjDnc/tQ88Ot+E6vZeVWsg==} engines: {node: '>=18.17.0'} @@ -4003,6 +3961,45 @@ packages: - babel-plugin-macros dev: false + /next@14.0.0(@babel/core@7.23.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J0jHKBJpB9zd4+c153sair0sz44mbaCHxggs8ryVXSFBuBqJ8XdE9/ozoV85xGh2VnSjahwntBZZgsihL9QznA==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.0.0 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001541 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.23.0)(react@18.2.0) + watchpack: 2.4.0 + optionalDependencies: + '@next/swc-darwin-arm64': 14.0.0 + '@next/swc-darwin-x64': 14.0.0 + '@next/swc-linux-arm64-gnu': 14.0.0 + '@next/swc-linux-arm64-musl': 14.0.0 + '@next/swc-linux-x64-gnu': 14.0.0 + '@next/swc-linux-x64-musl': 14.0.0 + '@next/swc-win32-arm64-msvc': 14.0.0 + '@next/swc-win32-ia32-msvc': 14.0.0 + '@next/swc-win32-x64-msvc': 14.0.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} dev: false