diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..a81532b --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,73 @@ +const people = [ + { + name: "Jane Cooper", + role: "Paradigm Representative", + imageUrl: + "https://images.unsplash.com/photo-1519345182560-3f2917c472ef?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=8&w=1024&h=1024&q=80", + linkedinUrl: "#", + }, + { + name: "Jane Cooper", + role: "Paradigm Representative", + imageUrl: + "https://images.unsplash.com/photo-1519345182560-3f2917c472ef?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=8&w=1024&h=1024&q=80", + linkedinUrl: "#", + }, + { + name: "Jane Cooper", + role: "Paradigm Representative", + imageUrl: + "https://images.unsplash.com/photo-1519345182560-3f2917c472ef?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=8&w=1024&h=1024&q=80", + linkedinUrl: "#", + }, +] + +export default async function About() { + return ( +
+
+
+ {" "} +
+
+
+

Meet our team

+

+ We’re a dynamic group of individuals who are passionate about what we do. +

+
+
    + {people.map((person) => ( +
  • + +

    + {person.name} +

    +

    {person.role}

    + +
  • + ))} +
+
+
+
+
+
+ ) +} diff --git a/app/api/chat/route.ts b/app/api/chat/route.ts new file mode 100644 index 0000000..48b0459 --- /dev/null +++ b/app/api/chat/route.ts @@ -0,0 +1,27 @@ +import { OpenAIStream, StreamingTextResponse } from 'ai' +import { Configuration, OpenAIApi } from 'openai-edge' + +// Create an OpenAI API client (that's edge friendly!) +const config = new Configuration({ + apiKey: process.env.OPENAI_API_KEY +}) +const openai = new OpenAIApi(config) + +// IMPORTANT! Set the runtime to edge +export const runtime = 'edge' + +export async function POST(req: Request) { + // Extract the `messages` from the body of the request + const { messages } = await req.json() + + // Ask OpenAI for a streaming chat completion given the prompt + const response = await openai.createChatCompletion({ + model: 'gpt-3.5-turbo', + stream: true, + messages + }) + // Convert the response into a friendly text-stream + const stream = OpenAIStream(response) + // Respond with the stream + return new StreamingTextResponse(stream) +} diff --git a/app/page.tsx b/app/page.tsx index 04fb184..b3b7f52 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,11 +1,37 @@ +import Link from "next/link" + export default async function Web() { return (
-

- IsaCon -

+
+
+
+
+

+ Your personal web development team +

+

+ We are a team of experienced web developers, designers and project managers. We build web + applications, websites and mobile apps for startups and established businesses. +

+
+ + Learn more + +
+
+
+
+ +
+
+
diff --git a/components/Chat/Chat.tsx b/components/Chat/Chat.tsx new file mode 100644 index 0000000..e35a83f --- /dev/null +++ b/components/Chat/Chat.tsx @@ -0,0 +1,23 @@ +"use client" +import { useChat } from "ai/react" + +export default function Chat() { + const { messages, input, handleInputChange, handleSubmit } = useChat() + + return ( +
+ {messages.map((m) => ( +
+ {m.role}: {m.content} +
+ ))} + +
+ +
+
+ ) +} diff --git a/components/Navbar/Navbar.tsx b/components/Navbar/Navbar.tsx index aae8922..c24a117 100644 --- a/components/Navbar/Navbar.tsx +++ b/components/Navbar/Navbar.tsx @@ -24,6 +24,11 @@ export default function Nav() { href: "/", current: currentRoute === "/", }, + { + label: "About", + href: "/about", + current: currentRoute === "/about", + }, { label: "Projects", href: "/projects", diff --git a/package.json b/package.json index 6175a02..7decb37 100644 --- a/package.json +++ b/package.json @@ -50,12 +50,14 @@ "@t3-oss/env-nextjs": "^0.6.0", "@tailwindcss/forms": "^0.5.4", "@vercel/otel": "^0.3.0", + "ai": "^2.1.31", "class-variance-authority": "^0.6.0", "framer-motion": "^10.15.0", "lodash": "^4.17.21", "mongodb": "^5.7.0", "next": "^13.3.0", "next-compose-plugins": "^2.2.1", + "openai-edge": "^1.2.2", "react": "^18.2.0", "react-dom": "^18.2.0", "resend": "^0.17.2", diff --git a/yarn.lock b/yarn.lock index 3486325..a276fff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7519,6 +7519,19 @@ aggregate-error@^4.0.0, aggregate-error@^4.0.1: clean-stack "^4.0.0" indent-string "^5.0.0" +ai@^2.1.31: + version "2.1.31" + resolved "https://registry.yarnpkg.com/ai/-/ai-2.1.31.tgz#22ca640e8413931c13541b407de5f2b1ee44530a" + integrity sha512-ihkimg9iP/C/OaxjYj9KgA4gPC9Rzw60Xv3+AWYrQ807L/NEF8sgZBmA1hv8/DC8KzMv/7N+a5HCQPDZXNUs+g== + dependencies: + eventsource-parser "1.0.0" + nanoid "3.3.6" + solid-swr-store "0.10.7" + sswr "2.0.0" + swr "2.2.0" + swr-store "0.10.6" + swrv "1.0.4" + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -9513,7 +9526,7 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -dequal@^2.0.2: +dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -10451,6 +10464,11 @@ events@^3.2.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +eventsource-parser@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-1.0.0.tgz#6332e37fd5512e3c8d9df05773b2bf9e152ccc04" + integrity sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g== + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -14342,7 +14360,7 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.1, nanoid@^3.3.4, nanoid@^3.3.6: +nanoid@3.3.6, nanoid@^3.3.1, nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -14940,6 +14958,11 @@ open@^9.1.0: is-inside-container "^1.0.0" is-wsl "^2.2.0" +openai-edge@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/openai-edge/-/openai-edge-1.2.2.tgz#0b1cd5aec2c366bbd25cdeba05399aa6eef73230" + integrity sha512-C3/Ao9Hkx5uBPv9YFBpX/x59XMPgPUU4dyGg/0J2sOJ7O9D98kD+lfdOc7v/60oYo5xzMGct80uFkYLH+X2qgw== + opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -16930,6 +16953,11 @@ socks@^2.6.2, socks@^2.7.1: ip "^2.0.0" smart-buffer "^4.2.0" +solid-swr-store@0.10.7: + version "0.10.7" + resolved "https://registry.yarnpkg.com/solid-swr-store/-/solid-swr-store-0.10.7.tgz#9511308f01250a1509efbfaad5b481be7517e436" + integrity sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g== + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -17059,6 +17087,13 @@ ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.4: dependencies: minipass "^5.0.0" +sswr@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sswr/-/sswr-2.0.0.tgz#db5e1f7c44addb8316de8e7efe23b7ea2cba090d" + integrity sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w== + dependencies: + swrev "^4.0.0" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -17362,6 +17397,30 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swr-store@0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/swr-store/-/swr-store-0.10.6.tgz#1856bda886e87dbed40c8c9874c1b1624d2e502d" + integrity sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw== + dependencies: + dequal "^2.0.3" + +swr@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.0.tgz#575c6ac1bec087847f4c86a39ccbc0043c834d6a" + integrity sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ== + dependencies: + use-sync-external-store "^1.2.0" + +swrev@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/swrev/-/swrev-4.0.0.tgz#83da6983c7ef9d71ac984a9b169fc197cbf18ff8" + integrity sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA== + +swrv@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/swrv/-/swrv-1.0.4.tgz#278b4811ed4acbb1ae46654972a482fd1847e480" + integrity sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -18115,6 +18174,11 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"