{
    "version": "https://jsonfeed.org/version/1",
    "title": "Hope's Blog",
    "home_page_url": "https://umutyildirim.com/blog",
    "description": "Hope's Blog",
    "items": [
        {
            "id": "https://umutyildirim.com/blog/langchain-supabase-vector-filtering",
            "content_html": "<p>Supabase, acclaimed as an open-source alternative to Firebase, offers a comprehensive toolkit including database, authentication, and storage solutions. Excelling in crafting Minimum Viable Products (MVPs) and hackathon creations, it's particularly adept for building RAG (Retrieval-Augmented Generation) applications. In this guide, I'll demonstrate how to leverage Supabase to enhance your RAG application's efficiency.</p>\n<p>Here's the workflow: Whenever a user uploads a document, we store its vector representation in Supabase. This vector acts as a unique fingerprint of the document's content. Later, when a query is raised, Supabase springs into action, searching for vectors that closely match the query. This search process efficiently retrieves the most relevant documents.</p>\n<p>An added layer of personalization ensures that users interact only with their content. We implement a filter to display documents created by the user, providing a tailored and secure user experience. This approach not only streamlines the search for relevant information but also maintains user data privacy and relevance.</p>\n<p>If you want to see the final product, check out the <a href=\"https://markai.umutyildirim.com/\" target=\"_blank\" rel=\"noopener noreferrer\">demo</a>. The source code is available on <a href=\"https://github.com/umuthopeyildirim/markai\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub</a>. We will build this application from scratch in another tutorial. However, for now, let's focus on the Supabase vector filtering.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_BuS1\"><p>In this tutorial, we'll use the <a href=\"https://js.langchain.com/docs/get_started/introduction\" target=\"_blank\" rel=\"noopener noreferrer\">Langchain JavaScript Client</a> to interact with the database. All of the examples are written in JavaScript.</p></div></div>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"how-langchain-works\">How Langchain Works?<a href=\"https://umutyildirim.com/blog/langchain-supabase-vector-filtering#how-langchain-works\" class=\"hash-link\" aria-label=\"Direct link to How Langchain Works?\" title=\"Direct link to How Langchain Works?\">​</a></h2>\n<p><strong>LangChain</strong> is a framework for developing applications powered by language models. It enables applications that:</p>\n<ul>\n<li><strong>Are context-aware</strong>: connect a language model to sources of context (prompt instructions, few shot examples, content to ground its response in, etc.)</li>\n<li><strong>Reason</strong>: rely on a language model to reason (about how to answer based on provided context, what actions to take, etc.)</li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Langchain Introduction\" src=\"https://umutyildirim.com/assets/images/langchain-introduction-57037985efc2c2daba84d478ca3e6d46.png\" width=\"1394\" height=\"794\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"how-to-setup-database\">How to setup database?<a href=\"https://umutyildirim.com/blog/langchain-supabase-vector-filtering#how-to-setup-database\" class=\"hash-link\" aria-label=\"Direct link to How to setup database?\" title=\"Direct link to How to setup database?\">​</a></h2>\n<p>In this tutorial we will mainly focus on Supabase PostgreSQL database. You can use any other database as well. However, you need to make sure that your database supports vector filtering. You can check the <a href=\"https://python.langchain.com/docs/integrations/vectorstores/\" target=\"_blank\" rel=\"noopener noreferrer\">Langchain documentation</a> for more information.</p>\n<p>Start by creating a new project on <a href=\"https://supabase.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Supabase</a>. You can use the free plan for this tutorial. After creating your project, navigate to <strong>SQL Editor</strong> and create a new table called <code>documents</code>. You can use the following SQL query to create the table.</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">-- Enable the pgvector extension to work with embedding vectors</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">create</span><span class=\"token plain\"> extension vector</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">-- Create a table to store your documents</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">create</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">table</span><span class=\"token plain\"> documents </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  id bigserial </span><span class=\"token keyword\" style=\"font-style:italic\">primary</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">key</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  content </span><span class=\"token keyword\" style=\"font-style:italic\">text</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">-- corresponds to Document.pageContent</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  metadata jsonb</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">-- corresponds to Document.metadata</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  embedding vector</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1536</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">-- 1536 works for OpenAI embeddings, change if needed</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">-- Create a function to search for documents</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">create</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> match_documents </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  query_embedding vector</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1536</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  match_count </span><span class=\"token keyword\" style=\"font-style:italic\">int</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">DEFAULT</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">null</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  filter jsonb </span><span class=\"token keyword\" style=\"font-style:italic\">DEFAULT</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'{}'</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">returns</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">table</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  id </span><span class=\"token keyword\" style=\"font-style:italic\">bigint</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  content </span><span class=\"token keyword\" style=\"font-style:italic\">text</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  metadata jsonb</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  embedding jsonb</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  similarity </span><span class=\"token keyword\" style=\"font-style:italic\">float</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">language</span><span class=\"token plain\"> plpgsql</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> $$</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">#variable_conflict use_column</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">begin</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">return</span><span class=\"token plain\"> query</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">select</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    metadata</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">embedding::</span><span class=\"token keyword\" style=\"font-style:italic\">text</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\">::jsonb </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> embedding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">documents</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">embedding </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;=&gt;</span><span class=\"token plain\"> query_embedding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> similarity</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> documents</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">where</span><span class=\"token plain\"> metadata @</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> filter</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">order</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">by</span><span class=\"token plain\"> documents</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">embedding </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;=&gt;</span><span class=\"token plain\"> query_embedding</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">limit</span><span class=\"token plain\"> match_count</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">end</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$$</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>First step is done 🎉.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"how-to-add-data-to-database\">How to add data to database?<a href=\"https://umutyildirim.com/blog/langchain-supabase-vector-filtering#how-to-add-data-to-database\" class=\"hash-link\" aria-label=\"Direct link to How to add data to database?\" title=\"Direct link to How to add data to database?\">​</a></h2>\n<p>Now that we have our database ready, we can start adding data to it. Since we need to get relevant data for our queries, we need to add relevant metadata to our documents. Your SQL row should look like this;</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Supabase Table Editor\" src=\"https://umutyildirim.com/assets/images/Supabase-Table-Editor-8ea959ad3ed10a0e830e30bf222a2ed1.png\" width=\"3394\" height=\"1992\" class=\"img_ev3q\"></p>\n<p>Did you catch the <code>brandId</code> field? We will use this field to filter the documents. We will only show the documents that are created by the user. This way, we can provide a personalized experience to our users.</p>\n<p>But how do we do that in our application? Let's take a look at the code. Keep in mind I'm using Next.js for this tutorial. You can use any other framework as well.</p>\n<div class=\"language-js codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">NextRequest</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">NextResponse</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"next/server\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">RecursiveCharacterTextSplitter</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">CharacterTextSplitter</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/text_splitter\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> createClient </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"@supabase/supabase-js\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">SupabaseVectorStore</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/vectorstores/supabase\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">OpenAIEmbeddings</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/embeddings/openai\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> auth </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'@clerk/nextjs'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> runtime </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"edge\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">handleExtension</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">extension</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> string</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> </span><span class=\"token parameter literal-property property\">content</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> string</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> </span><span class=\"token parameter literal-property property\">brand_id</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> string</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> </span><span class=\"token parameter literal-property property\">client</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">let</span><span class=\"token plain\"> splitter</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">extension </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"txt\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    splitter </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">CharacterTextSplitter</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">separator</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\" \"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">chunkSize</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">256</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">chunkOverlap</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">20</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> language </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> extension </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"md\"</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"markdown\"</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"html\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    splitter </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">RecursiveCharacterTextSplitter</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">fromLanguage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">language</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">chunkSize</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">256</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">chunkOverlap</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">20</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> splitDocuments </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> splitter</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">createDocuments</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">brand_id</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> brand_id </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> vectorstore </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">SupabaseVectorStore</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">fromDocuments</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    splitDocuments</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">OpenAIEmbeddings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">openAIApiKey</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> process</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">NEXT_SECRET_OPENAI_API_KEY</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">configuration</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token literal-property property\">baseURL</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"https://gateway.ai.cloudflare.com/v1/********/********/openai\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      client</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">tableName</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"documents\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">queryName</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"match_documents\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">POST</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">req</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> </span><span class=\"token parameter maybe-class-name\">NextRequest</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> userId</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> getToken </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token plain\">userId</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">NextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">error</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Not logged in.\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">status</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">403</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> token </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getToken</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">template</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"supabase\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> body </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> req</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> brand_id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> knowledge_id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> body</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Get file extension</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> extension </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">split</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\".\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">pop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Accept these file types</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Markdown, Text, HTML</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"md\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"txt\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"html\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">includes</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">extension</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">NextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">error</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"File type not supported.\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Please upload a markdown, text, or html file.\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">join</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\\n\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">status</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">403</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> client </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">createClient</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      process</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">NEXT_PUBLIC_SUPABASE_URL</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      process</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">NEXT_PUBLIC_SUPABASE_KEY</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">global</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token literal-property property\">headers</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token string-property property\">\"Authorization\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">Bearer </span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">token</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">handleExtension</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">extension</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> brand_id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> client</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">NextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">ok</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">status</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">200</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">NextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">error</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">status</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">500</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>Now step by step analyze the code using pseudo code.</p>\n<ol>\n<li>When user adds a new document, it calls a POST API endpoint. We call it <code>/api/ingest/</code> in our application.</li>\n<li>Ingest API endpoint gets the user's token from Clerk and <code>userId</code> user sent when they called the request.</li>\n<li>We make sure that the user is logged in. If not, we return an error.</li>\n<li>We get the file extension from the file name. We only accept <code>md</code>, <code>txt</code>, and <code>html</code> files. So we make sure that the file extension is one of them. If not, we return an error.</li>\n<li>We create a new Supabase client using the token we got from Clerk.</li>\n<li>We call the <code>handleExtension</code> function with the file extension, content, brand_id, and client(supabase).</li>\n<li>We split the content into chunks and create documents using the <code>CharacterTextSplitter</code> class.</li>\n<li>We add <code>brand_id</code> to the metadata of the document. This way, we can filter the documents later.</li>\n<li>We call the <code>SupabaseVectorStore.fromDocuments</code> function to add the documents to the database. This function will add the vector representation of the document to the database.</li>\n<li>We return a success message to the user.</li>\n</ol>\n<p>We split our data into chunks because we need to make sure that the vector representation of the document is not too big. If it's too big, it will make our KNN search more harder. So we split the document into chunks and store the vector representation of each chunk in the database. After that we converted content to vector representation using OpenAI Embeddings. You can use any other embedding as well. You can check the <a href=\"https://api.js.langchain.com/classes/embeddings_base.Embeddings.html\" target=\"_blank\" rel=\"noopener noreferrer\">Langchain documentation</a> for more information.</p>\n<p>You might realized that we are using <code>brand_id</code> instead of <code>user_id</code>. This is because we want to make sure that the other users can see files and embeddings created by other users in same organization. If you want to make sure that users can only see their own files, you can use <code>user_id</code> instead of <code>brand_id</code>. You can also use both of them if you want to.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"how-to-query-the-database\">How to query the database?<a href=\"https://umutyildirim.com/blog/langchain-supabase-vector-filtering#how-to-query-the-database\" class=\"hash-link\" aria-label=\"Direct link to How to query the database?\" title=\"Direct link to How to query the database?\">​</a></h2>\n<p>Now that we have some context in our database we can start querying it to get relevant data. While Langchain requests this data from the database, all searching and filtering is done on Supabase side using PostgreSQL functions. Now let's take a look at the code and then analyze it.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_BuS1\"><p>In this example I used Agent's API to query the database. This will allow GPT4 to decide what to search for. You can also use retrieval to force context search but I don't recomend it since it will make your database slower.</p></div></div>\n<div class=\"language-js codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">NextRequest</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">NextResponse</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"next/server\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Message</span><span class=\"token imports\"> </span><span class=\"token imports keyword module\" style=\"font-style:italic\">as</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">VercelChatMessage</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">StreamingTextResponse</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"ai\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> createClient </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"@supabase/supabase-js\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">ChatOpenAI</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/chat_models/openai\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">SupabaseVectorStore</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/vectorstores/supabase\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">AIMessage</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">ChatMessage</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">HumanMessage</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/schema\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">OpenAIEmbeddings</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/embeddings/openai\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  createRetrieverTool</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  </span><span class=\"token imports maybe-class-name\">OpenAIAgentTokenBufferMemory</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\"></span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/agents/toolkits\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">ChatMessageHistory</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/memory\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> initializeAgentExecutorWithOptions </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"langchain/agents\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> runtime </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"edge\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">convertVercelMessageToLangChainMessage</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">message</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> </span><span class=\"token parameter maybe-class-name\">VercelChatMessage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">role</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"user\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">HumanMessage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">else</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">role</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"assistant\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">AIMessage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">ChatMessage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">role</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">TEMPLATE</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">You are an helpful assistant named \"MarkAI\". If you don't know how to answer a question, use the available tools to look up relevant information.</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">POST</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">req</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> </span><span class=\"token parameter maybe-class-name\">NextRequest</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> body </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> req</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> brand_id </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> body</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">brand_id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Check brand id for validation</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token plain\">brand_id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">NextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">error</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"brand_id is either empty or wrong.\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">status</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">400</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> messages </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">body</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">messages</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">??</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">filter</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">message</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> </span><span class=\"token parameter maybe-class-name\">VercelChatMessage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">role</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"user\"</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">||</span><span class=\"token plain\"> message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">role</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"assistant\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> returnIntermediateSteps </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> body</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">show_intermediate_steps</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> previousMessages </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> messages</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">slice</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> currentMessageContent </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> messages</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">messages</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">length</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> model </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">ChatOpenAI</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">openAIApiKey</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> process</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">NEXT_SECRET_OPENAI_API_KEY</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">modelName</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"gpt-3.5-turbo\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// This was used so I could track usage of the model in Cloudflare Dashboard</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// for more info: https://developers.cloudflare.com/ai-gateway/</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">configuration</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">baseURL</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"https://gateway.ai.cloudflare.com/v1/**************/*******/openai\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> client </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">createClient</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      process</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">NEXT_PUBLIC_SUPABASE_URL</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      process</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">NEXT_PUBLIC_SUPABASE_KEY</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> vectorstore </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">SupabaseVectorStore</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">OpenAIEmbeddings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">openAIApiKey</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> process</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">NEXT_SECRET_OPENAI_API_KEY</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      client</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">tableName</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"documents\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">queryName</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"match_documents\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">filter</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token string-property property\">\"brand_id\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> brand_id</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> chatHistory </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">ChatMessageHistory</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      previousMessages</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">map</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">convertVercelMessageToLangChainMessage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> memory </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">OpenAIAgentTokenBufferMemory</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">llm</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> model</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">memoryKey</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"chat_history\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">outputKey</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"output\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      chatHistory</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> retriever </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> vectorstore</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">asRetriever</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> tool </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">createRetrieverTool</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">retriever</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">name</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"search_latest_knowledge\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">description</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Searches and returns up-to-date general information.\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> executor </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">initializeAgentExecutorWithOptions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">tool</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> model</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">agentType</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"openai-functions\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      memory</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">returnIntermediateSteps</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">verbose</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">agentArgs</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">prefix</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">TEMPLATE</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> result </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> executor</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">call</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">input</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> currentMessageContent</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">returnIntermediateSteps</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">NextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">output</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">output</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">intermediate_steps</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">intermediateSteps</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">status</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">200</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Agent executors don't support streaming responses (yet!), so stream back the complete response one</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// character at a time to simluate it.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> textEncoder </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">TextEncoder</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> fakeStream </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">ReadableStream</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">start</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">controller</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> character </span><span class=\"token keyword\" style=\"font-style:italic\">of</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">output</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            controller</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">enqueue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">textEncoder</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">encode</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">character</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Promise</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">resolve</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setTimeout</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">resolve</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">20</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          controller</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">close</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">StreamingTextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">fakeStream</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">NextResponse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">error</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">status</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">500</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>Now step by step analyze the code using pseudo code;</p>\n<ol>\n<li>\n<p><strong>Import Dependencies:</strong> Import necessary modules from Next.js, ai, @supabase/supabase-js, and langchain.</p>\n</li>\n<li>\n<p><strong>Declare Runtime Environment:</strong> Define <code>runtime</code> as \"edge,\" indicating the environment where the code will run.</p>\n</li>\n<li>\n<p><strong>Convert Function:</strong> <code>convertVercelMessageToLangChainMessage</code> converts messages from VercelChatMessage format to LangChain's message format based on the role (user, assistant, or other).</p>\n</li>\n<li>\n<p><strong>Define Assistant Template:</strong> Set <code>TEMPLATE</code> as a prompt for the AI assistant.</p>\n</li>\n<li>\n<p><strong>POST Function:</strong></p>\n<ul>\n<li><strong>Initialize:</strong> Define an asynchronous <code>POST</code> function for handling HTTP POST requests.</li>\n<li><strong>Parse Request Body:</strong> Extract <code>brand_id</code> and <code>messages</code> from the request body.</li>\n<li><strong>Validate Brand ID:</strong> Return an error response if <code>brand_id</code> is missing or invalid.</li>\n<li><strong>Filter Messages:</strong> Only keep messages from users or assistants.</li>\n<li><strong>Extract Content:</strong> Get the content of the current message and previous messages.</li>\n<li><strong>Setup AI Model:</strong> Initialize <code>ChatOpenAI</code> with GPT-3.5 model and configuration for Cloudflare AI Gateway.</li>\n<li><strong>Supabase Client:</strong> Create a Supabase client for database interactions.</li>\n<li><strong>Vector Store:</strong> Initialize <code>SupabaseVectorStore</code> with OpenAI embeddings, Supabase client, and table configuration.</li>\n<li><strong>Chat History:</strong> Create a chat history object from previous messages.</li>\n<li><strong>Memory:</strong> Setup <code>OpenAIAgentTokenBufferMemory</code> using the model and chat history.</li>\n<li><strong>Retriever Tool:</strong> Initialize a retriever tool for fetching up-to-date information.</li>\n<li><strong>Executor:</strong> Prepare <code>executor</code> with tools, model, memory, and other configurations.</li>\n<li><strong>Execute AI Model:</strong> Call the executor with the current message and capture the result.</li>\n<li><strong>Return Response:</strong> If <code>returnIntermediateSteps</code> is true, return output and intermediate steps; otherwise, stream the response character by character.</li>\n<li><strong>Error Handling:</strong> Catch and return errors in a JSON response.</li>\n</ul>\n</li>\n<li>\n<p><strong>Runtime Configuration:</strong> The code configures and executes in an edge environment, suitable for high-performance and low-latency applications.</p>\n</li>\n</ol>\n<p>The code essentially sets up a sophisticated chatbot that can handle user queries by integrating various AI and database technologies. It supports real-time interactions and can provide detailed responses, including intermediate steps of the AI's reasoning process.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"conclusion\">Conclusion<a href=\"https://umutyildirim.com/blog/langchain-supabase-vector-filtering#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>I trust this guide clarified the process of integrating Supabase vector filtering with Langchain, a challenge that took me two days to overcome. My aim is to simplify your experience. Should you have inquiries, please don't hesitate to contact me at <a href=\"mailto:hope@umutyildirim.com\" target=\"_blank\" rel=\"noopener noreferrer\">hope@umutyildirim.com</a> or raise an issue on the GitHub repository of my demo app <a href=\"https://github.com/umuthopeyildirim/markai\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.</p>",
            "url": "https://umutyildirim.com/blog/langchain-supabase-vector-filtering",
            "title": "Langchain + Supabase Vector Filtering for RAG Applications",
            "summary": "Supabase vector filtering for RAG applications.",
            "date_modified": "2023-09-10T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "OpenAI",
                "ChatGPT",
                "Supabase",
                "RAG",
                "Vector Database",
                "Vector Filtering"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio",
            "content_html": "<p>ChatGPT and similar large language models (LLMs) are currently at the forefront of every developer's mind, emerging as the latest trend in 'Silicon Valley'. The hype is real, and the possibilities are endless. But how do you get started? In this article, I will show you how to create a simple chatbot using ChatGPT and Voiceflow. I will also show you how to add it to your portfolio using Docusaurus.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"lets-understand-the-basics-first\">Let's understand the basics first<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#lets-understand-the-basics-first\" class=\"hash-link\" aria-label=\"Direct link to Let's understand the basics first\" title=\"Direct link to Let's understand the basics first\">​</a></h2>\n<p>Before delving into the creation of a ChatGPT-based chatbot, it's essential to grasp the fundamental principles underlying ChatGPT. Developed by OpenAI, ChatGPT stands as a prominent example of a large language model (LLM), distinguished by its proficiency in producing text that closely resembles human writing. This capability stems from its design as a transformer model, a type of architecture that has significantly advanced the field of natural language processing (NLP).</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"ChatGPT trying its best\" src=\"https://umutyildirim.com/assets/images/ChatGPTMeme-08aa35ab1cb7d694defd3f0870c7cd68.jpg\" width=\"660\" height=\"829\" class=\"img_ev3q\"></p>\n<p>The core strength of ChatGPT lies in its extensive training on a diverse array of text sources. This comprehensive dataset equips the model with a broad understanding, enabling it to engage in and respond to a wide spectrum of topics with a natural, conversational tone.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"ChatGPT Inaccurate\" src=\"https://umutyildirim.com/assets/images/chatgpt-inaccurate-355182494a535056cd87e2bd7f460bf3.jpg\" width=\"680\" height=\"701\" class=\"img_ev3q\"></p>\n<p>However, the reliance on pre-existing data also introduces a limitation. ChatGPT's knowledge is confined to its training material, meaning it lacks the ability to generate information beyond its training scope. This is where innovative technologies like Retrieval-Augmented Generation (RAG) play a pivotal role. RAG merges the transformer model's capabilities with a search engine's prowess. This combination allows ChatGPT to not only generate responses based on its internal knowledge but also to pull in and utilize relevant, up-to-date information from external sources, such as the internet or specialized vector databases. This enhancement significantly broadens the model's applicability and accuracy, making it a more dynamic tool in the realm of NLP.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"ChatGPT Retrival\" src=\"https://umutyildirim.com/assets/images/Langchain-Retrieval-c42d68c3d092b85f50d08d4cc171fc25.jpg\" width=\"4256\" height=\"1472\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"lets-build-a-chatbot\">Let's build a chatbot<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#lets-build-a-chatbot\" class=\"hash-link\" aria-label=\"Direct link to Let's build a chatbot\" title=\"Direct link to Let's build a chatbot\">​</a></h2>\n<p>Now that we have a basic understanding of ChatGPT, let's build a chatbot using Voiceflow. Voiceflow is a no-code platform that allows you to create voice and chat-based applications. It is a great tool for beginners and experienced developers alike, as it provides a simple, intuitive interface that enables you to build a functional chatbot in a matter of minutes. It also offers 'Knowledge Base' integration, which is essential for our chatbot project.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"create-a-new-assistant\">Create a new assistant<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#create-a-new-assistant\" class=\"hash-link\" aria-label=\"Direct link to Create a new assistant\" title=\"Direct link to Create a new assistant\">​</a></h3>\n<p>First, create a new assistant by clicking on the 'Create Assistant' button on the top right corner of the screen. Then, name your chatbot and select the 'Chat' option and don't forget to select your preferred language. Finally, click on the 'Create Assistant' button to create your assistant.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Creator\" src=\"https://umutyildirim.com/assets/images/Voiceflow-Creator-73be0fe96c0565e08457c291418b62c7.png\" width=\"1900\" height=\"1035\" class=\"img_ev3q\"></p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Creator Filles\" src=\"https://umutyildirim.com/assets/images/Voiceflow-Creator-Filled-0f9c7f3299fd545234ce79cdb13fe703.png\" width=\"1900\" height=\"1035\" class=\"img_ev3q\"></p>\n<p>Congratulations! You have successfully created your first assistant. Now, let's move on to the next step and add some knowledge to your assistant.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"change-response-type-to-knowledge-base\">Change response type to 'Knowledge Base'<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#change-response-type-to-knowledge-base\" class=\"hash-link\" aria-label=\"Direct link to Change response type to 'Knowledge Base'\" title=\"Direct link to Change response type to 'Knowledge Base'\">​</a></h3>\n<p>Since we want a chatbot that anwsers questions based on your personal knowledge base, we need to change the response type to 'Knowledge Base'. To do that, click on the first block on 'AI response output' and select the 'Knowledge Base' option. Finally, click on the 'Save' button to save your changes.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Knowledge Base\" src=\"https://umutyildirim.com/assets/images/Voiceflow-Designer2-acf2e8ed6aeca7ecc27cf32a5fa91f0f.png\" width=\"1900\" height=\"1035\" class=\"img_ev3q\"></p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>Update</div><div class=\"admonitionContent_BuS1\"><p>Voiceflow has changed the way your knowledge base is used. Instead of <a href=\"https://python.langchain.com/docs/modules/data_connection/\" target=\"_blank\" rel=\"noopener noreferrer\">Retrieval</a> method they are now using <a href=\"https://python.langchain.com/docs/modules/agents/\" target=\"_blank\" rel=\"noopener noreferrer\">Agents</a> to grap relavent information from your knowledge base. This is a great improvement and makes your chatbot more accurate.</p></div></div>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Knowledge Base\" src=\"https://umutyildirim.com/assets/images/Voiceflow-Designer-ed6efa5c1cf358f1587fe6ed14e45b3a.png\" width=\"1900\" height=\"1035\" class=\"img_ev3q\"></p>\n<p>Well now your chatbot is ready to answer questions but it doesn't have any knowledge yet. Let's add some knowledge to your assistant.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"add-knowledge-to-your-assistant\">Add knowledge to your assistant<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#add-knowledge-to-your-assistant\" class=\"hash-link\" aria-label=\"Direct link to Add knowledge to your assistant\" title=\"Direct link to Add knowledge to your assistant\">​</a></h3>\n<p>To add knowledge to your assistant you need to prepare text, PDF, DOCX or your existing website. After that, you need to upload it to Voiceflow. Once you have uploaded your knowledge, you can start adding it to your assistant.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Knowledge Base\" src=\"https://umutyildirim.com/assets/images/Voiceflow-KnowledgeBase-2d6ea302fc0178e25935ee2c161301e8.png\" width=\"1900\" height=\"1035\" class=\"img_ev3q\"></p>\n<p>To do that, click on the 'Add Knowledge' button on the top right corner of the screen. Then, select the 'Upload' option and upload your knowledge. Finally, click on the 'Add Knowledge' button to add your knowledge to your assistant.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Knowledge Base Filed\" src=\"https://umutyildirim.com/assets/images/Voiceflow-KnowledgeBase-Filled-66317ff0387da97d189af4f2875dba7d.png\" width=\"1900\" height=\"1035\" class=\"img_ev3q\"></p>\n<p>Congratulations! You have successfully added knowledge to your assistant. Now, let's move on to the next step and test your assistant.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"test-your-assistant\">Test your assistant<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#test-your-assistant\" class=\"hash-link\" aria-label=\"Direct link to Test your assistant\" title=\"Direct link to Test your assistant\">​</a></h3>\n<p>WOW in less then 10 minutes you have created your first chatbot. Now, let's test your assistant. To do that, click on the 'Run' button on the top right corner of the screen or simply press 'R' button on your keyboard. Then, click on the 'Run Test' button to start testing your assistant.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Chatbt Test First\" src=\"https://umutyildirim.com/assets/images/Voiceflow-BotTestFirst-081d00257405c2738b816d5b9d3700d0.png\" width=\"1900\" height=\"1035\" class=\"img_ev3q\"></p>\n<p>Let's start asking some easy questions. For example, ask your chatbot 'Who is <em>your name</em>?' or 'What is <em>your name</em>'s current employer?'. If you have added your personal information to your knowledge base, your chatbot should be able to answer your questions.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow First Test\" src=\"https://umutyildirim.com/assets/images/Voiceflow-FirstTest-5d3230903ddbe6e2fdb38064129b4bde.png\" width=\"321\" height=\"989\" class=\"img_ev3q\"></p>\n<p>If you don't see any answers you are either missing some information in your knowledge base or you have not added your knowledge base to your assistant. If you have added your knowledge base to your assistant, you can check if you have added your knowledge base to your assistant by clicking on the 'Knowledge Base' button on the top right corner of the screen.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"add-your-chatbot-to-your-portfolio\">Add your chatbot to your portfolio<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#add-your-chatbot-to-your-portfolio\" class=\"hash-link\" aria-label=\"Direct link to Add your chatbot to your portfolio\" title=\"Direct link to Add your chatbot to your portfolio\">​</a></h3>\n<p>If your portfolio is HTML based, you can add your chatbot to your portfolio by adding the following code to your HTML file.</p>\n<div class=\"language-html codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-html codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&lt;</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\">script</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\"> </span><span class=\"token tag attr-name\" style=\"color:rgb(255, 203, 107)\">type</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:rgb(199, 146, 234)\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:rgb(199, 146, 234)\">\"</span><span class=\"token tag attr-value\" style=\"color:rgb(255, 85, 114)\">text/javascript</span><span class=\"token tag attr-value punctuation\" style=\"color:rgb(199, 146, 234)\">\"</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&gt;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">  </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript keyword\" style=\"font-style:italic\">function</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript parameter\">d</span><span class=\"token script language-javascript parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token script language-javascript parameter\"> t</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">    </span><span class=\"token script language-javascript keyword\" style=\"font-style:italic\">var</span><span class=\"token script language-javascript\"> v </span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token script language-javascript\"> d</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript method function property-access\" style=\"color:rgb(130, 170, 255)\">createElement</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript\">t</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">      s </span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token script language-javascript\"> d</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript method function property-access\" style=\"color:rgb(130, 170, 255)\">getElementsByTagName</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript\">t</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token script language-javascript number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">    v</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript method-variable function-variable method function property-access\" style=\"color:rgb(130, 170, 255)\">onload</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript keyword\" style=\"font-style:italic\">function</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">      </span><span class=\"token script language-javascript dom variable\" style=\"color:rgb(191, 199, 213)\">window</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript property-access\">voiceflow</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript property-access\">chat</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript method function property-access\" style=\"color:rgb(130, 170, 255)\">load</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">        </span><span class=\"token script language-javascript literal-property property\">verify</span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token script language-javascript literal-property property\">projectID</span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript string\" style=\"color:rgb(195, 232, 141)\">'your project id'</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">        </span><span class=\"token script language-javascript literal-property property\">url</span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript string\" style=\"color:rgb(195, 232, 141)\">'https://general-runtime.voiceflow.com'</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">        </span><span class=\"token script language-javascript literal-property property\">versionID</span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript string\" style=\"color:rgb(195, 232, 141)\">'production'</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">      </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">    </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">    v</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript property-access\">src</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript string\" style=\"color:rgb(195, 232, 141)\">'https://cdn.voiceflow.com/widget/bundle.mjs'</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">    v</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript property-access\">type</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript string\" style=\"color:rgb(195, 232, 141)\">'text/javascript'</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">    s</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript property-access\">parentNode</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token script language-javascript method function property-access\" style=\"color:rgb(130, 170, 255)\">insertBefore</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript\">v</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token script language-javascript\"> s</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\">  </span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token script language-javascript dom variable\" style=\"color:rgb(191, 199, 213)\">document</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token script language-javascript\"> </span><span class=\"token script language-javascript string\" style=\"color:rgb(195, 232, 141)\">'script'</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token script language-javascript punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token script language-javascript\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token script language-javascript\"></span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&lt;/</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\">script</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&gt;</span><br></span></code></pre></div></div>\n<p>You can also costumize your chatbot by checking out integrations tab on Voiceflow.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Integrations\" src=\"https://umutyildirim.com/assets/images/Voiceflow-Integrations-d700c3127b584bcb8a1f80d38b073ee2.png\" width=\"1211\" height=\"1318\" class=\"img_ev3q\"></p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"add-your-chatbot-to-your-docuaurus-portfolio\">Add your chatbot to your Docuaurus portfolio<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#add-your-chatbot-to-your-docuaurus-portfolio\" class=\"hash-link\" aria-label=\"Direct link to Add your chatbot to your Docuaurus portfolio\" title=\"Direct link to Add your chatbot to your Docuaurus portfolio\">​</a></h3>\n<p>If your portfolio is based on Docuaurus, you can add your chatbot to your portfolio by following these steps.</p>\n<p>Create a new file called <code>voiceflow.js</code> in your <code>src/theme</code> folder and add the following code to it.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">ExecutionEnvironment</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'@docusaurus/ExecutionEnvironment'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token maybe-class-name\">ExecutionEnvironment</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">canUseDOM</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">d</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> t</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> v </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> d</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">createElement</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">t</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      s </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> d</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getElementsByTagName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">t</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    v</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method-variable function-variable method function property-access\" style=\"color:rgb(130, 170, 255)\">onload</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token dom variable\" style=\"color:rgb(191, 199, 213)\">window</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">voiceflow</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">chat</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">load</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">verify</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">projectID</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'64bad5417ef5eb00077b0c2d'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">url</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'https://general-runtime.voiceflow.com'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">versionID</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'production'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    v</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">src</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'https://cdn.voiceflow.com/widget/bundle.mjs'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    v</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">type</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'text/javascript'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    s</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">parentNode</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">insertBefore</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> s</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token dom variable\" style=\"color:rgb(191, 199, 213)\">document</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'script'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>Then, add the following code to your <code>docusaurus.config.js</code> file.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">clientModules</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">require</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">resolve</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./src/theme/voiceflow.js'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><br></span></code></pre></div></div>\n<p>and you are done. Now, you can start your local server by running <code>yarn start</code> and test your chatbot.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Voiceflow Docusaurus\" src=\"https://umutyildirim.com/assets/images/Voiceflow-Docusaurus-49e17a5ea2870bb21ba48c642b2de27c.png\" width=\"4064\" height=\"2334\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"conclusion\">Conclusion<a href=\"https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>This guide demonstrated how to enhance your tech portfolio by integrating ChatGPT into a chatbot project, using Voiceflow and Docusaurus. It's a testament to the ease of using advanced AI in modern web development, showcasing your skills in navigating emerging technologies. This project is not just a technical achievement, but a step towards future innovations in AI. Keep exploring and embracing new tech frontiers!</p>",
            "url": "https://umutyildirim.com/blog/add-chatgpt-to-your-portfolio",
            "title": "Add ChatGPT to your portfolio",
            "summary": "In this article, I will show you how to create a simple chatbot using ChatGPT and Voiceflow. I will also show you how to add it to your portfolio using Docusaurus.",
            "date_modified": "2023-07-21T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "OpenAI",
                "ChatGPT",
                "Docusaurus",
                "JavaScript",
                "Voiceflow",
                "Chatbot"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/how-i-use-my-raspberry-pi",
            "content_html": "<p>Raspberry Pi, come out of the closet! It's time for you to shine! I'll show you how I give my Pi a good workout and I'll teach you how to do the same in this post. Let's get physical (with technology)!</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"cloudflare-tunnel-optional\">Cloudflare Tunnel (Optional)<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#cloudflare-tunnel-optional\" class=\"hash-link\" aria-label=\"Direct link to Cloudflare Tunnel (Optional)\" title=\"Direct link to Cloudflare Tunnel (Optional)\">​</a></h2>\n<p>Cloudflare Tunnel allows you to access your Raspberry Pi without publicly available IP address. So let's SSH to our Pi and install <code>cloudflared</code>.</p>\n<p>You don't need to do this! But I highly suggest using Cloudflare Tunnel this will make your Raspberry Pi available to internet so you can access your Pi via internet.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"install-required-softwares\">Install Required Softwares<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#install-required-softwares\" class=\"hash-link\" aria-label=\"Direct link to Install Required Softwares\" title=\"Direct link to Install Required Softwares\">​</a></h3>\n<ol>\n<li>Our first task is to perform an update of the package list as well as upgrade any out-of-date packages. You can perform both of these tasks using the following command in the terminal.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo apt update</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo apt upgrade</span><br></span></code></pre></div></div>\n<ol start=\"2\">\n<li>Once the update completes, we must ensure we have both the “<code>curl</code>” and “<code>lsb-release</code>” packages. Install both of these packages by using the command below in the terminal.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo apt install curl lsb-release</span><br></span></code></pre></div></div>\n<ol start=\"3\">\n<li>With all the required packages in place, we can finally grab the GPG key for the Cloudflared repository and store it on our Raspberry Pi. A GPG key is crucial to verify the packages we are installing are valid and belong to the repository.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">curl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg &gt;/dev/null</span><br></span></code></pre></div></div>\n<ol start=\"4\">\n<li>With the GPG key saved into our keyrings folder, our next step is to add the Cloudflared repository to our Raspberry Pi. You can add</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">echo \"deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main\" | sudo tee  /etc/apt/sources.list.d/cloudflared.list</span><br></span></code></pre></div></div>\n<ol start=\"5\">\n<li>As we have made changes to the available repositories, we will need to perform another update of the package list cache. You can update this cache by using the following command within the terminal.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo apt update</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"installing-cloudfared-and-setting-up-tunnel-to-the-raspberry-pi\">Installing <code>Cloudfared</code> and setting up Tunnel to the Raspberry Pi<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#installing-cloudfared-and-setting-up-tunnel-to-the-raspberry-pi\" class=\"hash-link\" aria-label=\"Direct link to installing-cloudfared-and-setting-up-tunnel-to-the-raspberry-pi\" title=\"Direct link to installing-cloudfared-and-setting-up-tunnel-to-the-raspberry-pi\">​</a></h3>\n<p>With the repository added, we can now proceed to install the Cloudflared package to our Raspberry Pi.</p>\n<p>To install this package, you will want to run the following command.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo apt install cloudflared</span><br></span></code></pre></div></div>\n<p>Now that we have prepared our Raspberry Pi, we can set up the Cloudflare tunnel. Now let's go to <a href=\"https://one.dash.cloudflare.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Cloudflare Zero Trust</a> dashboard and navigate to Access-&gt; Tunnels then click on <code>Create a tunnel</code>. Name our tunnel to something meaningful. Cloudflare will create a new tunnel and will show you instructions on the page.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Cloudflared Zero Trust Tunnel Setup\" src=\"https://umutyildirim.com/assets/images/cloudflared-zero-trust-tunnel-setup-5980e4ac27eef5e194f32bac1cdcfd8b.png\" width=\"1268\" height=\"1263\" class=\"img_ev3q\"></p>\n<p>Since we already installed <code>cloudflared</code> you need to copy the text on the right and paste it on SSH. Cloudflare dashboard will show <code>Connectors</code> at the bottom of setup page. Once your Raspberry Pi finish the code you pasted you will see your device there then you can continue your setup. You will see this page</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Cloudflare Zero Trust Tunnel Route Setup\" src=\"https://umutyildirim.com/assets/images/cloudflare-zero-trust-tunnel-route-setup-0f105402ddd89c344db495036551efca.png\" width=\"1445\" height=\"1250\" class=\"img_ev3q\"></p>\n<p>So let's make our ssh browser based. Follow these instructions;</p>\n<ul>\n<li>Subdomain: <code>ssh</code></li>\n<li>Domain: Your choice you can get free domain via Freenom.</li>\n<li>Path: Empty</li>\n<li>Type: <code>SSH</code></li>\n<li>URL: <code>localhost:22</code> And SAVE! Congratulations, you have successfully created your Cloudflare Tunnel. Now add this this tunnel to Applications and your are good to go!</li>\n</ul>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"docker\">Docker<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#docker\" class=\"hash-link\" aria-label=\"Direct link to Docker\" title=\"Direct link to Docker\">​</a></h2>\n<p>Let's install Docker on our Raspberry Pi. Docker is a containerization platform that allows you to run applications in isolated containers. This is a great way to run applications on your Raspberry Pi without having to worry about dependencies and other issues that can arise when running multiple applications on the same device.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"install-required-softwares-1\">Install Required Softwares<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#install-required-softwares-1\" class=\"hash-link\" aria-label=\"Direct link to Install Required Softwares\" title=\"Direct link to Install Required Softwares\">​</a></h3>\n<ol>\n<li>Our first task is to perform an update of the package list as well as upgrade any out-of-date packages. You can perform both of these tasks using the following command in the terminal.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo apt update</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo apt upgrade</span><br></span></code></pre></div></div>\n<ol start=\"2\">\n<li>With our Raspberry Pi entirely up to date, we can now go ahead and install Docker to the Raspberry Pi.</li>\n</ol>\n<p>Luckily for us, Docker has made this process incredibly quick and straightforward by providing a bash script that installs everything for you.</p>\n<p>You can download and run the official Docker setup script by running the following command.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">curl -sSL https://get.docker.com | sh</span><br></span></code></pre></div></div>\n<p>This command will pipe the script directly into the command line. Typically it would be best if you didn’t do this; however, Docker is a trusted source.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"setting-up-the-pi-user-for-docker\">Setting up the Pi user for Docker<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#setting-up-the-pi-user-for-docker\" class=\"hash-link\" aria-label=\"Direct link to Setting up the Pi user for Docker\" title=\"Direct link to Setting up the Pi user for Docker\">​</a></h3>\n<p>We need to make a slight adjustment to our <code>pi</code> user before we can start using Docker without issues. This is to do with the way that the Linux permission system works with Docker.</p>\n<ol>\n<li>Once Docker has finished installing to the Pi, there are a couple more things we need to do. For another user to be able to interact with Docker, it needs to be added to the <code>docker</code> group. So our next step is to add our <code>pi</code> user to the <code>docker</code> group by using the command below.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo usermod -aG docker pi</span><br></span></code></pre></div></div>\n<ol start=\"2\">\n<li>With the <code>pi</code> user added to the <code>docker</code> group, we can now log out of the Raspberry Pi and log back in again. This will ensure that the changes we have made to the <code>pi</code> user are applied.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">logout</span><br></span></code></pre></div></div>\n<ol start=\"3\">\n<li>Once you have logged back in, you can verify that the <code>pi</code> user has been added to the <code>docker</code> group by running the following command.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">groups</span><br></span></code></pre></div></div>\n<p>You should see the <code>docker</code> group listed in the output. If you do not see the <code>docker</code> group listed, you will need to log out and log back in again. Once you have verified that the <code>pi</code> user has been added to the <code>docker</code> group, we can move on to the next step.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"increasing-the-swap-file-size\">Increasing the Swap File Size<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#increasing-the-swap-file-size\" class=\"hash-link\" aria-label=\"Direct link to Increasing the Swap File Size\" title=\"Direct link to Increasing the Swap File Size\">​</a></h2>\n<p>The Raspberry Pi is a great little device, but it does have one major drawback. It only has a small amount of RAM. This can be a problem when running Docker containers as they can use a lot of RAM. To get around this, we can increase the size of the swap file.</p>\n<ol>\n<li>Before we can increase our Raspberry Pi’s swap file, we must first temporarily stop it. The swap file cannot be in use while we increase it. To stop the operating system from using the current swap file, run the following command.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo dphys-swapfile swapoff</span><br></span></code></pre></div></div>\n<ol start=\"2\">\n<li>With the swap file stopped, we can now increase the size of the swap file. To do this, we will need to edit the <code>/etc/dphys-swapfile</code> file. You can edit this file by running the following command.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo nano /etc/dphys-swapfile</span><br></span></code></pre></div></div>\n<ol start=\"3\">\n<li>Once the file has opened, we need to change the value of the <code>CONF_SWAPSIZE</code> variable. This variable controls the size of the swap file. By default, this value is set to 100. We need to increase this value to 200. You can do this by changing the value of the <code>CONF_SWAPSIZE</code> variable to 200.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">CONF_SWAPSIZE=200</span><br></span></code></pre></div></div>\n<ol start=\"4\">\n<li>\n<p>Once you have made the change, you can save the file by pressing <code>CTRL+X</code> and then <code>Y</code> to confirm the save. You can then exit the editor by pressing <code>ENTER</code>.</p>\n</li>\n<li>\n<p>We can now re-initialize the Raspberry Pi’s swap file by running the command below. Running this command will delete the original swap file and recreate it to fit the newly defined size.</p>\n</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo dphys-swapfile setup</span><br></span></code></pre></div></div>\n<ol start=\"6\">\n<li>With the swap file re-initialized, we can now start it again by running the following command.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo dphys-swapfile swapon</span><br></span></code></pre></div></div>\n<ol start=\"7\">\n<li>If you want all programs to be reloaded with access to the new memory pool, then the easiest way is to restart your device.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo reboot</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"now-what\">Now what?<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#now-what\" class=\"hash-link\" aria-label=\"Direct link to Now what?\" title=\"Direct link to Now what?\">​</a></h2>\n<p>You can use Docker to run any application that you want. You can even run multiple applications at the same time. So here is a list of applications I use on my Raspberry Pi.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"bitwarden\">Bitwarden<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#bitwarden\" class=\"hash-link\" aria-label=\"Direct link to Bitwarden\" title=\"Direct link to Bitwarden\">​</a></h3>\n<p>Bitwarden is a free and open-source password manager that allows you to store all of your passwords in one secure location. This is a great way to keep all of your passwords safe and secure.</p>\n<p>Here is a guide on how to install Bitwarden on your Raspberry Pi.</p>\n<ol>\n<li>Install Bitwarden image using CLI.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">docker pull vaultwarden/server:latest</span><br></span></code></pre></div></div>\n<ol start=\"2\">\n<li>Once Docker finishes downloaded Bitwarden RS to your Raspberry Pi, you can now continue.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sudo docker run -d --name bitwarden \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    --restart=always \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v /bw-data/:/data/ \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -p 127.0.0.1:9999:80 \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -p 127.0.0.1:3012:3012 \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    vaultwarden/server:latest</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"uptime-kuma\">Uptime Kuma<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#uptime-kuma\" class=\"hash-link\" aria-label=\"Direct link to Uptime Kuma\" title=\"Direct link to Uptime Kuma\">​</a></h3>\n<p>Uptime Kuma is a free and open-source uptime monitoring tool that allows you to monitor the status of your websites and services. This is a great way to keep track of the status of your websites and services.</p>\n<p>Here is a guide on how to install Uptime Kuma on your Raspberry Pi.</p>\n<ol>\n<li>Install Uptime Kuma image using CLI.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">docker pull louislam/uptime-kuma</span><br></span></code></pre></div></div>\n<ol start=\"2\">\n<li>Create a volume for Uptime Kuma.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">docker volume create uptime-kuma</span><br></span></code></pre></div></div>\n<ol start=\"3\">\n<li>Start the Uptime Kuma container.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">docker run -d --name uptime-kuma \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    --restart=always \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -p 9998:3001 \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v uptime-kuma:/app/data \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    louislam/uptime-kuma</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"netdata\">Netdata<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#netdata\" class=\"hash-link\" aria-label=\"Direct link to Netdata\" title=\"Direct link to Netdata\">​</a></h3>\n<p>Netdata is a free and open-source real-time performance monitoring tool that allows you to monitor the performance of your Raspberry Pi. This is a great way to keep track of the performance of your Raspberry Pi.</p>\n<p>Here is a guide on how to install Netdata on your Raspberry Pi.</p>\n<ol>\n<li>Install Netdata image using CLI.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">docker pull netdata/netdata</span><br></span></code></pre></div></div>\n<ol start=\"2\">\n<li>Start the Netdata container.</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">docker run -d --name netdata \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    --restart=always \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -p 9997:19999 \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v netdataconfig:/etc/netdata \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v netdatalib:/var/lib/netdata \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v netdatacache:/var/cache/netdata \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v /proc:/host/proc:ro \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v /sys:/host/sys:ro \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    -v /etc/os-release:/host/etc/os-release:ro \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    --cap-add SYS_PTRACE \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    --security-opt apparmor=unconfined \\</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    netdata/netdata</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"conclusion\">Conclusion<a href=\"https://umutyildirim.com/blog/how-i-use-my-raspberry-pi#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>Thank you for reading this guide. If you found this guide useful, please consider sharing it with your friends and family.</p>",
            "url": "https://umutyildirim.com/blog/how-i-use-my-raspberry-pi",
            "title": "How I use my Raspberry Pi?",
            "summary": "Raspberry Pi, come out of the closet! It's time for you to shine! I'll show you how I give my Pi a good workout and I'll teach you how to do the same in this post. Let's get physical (with technology)!",
            "date_modified": "2023-01-30T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Cloudflare",
                "Cloudflare Tunnels",
                "Cloudflare Zero Trust",
                "Docker",
                "Raspberry Pi"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend",
            "content_html": "<p>Welcome to part 2 of our Flatiron Open Source adventure, where we will talk about our backend setup. We fully utilized <a href=\"https://www.cloudflare.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Cloudflare</a> in our project. We are going to explain this process step by step.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-1-obtaining-free-domain\">Step 1: Obtaining Free Domain<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-1-obtaining-free-domain\" class=\"hash-link\" aria-label=\"Direct link to Step 1: Obtaining Free Domain\" title=\"Direct link to Step 1: Obtaining Free Domain\">​</a></h2>\n<p>We are going to a obtain our free development domain by using a service called <a href=\"https://www.freenom.com/en/index.html?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">Freenom</a>. <img decoding=\"async\" loading=\"lazy\" alt=\"Freenom Landing\" src=\"https://umutyildirim.com/assets/images/freenom-landing-77c2ff831360c5a0651c977e6aceb64e.png\" width=\"1552\" height=\"987\" class=\"img_ev3q\"> Create an account and find an available domain. When you finish obtaining your domain proceed to <a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-2-creating-your-cloudflare-account\">step 2</a>. <img decoding=\"async\" loading=\"lazy\" alt=\"Freenom Domains\" src=\"https://umutyildirim.com/assets/images/freenom-my-domains-3da3449252405c0a871560a66d60dab6.png\" width=\"1508\" height=\"943\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-2-creating-your-cloudflare-account\">Step 2: Creating your Cloudflare Account<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-2-creating-your-cloudflare-account\" class=\"hash-link\" aria-label=\"Direct link to Step 2: Creating your Cloudflare Account\" title=\"Direct link to Step 2: Creating your Cloudflare Account\">​</a></h2>\n<p>Cloudflare is a DNS(Domain Name Service). You can add your domain to Cloudflare and Cloudflare will protect you against bad actors and DOS attacks. Now let's create your account by clicking the <strong>Sign Up</strong> button in the top right of the webpage. <img decoding=\"async\" loading=\"lazy\" alt=\"Cloudflare\" src=\"https://umutyildirim.com/assets/images/cloudflare-326f33ea21a0d770fc6dd4e6d435e295.png\" width=\"1552\" height=\"987\" class=\"img_ev3q\"> After registering to Cloudflare you will be redirected to dashboard. You will need to click the <strong>Add Site</strong> button at the top of the webpage and enter your Freenom domain from <a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-1-obtaining-free-domain\">step 1</a>. <img decoding=\"async\" loading=\"lazy\" alt=\"Cloudflare Add Site\" src=\"https://umutyildirim.com/assets/images/cloudflare-add-site-85f15ffd38f29d2da0c7e8c8258fa4e7.png\" width=\"1552\" height=\"987\" class=\"img_ev3q\"> Once you add your domain you will be given 2 nameserver addresses. You need to access your Freenom dashboard and click the <strong>Manage Domain</strong> button. Once finished loading, click on <strong>Managment Tools</strong>, and then <strong>Nameservers</strong>. <img decoding=\"async\" loading=\"lazy\" alt=\"Cloudflare Nameserver\" src=\"https://umutyildirim.com/assets/images/freenom-nameserver-9ab321d00386ef76c23ed3f749dfe9c2.png\" width=\"1552\" height=\"987\" class=\"img_ev3q\"> You need to copy your Cloudflare nameservers and paste them into the Freenom nameserver textboxes, and then click the <strong>Change Nameservers</strong> button. Once you click the <strong>update</strong> button, the process can take up to 20 minutes to complete. Once Cloudflare finishes the setup, you will recieve an email congratulating you on setting up your first domain. <amp-auto-ads type=\"adsense\" data-ad-client=\"ca-pub-6517221663935477\"> </amp-auto-ads></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-3-cloudflare-pages-setup\">Step 3: Cloudflare Pages Setup<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-3-cloudflare-pages-setup\" class=\"hash-link\" aria-label=\"Direct link to Step 3: Cloudflare Pages Setup\" title=\"Direct link to Step 3: Cloudflare Pages Setup\">​</a></h2>\n<p>Cloudflare Pages allows you to deploy your dynamic front-end applications. The platform is super fast, and is always up to date by deploying directly from your Git provider (this assumes you have a <a href=\"https://github.com/\" target=\"_blank\" rel=\"noopener noreferrer\">github</a> account).</p>\n<p>You can also check their <a href=\"https://developers.cloudflare.com/pages/\" target=\"_blank\" rel=\"noopener noreferrer\">documentation</a>.</p>\n<ol>\n<li>Log in to the <a href=\"https://dash.cloudflare.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Cloudflare dashboard</a>.</li>\n<li>Select your account in <strong>Account Home</strong> &gt; <strong>Pages</strong>.</li>\n<li>Select <strong>Create a project</strong> &gt; <strong>Connect to Git</strong>.</li>\n</ol>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"configure-your-deployment\">Configure your deployment<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#configure-your-deployment\" class=\"hash-link\" aria-label=\"Direct link to Configure your deployment\" title=\"Direct link to Configure your deployment\">​</a></h3>\n<p>Once you have selected a Git repository, select <strong>Install &amp; Authorize</strong> and <strong>Begin setup</strong>. You can then customize your deployment in <strong>Set Up Builds And Deployments</strong>.</p>\n<p>Your project name will be used to generate your project’s hostname. By default, this matches your Git project name.</p>\n<p>The production branch indicates the branch that Cloudflare Pages should use to deploy the production version of your site. For most projects, this is the main or master branch.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://developers.cloudflare.com/pages/get-started/images/configuration.png\" alt=\"Cloudflare Name Project\" class=\"img_ev3q\"></p>\n<p>Since we are using <strong>Vite 3</strong> we will follow <strong>Vite 3</strong> deployment for Cloudflare pages.</p>\n<ol>\n<li>Log in to the <a href=\"https://dash.cloudflare.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Cloudflare dashboard</a> and select your account.</li>\n<li>Go to <strong>Pages</strong> &gt; <strong>Create a project</strong> &gt; <strong>Connect to git</strong>.</li>\n<li>Select your new GitHub repository.</li>\n<li>In the <strong>Set up builds and deployments</strong>, set <code>yarn build</code> as the <strong>Build command</strong>, and <code>dist</code> as the <strong>Build output</strong> directory.</li>\n<li>Select <strong>Environment variables (advanced)</strong> &gt; + Add variable &gt; configure a <code>NODE_VERSION</code> variable with a value of any version of Node greater than <code>14.18</code> – this example uses <code>16</code>.</li>\n</ol>\n<p>After completing configuration, select <strong>Save and Deploy</strong>,and wait for deployment to finish. After you have deployed your project, it will be available at the <code>&lt;YOUR_PROJECT_NAME&gt;.pages.dev</code> subdomain. After testing the website, you can add a custom domain to this website. This is becuase our domain is on Cloudflare, so we can easily add our domain to Cloudflare Pages. Click on <code>Custom Domains</code> and type your domain name. Cloudflare will automatically update your DNS record.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-4-cloudflare-kv-setup\">Step 4: Cloudflare KV Setup<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-4-cloudflare-kv-setup\" class=\"hash-link\" aria-label=\"Direct link to Step 4: Cloudflare KV Setup\" title=\"Direct link to Step 4: Cloudflare KV Setup\">​</a></h2>\n<p>For backend work, Cloudflare has a plaform called Workers KV. Workers KV is a global, low-latency, key-value data store. It stores data in a small number of centralized data centers, then caches that data in Cloudflare’s data centers after access.</p>\n<p>KV supports exceptionally high read volumes with low latency, making it possible to build highly dynamic APIs and websites that respond as quickly as a cached static file would. There are some request limits and speed limits, that can be read about in the documentation <a href=\"https://developers.cloudflare.com/workers/platform/limits/#kv-limits\" target=\"_blank\" rel=\"noopener noreferrer\">here</a></p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"setup\">Setup<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#setup\" class=\"hash-link\" aria-label=\"Direct link to Setup\" title=\"Direct link to Setup\">​</a></h3>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Cloudflare KV\" src=\"https://umutyildirim.com/assets/images/cloudflare-kv-a2ada1793d297df8b78a0a8c4426a490.png\" width=\"1552\" height=\"987\" class=\"img_ev3q\"> Click on <code>Workers</code>, then <code>KV</code> on sidebar. Then click the <strong>Create namespace</strong> button and give your namespace name. Finally, add a demo key and value to test functionality.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"why-we-used-a-python-script-for-backend-work\">Why We Used a Python Script for Backend Work<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#why-we-used-a-python-script-for-backend-work\" class=\"hash-link\" aria-label=\"Direct link to Why We Used a Python Script for Backend Work\" title=\"Direct link to Why We Used a Python Script for Backend Work\">​</a></h3>\n<p>You might realize there is a <a href=\"https://github.com/umuthopeyildirim/FlatironOpenSource/blob/main/main.py\" target=\"_blank\" rel=\"noopener noreferrer\">python script</a> on our projects root. We created that script based on the content provided by Flatiron School upon graduation (as discussed in part 1 of the blog). When you run this script it will scrape through the Flatiron files, and create a formatted output file with the necessary key<!-- -->:value<!-- --> information for the project's backend. After running the script, the content was exported to Cloudflare KV.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-5-cloudflare-workers-setup\">Step 5: Cloudflare Workers Setup<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-5-cloudflare-workers-setup\" class=\"hash-link\" aria-label=\"Direct link to Step 5: Cloudflare Workers Setup\" title=\"Direct link to Step 5: Cloudflare Workers Setup\">​</a></h2>\n<p>This is a simple worker that can be used to request data from Workers KV and send it to client side. It is very fast and can be used to serve static files.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"setup-1\">Setup<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#setup-1\" class=\"hash-link\" aria-label=\"Direct link to Setup\" title=\"Direct link to Setup\">​</a></h3>\n<p>To setup the worker install the Cloudflare CLI (command line interface), called <a href=\"https://developers.cloudflare.com/workers/wrangler/\" target=\"_blank\" rel=\"noopener noreferrer\">wrangler</a>, as a global package</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn global add @cloudflare/wrangler</span><br></span></code></pre></div></div>\n<p>or</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">npm install -g @cloudflare/wrangler</span><br></span></code></pre></div></div>\n<p>Then run</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">wrangler login</span><br></span></code></pre></div></div>\n<p>and follow the instructions.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"usage\">Usage<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#usage\" class=\"hash-link\" aria-label=\"Direct link to Usage\" title=\"Direct link to Usage\">​</a></h3>\n<p>To use the worker you need to create a KV namespace and upload the files you want to serve. Then you need to add the namespace id to the <code>wrangler.toml</code> file.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">kv</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token plain\">namespaces </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> binding </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"your_binding_for_env\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> id </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"your_namespace_id\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><br></span></code></pre></div></div>\n<p>Also change the account id with you account id in the <code>wrangler.toml</code> file.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">account_id </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'your_account_id'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Then you can run</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">wrangler publish</span><br></span></code></pre></div></div>\n<p>You can find the source code <a href=\"https://github.com/umuthopeyildirim/FlatironOpenSource/tree/main/workers\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.</p>\n<p>We also gave a <strong>custom domain</strong> to this <strong>Worker</strong>. You can also give a <strong>costum domain</strong> to this worker like this image bellow. <img decoding=\"async\" loading=\"lazy\" alt=\"Cloudflare Workers Domain\" src=\"https://umutyildirim.com/assets/images/cloudflare-workers-domain-f396558255987d6ea8db915e3765c312.png\" width=\"1508\" height=\"943\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-6-cloudflare-r2-setup\">Step 6: Cloudflare R2 Setup<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#step-6-cloudflare-r2-setup\" class=\"hash-link\" aria-label=\"Direct link to Step 6: Cloudflare R2 Setup\" title=\"Direct link to Step 6: Cloudflare R2 Setup\">​</a></h2>\n<p>We are using Cloudflare R2 because <strong>Product Design</strong> is a resources intensive cohort. There is more than 250MB of data, which is why we decided to use R2 instead of uploading these resources on the <strong>assets</strong> folder of our Github. We also gave our R2 a <strong>custom domain</strong> so we can access it on our website. This <a href=\"https://developers.cloudflare.com/r2/data-access/public-buckets/\" target=\"_blank\" rel=\"noopener noreferrer\">documentation</a> explains how to add a custom domain on your R2.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"conclusion\">Conclusion<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>Cloudflare is a popular choice for SaaS companies due to its wide range of free and inexpensive services. Its user-friendly documentation and abundance of resources make it an especially appealing option for new full stack engineers. I highly recommend considering Cloudflare for your project.</p>\n<p>If you encounter any issues, it is always a good idea to try searching for a solution online. Google is a great place to start. If you are unable to find a solution through a Google search, you can also try visiting Cloudflare's community page for additional help and support. curl $REPLIT_DB_URL/key</p>\n<p>Thank you for reading our blog post and don't forget to check our last part of <a href=\"https://flatironopensource.ml/\" target=\"_blank\" rel=\"noopener noreferrer\">Flatiron Open Source</a>.</p>",
            "url": "https://umutyildirim.com/blog/how-we-created-flatiron-open-source-backend",
            "title": "How we created Flatiron Open Source - Backend - Part 2",
            "summary": "Welcome to part 2 of our Flatiron Open Source adventure, where we will talk about our backend setup. We fully utilized Cloudflare in our project. We are going to explain this process step by step.",
            "date_modified": "2023-01-11T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Cloudflare",
                "Cloudflare Pages",
                "Cloudflare Workers",
                "Node.js",
                "Python"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend",
            "content_html": "<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"flatiron-school\">Flatiron School<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#flatiron-school\" class=\"hash-link\" aria-label=\"Direct link to Flatiron School\" title=\"Direct link to Flatiron School\">​</a></h2>\n<p><a href=\"https://flatironschool.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Flatiron School</a> is a 15-week coding bootcamp, with courses in software engineering, data science, cybersecurity, and product design.</p>\n<p>Upon completion of the course, students lose access to the internal class portal, called Canvas. Students are provided with html and javascript data files, containing information on the modules and courses used throughout the phases of the bootcamp.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"flatiron-open-source\">Flatiron Open Source<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#flatiron-open-source\" class=\"hash-link\" aria-label=\"Direct link to Flatiron Open Source\" title=\"Direct link to Flatiron Open Source\">​</a></h2>\n<p>The challenge we <a href=\"https://github.com/umuthopeyildirim\" target=\"_blank\" rel=\"noopener noreferrer\">Hope</a>, <a href=\"https://github.com/igottheim/\" target=\"_blank\" rel=\"noopener noreferrer\">Ian</a> set out of accomplish is how to make the data provided upon graduation user friendly for future review and preparation for interviews. This is what sparked the idea for Flatiron Open Source. The goal was to recreate the internal class portal for Flatiron graduates to use and collaborate.</p>\n<p>This blog will run through the process to create the front end, while future blogs will discuss back end and user implementation</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"how-we-structured-our-front-end\">How we structured our front-end<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#how-we-structured-our-front-end\" class=\"hash-link\" aria-label=\"Direct link to How we structured our front-end\" title=\"Direct link to How we structured our front-end\">​</a></h2>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"assetscss\">assets/css<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#assetscss\" class=\"hash-link\" aria-label=\"Direct link to assets/css\" title=\"Direct link to assets/css\">​</a></h3>\n<ul>\n<li>css setup and configuation with tailwind</li>\n</ul>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"components\">components<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#components\" class=\"hash-link\" aria-label=\"Direct link to components\" title=\"Direct link to components\">​</a></h3>\n<ul>\n<li>This is where the site components are created for the specific site modules. Information has been passed down using params.</li>\n</ul>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"data\">data<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#data\" class=\"hash-link\" aria-label=\"Direct link to data\" title=\"Direct link to data\">​</a></h3>\n<ul>\n<li>Used for params for routing to the correct links to the backend</li>\n</ul>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"views\">views<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#views\" class=\"hash-link\" aria-label=\"Direct link to views\" title=\"Direct link to views\">​</a></h3>\n<ul>\n<li>This is where the components are rendered. Items from the components page are imported into views.</li>\n</ul>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"main\">main<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#main\" class=\"hash-link\" aria-label=\"Direct link to main\" title=\"Direct link to main\">​</a></h2>\n<ul>\n<li>The main jsx file that gets rendered for the script for index.html. The views are imported into main, where react router is used to move through the different data.</li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"bundle-server\" src=\"https://umutyildirim.com/assets/images/front-end-structure-e0737ad5ce3e4faa1bdf49c4ac37cae2.png\" width=\"420\" height=\"1142\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"tailwindcssdaisyui\">Tailwindcss/DaisyUI<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#tailwindcssdaisyui\" class=\"hash-link\" aria-label=\"Direct link to Tailwindcss/DaisyUI\" title=\"Direct link to Tailwindcss/DaisyUI\">​</a></h2>\n<p>CSS styling was completed using the DaisyUI plugin for TailwindCSS. The inclusion of DaisyUI makes creating components seamless, and if needed allows for customization.</p>\n<p>To get started, you must have the runtime environment, Node.js, installed, to use the package manager npm commands. Another option, which was used for this project, is to have <a href=\"https://yarnpkg.com/getting-started/install\" target=\"_blank\" rel=\"noopener noreferrer\">yarn</a> installed on your computer.</p>\n<p>The documentation for tailwind can be found <a href=\"https://tailwindcss.com/docs/installation\" target=\"_blank\" rel=\"noopener noreferrer\">here</a></p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-1-install-the-required-packages\">Step 1 Install the required packages<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#step-1-install-the-required-packages\" class=\"hash-link\" aria-label=\"Direct link to Step 1 Install the required packages\" title=\"Direct link to Step 1 Install the required packages\">​</a></h3>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn add -D tailwindcss postcss autoprefixer</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn tailwindcss init -p</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn add daisyui</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn add react-daisyui</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-2-set-up-your-tailwindconfigjs-files\">Step 2 Set Up your tailwind.config.js files<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#step-2-set-up-your-tailwindconfigjs-files\" class=\"hash-link\" aria-label=\"Direct link to Step 2 Set Up your tailwind.config.js files\" title=\"Direct link to Step 2 Set Up your tailwind.config.js files\">​</a></h3>\n<p>Source code for Flatiron Open Source tailwind.config.js file can be found <a href=\"https://github.com/umuthopeyildirim/FlatironOpenSource/blob/main/tailwind.config.js\" target=\"_blank\" rel=\"noopener noreferrer\">here</a></p>\n<p>The most important piece of the source code is the additional plugin to require daisyUI.</p>\n<h3 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"step-3-add-the-tailwind-directives-to-your-css\">Step 3 Add the Tailwind directives to your CSS<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#step-3-add-the-tailwind-directives-to-your-css\" class=\"hash-link\" aria-label=\"Direct link to Step 3 Add the Tailwind directives to your CSS\" title=\"Direct link to Step 3 Add the Tailwind directives to your CSS\">​</a></h3>\n<p>Source code for Flatiron Open Source tailwind directives can be found <a href=\"https://github.com/umuthopeyildirim/FlatironOpenSource/blob/main/src/assets/css/index.css\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.</p>\n<p>That is all you need to do. The final piece is the read the documentation, and import DaisyUI components you would like to use to make styling seamless for your project.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"client-side-routing\">Client Side Routing<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#client-side-routing\" class=\"hash-link\" aria-label=\"Direct link to Client Side Routing\" title=\"Direct link to Client Side Routing\">​</a></h2>\n<p>In a React application, client-side routing refers to the process of navigating to different pages or views within the app by updating the URL in the browser, without triggering a full page reload. This allows for a smoother and more efficient user experience, as the app can quickly update the displayed content without having to fetch it from the server.</p>\n<p>One popular library for implementing client-side routing in a React app is React Router. React Router provides a collection of components that can be used to declaratively define the different routes in your app and the components that should be displayed for each route.</p>\n<p>Vite is a build tool that is well suited for building SPA (Single-Page Applications) with React, it provides a fast development experience with a simple setup, it also provides built-in support for client-side routing by using ES modules and it's live-reloading feature.</p>\n<p>You can use Vite with React Router to handle client-side routing in your app. You'll need to install React Router;</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn add react-router-dom</span><br></span></code></pre></div></div>\n<p>Then import <code>react-router-dom</code> to your <code>main.jsx</code>. This is our example;</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">React</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">ReactDOM</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-dom/client'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports maybe-class-name\">BrowserRouter</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Routes</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Route</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./assets/css/index.css'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Routes</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/* Landing Pages */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">Landing</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./views/Landing'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">Courses</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./views/Courses'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">Course</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./views/Course'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/* Error Pages */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">NotFound</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./views/errors/NotFound'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token maybe-class-name\">ReactDOM</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">createRoot</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token dom variable\" style=\"color:rgb(191, 199, 213)\">document</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getElementById</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'root'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">render</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">React</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">StrictMode</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">BrowserRouter</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Routes</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/* Landing Pages */</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Landing</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/courses/:course\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Courses</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/course/:course/:phase\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Course</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/* Error Pages */</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/*\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">NotFound</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Routes</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">BrowserRouter</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">React</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">StrictMode</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"ids-and-coursesjs\">IDs and courses.js<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#ids-and-coursesjs\" class=\"hash-link\" aria-label=\"Direct link to IDs and courses.js\" title=\"Direct link to IDs and courses.js\">​</a></h2>\n<p>Now you might ask, what is this;</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/course/:course/:phase\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Course</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><br></span></code></pre></div></div>\n<p>We are using <code>useParams</code> react hook from <code>react-router-dom</code> to recieve data from URL. <code>:course</code> is course ID like <code>product-design</code> so we can request related data from <code>courses.js</code>.</p>\n<p>The <code>useParams</code> react hook allows for dynamic routing, in this case used for the url slug. It also helps to dynamically render the correct data for the course page.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"why-vite-3\">Why <a href=\"https://vitejs.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Vite 3</a><a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#why-vite-3\" class=\"hash-link\" aria-label=\"Direct link to why-vite-3\" title=\"Direct link to why-vite-3\">​</a></h2>\n<p>In most React applications, software engineers use the command below to scaffold React projects:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">create-react-app &lt;app-name&gt;</span><br></span></code></pre></div></div>\n<p>The downsides to this command is speed. Create-React-App is a bundle based development server. It uses webpack, which bundles the application code before serving. The larger the codebase, the more time this will take.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"bundle-server\" src=\"https://umutyildirim.com/assets/images/bundle-server-d6976a713e92f30847b507c32821a058.png\" width=\"768\" height=\"444\" class=\"img_ev3q\"></p>\n<p>Vite is a front-end Native ESM based development server with several advantages over create-react-app:</p>\n<ul>\n<li>It takes advantage of the availability of native ES modules in the browser, and the rise of JavaScript tools written in compile-to-native-languages</li>\n<li>Vite enhance start time by dividing the modules in an app into <strong>dependencies</strong> and <strong>source code</strong>\n<ul>\n<li>Dependencies: plain JavaScript that does not change during development (component libraries). Dependencies are pre-bundled using <a href=\"https://esbuild.github.io/\" target=\"_blank\" rel=\"noopener noreferrer\">esbuild</a>.</li>\n<li>Source Code: non-plain JavaScript that needs transforming (JSX/CSS components). Source code is served over <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules\" target=\"_blank\" rel=\"noopener noreferrer\">native ESM</a>.Vite only serves source code as the browser requests the data and the data is currently being used. -Vite supports Hot Module Replacement (HMR) over native ESM. When a file is edited, VITE only needs to invalidate one chain between the edited module and the closest boundary, instead of re-constructing the entire site as a bundler <img decoding=\"async\" loading=\"lazy\" alt=\"native-esm\" src=\"https://umutyildirim.com/assets/images/native-esm-df9a52a44ff3969b89a9781abd9fa463.png\" width=\"768\" height=\"439\" class=\"img_ev3q\"></li>\n</ul>\n</li>\n</ul>\n<p>The documentation found <a href=\"https://vitejs.dev/guide/\" target=\"_blank\" rel=\"noopener noreferrer\">here</a> will help you start a project with vite.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn create vite</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn create vite my-react-app --template react</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"google-analytics\">Google Analytics<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#google-analytics\" class=\"hash-link\" aria-label=\"Direct link to Google Analytics\" title=\"Direct link to Google Analytics\">​</a></h2>\n<p><code>vite-plugin-radar</code> is a Vite plugin that allows you to easily add Google Analytics and Google Tag Manager to your website.</p>\n<p>To use the plugin, you'll first need to install it as a dependency:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">yarn add vite-plugin-radar</span><br></span></code></pre></div></div>\n<p>Then, you need to register it in your vite.config.js file:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">defineConfig</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'vite'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports\">react</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'@vitejs/plugin-react'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">ViteRadar</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'vite-plugin-radar'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// https://vitejs.dev/config/</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">defineConfig</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">plugins</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">react</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">ViteRadar</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Google Analytics tag injection</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">analytics</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">id</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'G-QYFSS4RFJQ'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">gtm</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">id</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'GTM-TTWKD6W'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Here, <code>analytics</code> is your <strong>Google Analytics</strong> tracking code, which is used to track the user's actions and behavior on your website. <code>gtm</code> is your <strong>Google Tag Manager</strong> container code, which is used to manage your analytics tags.</p>\n<p>Once this is done, the plugin will automatically add the required <strong>GA</strong> and <strong>GTM</strong> scripts to your HTML page and configure them based on the options you provided in the configuration.</p>\n<p>Please note that The plugin is in beta state and its API might change, you might want to consult the <a href=\"https://github.com/stafyniaksacha/vite-plugin-radar\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>documentation</strong></a> of the plugin for the most <strong>up-to-date</strong> information.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"responsive-design\">Responsive Design<a href=\"https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend#responsive-design\" class=\"hash-link\" aria-label=\"Direct link to Responsive Design\" title=\"Direct link to Responsive Design\">​</a></h2>\n<p>Responsive design is a method of designing and building websites that adapt to the different screen sizes and devices that people use to access the web. It's important because more and more people are accessing the internet from a variety of devices, including smartphones, tablets, laptops, and desktops.</p>\n<p>Tailwind CSS is a popular utility-first CSS framework that can be used to build responsive designs. It provides a wide variety of utility classes that can be used to apply CSS styles to HTML elements quickly and easily. These classes are designed to be highly composable, which means you can use them together in different combinations to create complex layouts and designs.</p>\n<p>One of the ways Tailwind CSS helps with responsive design is through its use of \"responsive prefixes\" that can be added to utility classes. These prefixes allow you to apply different styles to an element based on the size of the screen. For example, you can use the \"sm\" prefix to apply a style only when the screen is at least 768 pixels wide, or the \"lg\" prefix to apply a style only when the screen is at least 1280 pixels wide.</p>\n<p>Keep in mind that, as with all utility frameworks, it can be harder to maintain when trying to customize complex design, for that reason is recommended to use it in conjunction with a css-in-js lib or some custom css that complement the design. So don't forget to check out <a href=\"https://tailwindcss.com/docs/responsive-design\" target=\"_blank\" rel=\"noopener noreferrer\">TailwindCSS's documentation</a> for up-to-date information.</p>",
            "url": "https://umutyildirim.com/blog/how-we-created-flatiron-open-source-frontend",
            "title": "How we created Flatiron Open Source - Frontend",
            "summary": "Flatiron School",
            "date_modified": "2023-01-10T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Cloudflare",
                "Cloudflare Pages",
                "Cloudflare Workers",
                "React",
                "Node.js",
                "Python",
                "Flatiron School",
                "DaisyUI",
                "TailwindCSS"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/how-to-create-open-source-obsidian-digital-garden",
            "content_html": "<p>Are you intrigued by networked note-taking apps?</p>\n<p>Do you want to share your own knowledge base with everyone?</p>\n<p>Have you heard about the <a href=\"https://www.technologyreview.com/2020/09/03/1007716/digital-gardens-let-you-cultivate-your-own-little-bit-of-the-internet/\" target=\"_blank\" rel=\"noopener noreferrer\">digital garden</a> craze sweeping the nation and want to make one of your own?</p>\n<p>Maybe <a href=\"https://obsidian.md/\" target=\"_blank\" rel=\"noopener noreferrer\">Obsidian</a> + <a href=\"https://netlify.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Netlify</a> will be as good to you as they have been to me.</p>\n<p>In addition to being a great note-taking tool, Obsidian functions as an excellent content manager. When combined with a git-based deployment solution like Netlify (and a few plugins), it compares favorably to other git-based CMS's such as Forestry and Netlify CMS, with the added benefit of backlinks, graph views, and a bunch of bells and whistles.</p>\n<p>So what are you waiting for? Follow my steps and create your own digital garden. My own digital garden and this is what it will look like when you are done with this tutorial. <a href=\"https://garden.umutyildirim.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Hope's Garden</a></p>\n<p><em>Note: This is work-in-progress tutorial. If you spot any problems don't hesitate to e-mail me. <a href=\"https://mail.google.com/mail/?view=cm&amp;fs=1&amp;tf=1&amp;to=umut475@gmail.com\" target=\"_blank\" rel=\"noopener noreferrer\">E-Mail</a></em></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"git--github\">Git &amp; Github<a href=\"https://umutyildirim.com/blog/how-to-create-open-source-obsidian-digital-garden#git--github\" class=\"hash-link\" aria-label=\"Direct link to Git &amp; Github\" title=\"Direct link to Git &amp; Github\">​</a></h2>\n<p>If your computer doesn’t have Git you should install it. <a href=\"https://git-scm.com/downloads\" target=\"_blank\" rel=\"noopener noreferrer\">Official Link</a> After setting up your Git. You should go to terminal and write these lines to your preferred terminal.</p>\n<div class=\"language-console codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-console codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git config --global user.name \"Your Name\"</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git config --global user.email youremailadress@example.com</span><br></span></code></pre></div></div>\n<p>If you receive any error like 'Git not found', this means you forgot to add 'git' to your operating systems path. Google is your friend if you receive any error :)</p>\n<p>This projects uses Github to host your vault contents. You need to create Github account for this tutorial to work. Create an private Github repository.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"setting-up-obsidian\">Setting up Obsidian<a href=\"https://umutyildirim.com/blog/how-to-create-open-source-obsidian-digital-garden#setting-up-obsidian\" class=\"hash-link\" aria-label=\"Direct link to Setting up Obsidian\" title=\"Direct link to Setting up Obsidian\">​</a></h2>\n<p>Download Obsidian from their <a href=\"https://obsidian.md/\" target=\"_blank\" rel=\"noopener noreferrer\">official website</a>. Then click to 'Create new vault'. After creating your vault go to settings and deactivate 'Safe Mode'. This will allow us to install community plugins. Let's install few plugins, shall we? Here is the list of plugins you need to install.</p>\n<ul>\n<li>Advanced Tables</li>\n<li>Better Word Count</li>\n<li>Copy button for code blocks</li>\n<li>Emoji Toolbar</li>\n<li>Fullscreen mode plugin</li>\n<li>Hider</li>\n<li>Mind Map</li>\n<li>Obsidian Git +</li>\n<li>Obsidian Link Converter +</li>\n</ul>\n<p>These are the plugins I use personally you can wish to not install all of them but '+' icons are required for our setup.</p>\n<p>After creating your vault and downloading all of your desired plugins you need to point out your vault to Github repository. Open up your terminal and type these;</p>\n<div class=\"language-console codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-console codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git init</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git add .</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git commit -m \"REVIVE MY GARDEN\"</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git branch -M main</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git remote add origin https://github.com/yourgithubusername/yourgithubrepositoryname.git</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">$ git push -u origin main</span><br></span></code></pre></div></div>\n<p>Here we go! Now your notes should arrive in your Github repository and we are finally ready to publish our website on <a href=\"http://www/\" target=\"_blank\" rel=\"noopener noreferrer\">www</a>.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"setting-up-netlify\">Setting up Netlify<a href=\"https://umutyildirim.com/blog/how-to-create-open-source-obsidian-digital-garden#setting-up-netlify\" class=\"hash-link\" aria-label=\"Direct link to Setting up Netlify\" title=\"Direct link to Setting up Netlify\">​</a></h2>\n<p>Download this <a href=\"https://gist.github.com/umuthopeyildirim/5e97c99d1652a3f157b1f6a97d91e642\" target=\"_blank\" rel=\"noopener noreferrer\">gist</a> and move it to your vault folder. Edit it however you like.</p>\n<p>Create an Netlify account on their <a href=\"https://netlify.com/\" target=\"_blank\" rel=\"noopener noreferrer\">website</a>. After creating you will be prompted with website setup guide. Follow the instructions given to you. Let them access your Github account and point it to repository you created for your Obsidian vault.</p>\n<p>Let Netlify build your website for you. After the build, congratulations you finally finished setting up your own digital garden! Now all you need to do is filling up your digital garden🪴.</p>",
            "url": "https://umutyildirim.com/blog/how-to-create-open-source-obsidian-digital-garden",
            "title": "How to Create Open Source Obsidian Digital Garden",
            "summary": "Are you intrigued by networked note-taking apps?",
            "date_modified": "2022-11-21T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Obsidian",
                "Digital Garden",
                "Netlify",
                "CI/CD"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/building-a-website-screenshot-api-with-puppeteer-and-google-cloud-functions",
            "content_html": "<p><img decoding=\"async\" loading=\"lazy\" alt=\"Website Screenshot API\" src=\"https://umutyildirim.com/assets/images/website-screenshot-api-64c8825ad14b5f5060d4f42eceafd5d3.png\" width=\"1536\" height=\"989\" class=\"img_ev3q\"></p>\n<p>In this blog post, I describe the steps I took to set up this API, let's dive in!</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"puppeteer\">Puppeteer<a href=\"https://umutyildirim.com/blog/building-a-website-screenshot-api-with-puppeteer-and-google-cloud-functions#puppeteer\" class=\"hash-link\" aria-label=\"Direct link to Puppeteer\" title=\"Direct link to Puppeteer\">​</a></h2>\n<p><a href=\"https://developers.google.com/web/tools/puppeteer\" target=\"_blank\" rel=\"noopener noreferrer\">Puppeteer</a> is a node package that allows you to control a headless chrome browser using Javascript. A headless chrome browser is just a browser without a window.</p>\n<p>I can use this package to spin up a headless chrome instance, navigate to a website and take a screenshot.</p>\n<p>To start I’m going to create a local node project and install the puppeteer package.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">npm init</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">npm install puppeteer</span><br></span></code></pre></div></div>\n<p>Now I can create a file called <code>index.js</code> and add the following code.</p>\n<div class=\"language-js codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> puppeteer </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">require</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'puppeteer'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">takeScreenshot</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">then</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'Screenshot taken'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'Error occured!'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">dir</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">takeScreenshot</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> browser </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> puppeteer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">launch</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> page </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> browser</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">newPage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">goto</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'https://medium.com'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">waitUntil</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'networkidle2'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> buffer </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">screenshot</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token literal-property property\">path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./screenshot.png'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">close</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> browser</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">close</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>Note that I am making the <code>takeScreenshot()</code> function <code>async</code>. This way I can use the await keyword in the function to wait for all the promises.</p>\n<p>After running the code I get the following screenshot! 🎉</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Screenshot of Medium\" src=\"https://umutyildirim.com/assets/images/medium-screenshot-190723ff8077adb3e2651f71fae9bae6.png\" width=\"800\" height=\"600\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"google-cloud-functions\">Google Cloud Functions<a href=\"https://umutyildirim.com/blog/building-a-website-screenshot-api-with-puppeteer-and-google-cloud-functions#google-cloud-functions\" class=\"hash-link\" aria-label=\"Direct link to Google Cloud Functions\" title=\"Direct link to Google Cloud Functions\">​</a></h2>\n<p>So I now have a local script that I can call to take a screenshot, but I want to build an API. The next logical step is to put this script on a server somewhere.</p>\n<p>I don’t want to worry about my server running out of memory, so I’m going to put it on <a href=\"https://cloud.google.com/functions/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Cloud Functions</a>. This way it can handle a huge number of requests without me having to worry about buying more RAM memory.</p>\n<p>Once I have the cloud function running, I can call it with an HTTP request — meaning that I will have a working screenshot API 🚀</p>\n<p>Let’s port the previous code to the Google Cloud Function format. The cloud function I created is <code>async</code> and called <code>run()</code>.</p>\n<p>So far I have a working screenshot API. But I’m going to extend it by uploading the screenshots directly to Google Storage.</p>\n<p>I’m going to use the <code>@google-cloud/storage</code> npm package for this. Note that I have created a Google Cloud Storage bucket called <code>screenshot-api</code> checkout <a href=\"https://cloud.google.com/storage/docs/quickstart-console\" target=\"_blank\" rel=\"noopener noreferrer\">this page</a> for how to set up a storage bucket.</p>\n<div class=\"language-js codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> puppeteer </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">require</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'puppeteer'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token maybe-class-name\">Storage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">require</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'@google-cloud/storage'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">GOOGLE_CLOUD_PROJECT_ID</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'portfolio-umut-yildirim'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">BUCKET_NAME</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'screenshot-jobs-portfolio-umut-yildirim'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">exports</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method-variable function-variable method function property-access\" style=\"color:rgb(130, 170, 255)\">run</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">req</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">setHeader</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'content-type'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'application/json'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> buffer </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">takeScreenshot</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">req</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">body</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">let</span><span class=\"token plain\"> screenshotUrl </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">uploadToGoogleCloud</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      buffer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      req</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">body</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">name</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">+</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'.png'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">status</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">200</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">send</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token known-class-name class-name\" style=\"color:rgb(255, 203, 107)\">JSON</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">stringify</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">screenshotUrl</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> screenshotUrl</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">status</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">422</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">send</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token known-class-name class-name\" style=\"color:rgb(255, 203, 107)\">JSON</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">stringify</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">error</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">uploadToGoogleCloud</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">buffer</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> filename</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> storage </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Storage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token literal-property property\">projectId</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">GOOGLE_CLOUD_PROJECT_ID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> bucket </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> storage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">bucket</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">BUCKET_NAME</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> file </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> bucket</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">file</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">filename</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">uploadBuffer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">file</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> buffer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> filename</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> file</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">makePublic</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">https://</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation constant\" style=\"color:rgb(130, 170, 255)\">BUCKET_NAME</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">.storage.googleapis.com/</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">filename</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">takeScreenshot</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">params</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> browser </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> puppeteer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">launch</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token literal-property property\">args</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'--no-sandbox'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> page </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> browser</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">newPage</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">goto</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">params</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">url</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">waitUntil</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'networkidle2'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> buffer </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">screenshot</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">close</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> browser</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">close</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> buffer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">uploadBuffer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">file</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> buffer</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> filename</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Promise</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">resolve</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    file</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">save</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">buffer</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">destination</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> filename</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">resolve</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>The new result — My postman client is showing the URL to the screenshot 🚀</p>\n<p>Note that in the code above each screenshot is saved as screenshot.png on Google Storage. In the real world, you would need to generate a random id for each image.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"conclusion\">Conclusion<a href=\"https://umutyildirim.com/blog/building-a-website-screenshot-api-with-puppeteer-and-google-cloud-functions#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>Here’s the source of a <a href=\"https://cloud.google.com/functions/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Cloud function</a> that, using <a href=\"https://pptr.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Puppeteer</a>, takes a screenshot of a given website and store the resulting screenshot in a bucket on Google Cloud Storage. This was a fun project to do.</p>\n<p>You can find the source code of the completed <a href=\"https://gist.github.com/umuthopeyildirim/f2e970cc8ee394de3f58c7a72da0f835\" target=\"_blank\" rel=\"noopener noreferrer\">Google Cloud function</a> and <a href=\"https://gist.github.com/umuthopeyildirim/b19cdf20c40b84d39e6618f6e6db2531\" target=\"_blank\" rel=\"noopener noreferrer\">package.json</a> here.</p>\n<p>Thanks for reading!</p>",
            "url": "https://umutyildirim.com/blog/building-a-website-screenshot-api-with-puppeteer-and-google-cloud-functions",
            "title": "Building a Website Screenshot API with Puppeteer and Google Cloud Functions",
            "summary": "Website Screenshot API",
            "date_modified": "2022-11-16T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Google Cloud Platform",
                "Link",
                "Puppeteer",
                "Screenshot",
                "React"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/rails-postgresql-array",
            "content_html": "<p>If you continue to read this article, I assume that you know Ruby, OOP in Ruby, RoR, and Active Record. Yes, Postgresql support Array types to store. Based on their documentation:</p>\n<blockquote>\n<p>PostgreSQL allows columns of a table to be defined as variable-length multidimensional arrays. Arrays of any built-in or user-defined base type, enum type, composite type, range type, or domain can be created. Let's start our journey! (I use Rails API-only as example, but this article can be implemented in normal Rails as well)</p>\n</blockquote>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"migration\">Migration<a href=\"https://umutyildirim.com/blog/rails-postgresql-array#migration\" class=\"hash-link\" aria-label=\"Direct link to Migration\" title=\"Direct link to Migration\">​</a></h2>\n<p>It is simple:</p>\n<div class=\"language-ruby codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ruby codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># db/migrate/*_create_books.rb</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">class CreateBooks &lt; ActiveRecord::Migration[6.0]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  def change</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    create_table :books do |t|</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      t.string :title</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      t.string :tags, array: true, default: []</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      t.integer :ratings, array: true, default: []</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      t.timestamps</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    end</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    add_index :books, :tags, using: 'gin'</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    add_index :books, :ratings, using: 'gin'</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  end</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">end</span><br></span></code></pre></div></div>\n<p>If you want to add new column:</p>\n<div class=\"language-ruby codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ruby codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># db/migrate/*_add_subjects_to_books.rb</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">class AddSubjectsToBooks &lt; ActiveRecord::Migration</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  def change</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    add_column :books, :subjects, :string, array:true, default: []</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  end</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">end</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>I define the column as t.string <!-- -->:tags<!-- -->, array: true not t.array <!-- -->:tags<!-- -->.</div><div class=\"admonitionContent_BuS1\"><p>Compare to jsonb, which t.jsonb <!-- -->:payload<!-- -->. This is because there is no \"array\" type in PostgreSQL, only \"array of column type\".</p><p>PostgreSQL arrays aren't generic containers like Ruby arrays, they are more like arrays in C, C++, etc. :::</p><h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"create\">Create<a href=\"https://umutyildirim.com/blog/rails-postgresql-array#create\" class=\"hash-link\" aria-label=\"Direct link to Create\" title=\"Direct link to Create\">​</a></h2><p>Create a record is very simple too:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):001:0&gt; Book.create(title: \"Hacking Growth\", tags: [\"business\", \"startup\"], ratings: [4, 5])</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">   (0.1ms)  BEGIN</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  Book Create (0.6ms)  INSERT INTO \"books\" (\"title\", \"tags\", \"ratings\", \"created_at\", \"updated_at\") VALUES ($1, $2, $3, $4, $5) RETURNING \"id\"  [[\"title\", \"Hacking Growth\"], [\"tags\", \"{business,startup}\"], [\"ratings\", \"{4,5}\"], [\"created_at\", \"2020-06-29 08:48:42.440895\"], [\"updated_at\", \"2020-06-29 08:48:42.440895\"]]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">   (0.4ms)  COMMIT</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; #&lt;Book id: 1, title: \"Hacking Growth\", tags: [\"business\", \"startup\"], ratings: [4, 5], created_at: \"2020-06-29 08:48:42\", updated_at: \"2020-06-29 08:48:42\"&gt;</span><br></span></code></pre></div></div><h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"show\">Show<a href=\"https://umutyildirim.com/blog/rails-postgresql-array#show\" class=\"hash-link\" aria-label=\"Direct link to Show\" title=\"Direct link to Show\">​</a></h2><p>Both tags and ratings now an array object:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):002:0&gt; book = Book.first</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  Book Load (0.3ms)  SELECT \"books\".* FROM \"books\" ORDER BY \"books\".\"id\" ASC LIMIT $1  [[\"LIMIT\", 1]]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):003:0&gt; book.tags</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; [\"business\", \"startup\"]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):004:0&gt; book.tags[0]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; \"business\"</span><br></span></code></pre></div></div><h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"update\">Update<a href=\"https://umutyildirim.com/blog/rails-postgresql-array#update\" class=\"hash-link\" aria-label=\"Direct link to Update\" title=\"Direct link to Update\">​</a></h2><p>To update, the most easiest way is:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):005:0&gt; book.tags &lt;&lt; 'management'</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; [\"business\", \"startup\", \"management\"]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):0006:0&gt; book.save!</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">   (0.1ms)  BEGIN</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  Book Update (1.2ms)  UPDATE \"books\" SET \"tags\" = $1, \"updated_at\" = $2 WHERE \"books\".\"id\" = $3  [[\"tags\", \"{business,startup,management}\"], [\"updated_at\", \"2020-06-29 08:54:36.731328\"], [\"id\", 1]]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">   (0.4ms)  COMMIT</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; true</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):007:0&gt; book.tags</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; [\"business\", \"startup\", \"management\"]</span><br></span></code></pre></div></div><p>And any other way to add a value to an array object:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># This works</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">book.tags &lt;&lt; 'management'</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">#This will work too</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">book.tags.push 'management'</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># This is also will work</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">book.tags += ['management']</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">But do not do this: Book.first.tags &lt;&lt; 'finance', it won't be saved to the database. Prove:</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):008:0&gt; Book.first.tags &lt;&lt; \"finance\"</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  Book Load (0.3ms)  SELECT \"books\".* FROM \"books\" ORDER BY \"books\".\"id\" ASC LIMIT $1  [[\"LIMIT\", 1]]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; [\"business\", \"startup\", \"management\", \"finance\"]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):009:0&gt; Book.first.save!</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  Book Load (0.3ms)  SELECT \"books\".* FROM \"books\" ORDER BY \"books\".\"id\" ASC LIMIT $1  [[\"LIMIT\", 1]]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; true</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):010:0&gt; Book.first.tags</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  Book Load (0.3ms)  SELECT \"books\".* FROM \"books\" ORDER BY \"books\".\"id\" ASC LIMIT $1  [[\"LIMIT\", 1]]</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">=&gt; [\"business\", \"startup\", \"management\"]</span><br></span></code></pre></div></div><p>If you want to use raw SQL, you can check to the official documentation.</p><h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"query\">Query<a href=\"https://umutyildirim.com/blog/rails-postgresql-array#query\" class=\"hash-link\" aria-label=\"Direct link to Query\" title=\"Direct link to Query\">​</a></h2><p>Let say we want to search every single Book that have tags management:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># This is valid</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):011:0&gt; Book.where(\"'management' = ANY (tags)\")</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># This is more secure</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):012:0&gt; Book.where(\":tags = ANY (tags)\", tags: 'management')</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># This is also valid</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):013:0&gt; Book.where(\"tags @&gt; ?\", \"{management}\")</span><br></span></code></pre></div></div><p>What if we want to search every single book that DO NOT HAVE tags management:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):013:0&gt; Book.where.not(\"tags @&gt; ?\", \"{management}\")</span><br></span></code></pre></div></div><p>You can see the operators and their description in the official documentation.</p><p>Now, what if we want to search book that contain multiple tags, like management and startup:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># This is valid</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):014:0&gt; Book.where(\"tags @&gt; ARRAY[?]::varchar[]\", [\"management\", \"startup\"])</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># This is valid</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):015:0&gt; Book.where(\"tags &amp;&amp;  ?\", \"{management,startup}\")</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># If you use where.not, you basically search for all that do not contain the parameter given.</span><br></span></code></pre></div></div><p>Now what if we want to search all book that have rating more than 3:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):016:0&gt; Book.where(\"array_length(ratings, 1) &gt;= 3\")</span><br></span></code></pre></div></div><p>How about making our search a little bit more robust and supporting pattern matching:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"># %gem% is manaGEMent</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">irb(main):017:0&gt; Book.where(\"array_to_string(tags, '||') LIKE :tags\", tags: \"%gem%\")</span><br></span></code></pre></div></div><p>You can see all the operators and functions and their description in the official documentation.</p><h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"final-word\">Final Word<a href=\"https://umutyildirim.com/blog/rails-postgresql-array#final-word\" class=\"hash-link\" aria-label=\"Direct link to Final Word\" title=\"Direct link to Final Word\">​</a></h2><p>That's all from me. I'll update if I find something interesting.</p><p>source: myself and extract from many articles</p></div></div>",
            "url": "https://umutyildirim.com/blog/rails-postgresql-array",
            "title": "Rails + PostgreSQL Array",
            "summary": "If you continue to read this article, I assume that you know Ruby, OOP in Ruby, RoR, and Active Record. Yes, Postgresql support Array types to store. Based on their documentation:",
            "date_modified": "2022-10-25T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Rails",
                "Ruby",
                "Postgres",
                "PostgreSQL",
                "Array"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide",
            "content_html": "<p>It doesn't matter if you are a beginner or a seasoned developer. From time to time, you need to look up certain programming language documentation to help you navigate through specific information to build up your application which then solves a definite task or problem. However, this skill is especially important for beginner developers since beginner developers, like myself, don't have many experiences in using built-in methods nor understanding how to implement the methods and the keywords to look for. For example, some methods require certain numbers of parameters, or even just simply land on the right page on the documentation.</p>\n<p>The purpose of this article is to assist and guide other beginner developers on where to start when they read and refer to Ruby built-in methods in <a href=\"https://guides.rubyonrails.org/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">Ruby on Rails Guide</a>. This time I am going to focus on introducing the Models section which is related to setting up your backend database from scratch. <img decoding=\"async\" loading=\"lazy\" alt=\"Ruby on Rails Docs For Active Record\" src=\"https://umutyildirim.com/assets/images/docs-49a7a370106f73296b4ada20f4fe75bb.png\" width=\"720\" height=\"425\" class=\"img_ev3q\"></p>\n<p>Before diving into the Models, let’s take a look at what Active Record is first. We know that Rails contains seven Ruby gems, which work harmoniously together, and Active Record is one of them and taking care of all the database stuff, also known as an “ORM”. ORM stands for Object-Relational-Mapping and it means Active Record stores data in a database table kind of structure using rows and columns and the data can be modified or retrieved by writing SQL statements. Moreover, Active Record allows you to interact with that data as if it’s a normal Ruby object.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"what-is-active-record\">What is Active Record?<a href=\"https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide#what-is-active-record\" class=\"hash-link\" aria-label=\"Direct link to What is Active Record?\" title=\"Direct link to What is Active Record?\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Active Record\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk0AAAFgCAMAAACR/r0fAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAC/VBMVEX////h4eEAAAC9vb1NTU18fHzHx8fZ2dnp6emamppoaGiMjIzw8PDQ0NCnp6eysrL15eWbUU+MODaQOznJoaDFm5qjQT+mREGzSkjAUE2TOznisK/x2Nj79fXZl5X58O/36urz397pwsH9+vnu0dHepaPsysnmu7qpRkPbwcC+S0i7Skd9SFNlYoV1UGOGP0OpamnUtLO+fXDCfXtOgLtKfrtcib98iq6ekaS9n5l1nMtslsicudrG1un19/ukvt1Qgr27zuXe5/KHqtNVhr9hjsTo7/bk7PW5zeXktbTKbWt9o87qxsaOr9X5+/3u8/nCVlTz3d3X4/DM2uyXtNjszMvAUU7C0+jXj42wxuH57u6qwt/cnJvRfXvGYl/36OjMc3DUhoTS3+5mksbz6N/t2sv27eXfv6TNm3LGjV62bTG4cjfJkmXSpH/jyLH48ezx49jZspLChFHv39LUqYW9e0S+cjTHeDfWgjzLezjbuJrgqqm4bzHehz7zlEX3lkbvkUPchDz69vLWrYy8cTPPfDnkij+7dj7CdTT1lEa/f0vmzLjhhz+6bzLz9+zAy6u4xJ+9Ylm5ooa4wJy8x6Xt8Oe0vsybrsSIo8J3lrxhjL3T2+XxkkTSfzqIomVxiT+gZEWJdUJ4kUQ4XYo8ZZVAa59Fda07YZHBzNrb4c9RcZl8lEeQrlOBnElJeLFDb6PEiVjYgjzPoHibu1mGokxPgb3sjkLLlmvo0b7q1sVIerWUclxnhKuecU/S4LTL3Kni687l7dTJeDf8/frp8NrR3u76+/3v9Pnni0DX5L35+/XD1pzq8PfK2evFeDe7cDPEdjX2+fDs8uDY4/Dc6MXpjULw9Obhw6vv9OS2zoWYuVTJ2qWiwGT5+/Swyny80Y+fvV/O3q7U3cS/1JWnw22DoEhHa4Fyk3g6X4v+9Ov6v472kkD5tHz7z6v3m0/2lUb64Mv4o1795M/6yJ/9+/rpmVenqrP5rW796tv6y6X82b1XdpyVp2/g5dXN1uIwcMLHAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+YLEAcKEicZu/YAABhnSURBVHja7Z0JfBvVncefRpJlWXbscnRLHcdxFCe72ptF2W1I7eCQxBsgBzUEcYQzBxMIR4jtZB07Doljhzh7tpQ2Li3HdrtsCwESYA/ntOMkho2TECAcpdvubiEstECXdq/PvmtGI2nkSyN7ZvT7fj6WNDNPY82br977vzej9wgBAAAAAAAAAAAAAAAAAIAz8Cje+ILPl7gxeRkAQvyKkseeA4riH8wmRRHP+UGaMBBfBsBoicJLmQIlxQ8zm/J9isJTwiZgZlNIoUVNvhIclk0Fir+QePywCZjbVKQECZlAn5gfE3yKr5iVQX6loJjZVMhqNo9mT76iFMbtKqYFWiifeH1KARVSPGnp5UqQYzZxMWhQzZ78vB6jOokKzStqQMVXKG3yKAWGskopCPlpEKX4vUEvkU8yvVwCOWcTLZeKlAnsVUApKCRFNJDi1ngV5kiIkKBSJG0K6KE6Wy7izwEelRPxpKWXK0HO2UTPfEjJZ6+8rFgSLyaIuMnLyyja7NPKJsVgk5cXZaRYUQpo3caf9PRyJcg1m1jtJOLqIq1sChjKpkJjFO4zROGsQBPr80QFSJ/09PpKkGM2FfM+Jx4+aeFS0gvdpiIlvky1C1ER8/zeYlq/ySeZXi6B3MKnsJYa63JiD6xvsoAFz4ECVs54xRpuj+z7DoRk76WPNQSVoN/nofVdMJ/IJ5leLgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOJeSz51nJ86/AKfEwVxwnr34HE6Jg7nwvPM+/2u24XzY5HSbvnCRbfgibIJNsAnAJgCbAGyCTbAJNgHYBGATbIJNsAnAJuAIm0pLh7MKNsGm4UBI6TBWwaactWkiIWWT4ovlhJTAJjBKmybTpBX60hS6NBk2gVHbNJmEDUVTOWwCGdg0tYxMkQuVpGwqbAKZ2DSNlMuFCjJVt6l04uTJJdO0ZNMmT64o1dUpreCLsAk2pdhEjajUCppJmk0VYi/hSi04p0yT6pSIbRNhE2xKtalExuHTaHtO2lRBwrT6m14uYioaWk1nC0KdiaScOlYaJtNhE2xKsWm6jMPLqBnCpkpNkjArgSrjZRJ9nkRLMOFeOWyCTSk2XSTi8Omk7CJp01QtlJrIXuhLXJ2pskeKWgWbYFOqTUKXEjJNs4mvvYgbRtiGiQabJpPJUzk83IJNsCnJpklMDFHWJNlUylbqS9ImnUmwCTal2EQfK2ilVjFMmypKBZNQ08EmE5um0Dg8zL0QNmmtPBpql7EGXonBphLDlRjYBJtSbaIqTWbeaDZN0662sEJLX5rC1ZkmEsIm2JTOpon0HVPiNk0KiwJoGo+NJokLw1Nkf5PcdtGkUtgEm8xsqiSy/JG9l9ScsoqJ5VIx6lp5RTkpL+fqsG0Tp9KNJbAJNpnZJKo0XhqJKyvTy9hOyqUqU8OEXUmZLNQpFRdaSiq5TZWwCTYNySTRaDO/Y7e0tHJEO4NNOW4TfmUAYBOATQA2wSbYBJsAbAKwCTbBJtgEYBOATQA2wSbYBJsAbAKwCTbBJtgEYBOATQA2wSbYBJsAbAKwCTbBJtgEYBOATQA2wSbYBJvAaG369S/YhvNhk9NtGoTPf/G8MQY2OZnfGFSmyG9ardNv/fbv/O5g238Pp8TBhH//wrRcHIlE/uBCi7kkGp3xh3/0pTRbLyjBKXEnlVSm6ZbvdWaUc+msL1chiyFThlRHNWZfhkyGTJlRw02aOYM+zEEuQ6YMuZzZNHfe/Nrqecjm3OCPsyYTmUNLJqYTMjlnKFuQLZnIZdFo7RXQKbd0ujJbe54XjV61EDoBa5gbnUugE7CGWdHoPOgELOojmD2jinCdLq9Bbri8NVeW9X9RtYg9Qif3UxlZUDZW/+sq6OR2mSKLlxDoBBwnE3SCTNAJ2FMmodPVyHrIZJlOs7+CzIdM1lAHnVzINdeOi0z8/jno5D6dlozTP4ZOADoB6ARyQqelyAY3cKU9dIriNywu4LpIpQ0+RQw6uUOmyOLrbfA5LoNO7pBpiS0+CXSCTNAJ2FEm6ASZLNfpBpwWyGSdTtU4MQ61yWYyEfKV2dDJqdy4xHYfCToB6ASgE4BOwFaES2yv01U4S06R6abFS+yt0+XQyTkyRSIL7P0Ra6CTg2RadjOBTiBzym5xgEzQySEyLXCETNAJMlmu05yFOGWQyTKdroBOtrbJMTJRneZCJ3vrdOvNDvq086ATgE4AOgHoBMYhYCpzsE4zMTOizRpzt4QdrNOl0MlePQORG5364RddCp3sJtOCMsd+/CroBJmgE2SCTsDdMkEnyGS5TpjQbty55lo3yER1wtzSttDpljJXHAem2wTQCUAnAJ1A9lpzLtVpPk7t2HPzskp36oT5EcdDpkhkugt1mgOdxkemm8JuPDLM3gqZoBNkgk7A5TJBJ8hkuU634USPCTe6XSZMVT6WXOd2mQiZBZ2AdWD2VgCdAHQC0AlkwpJlS3JNJ0xolzWZFkcW3wydgEUyRa7LsWPGdJuQCTpBJugEmaATgEwj06kWClhHeEHuyoS5pS3n5mXX5fDRX4b5Ea3l+pw+eky3CaCTnbg1MgWZkKRT1e0zFiE3RhMrRSKTkAtJOl2NMmp0TGc/v3TLeDrW6DSLLJwdnem8z37HcsE43jJ7ayRyPRvrKwyTdJ2uIldEZztq6oMVK1fdqeqsvuvuNfeMy+dYHFlAZYpUwiPJ1Wy6zVg0+mXHfOJ777tfTeWulSvG/JMsiUQWQKYE2PyIM1l95wjWPrBO2FPf0ChZ3yCFun/DGJdQlRFGJZn4J1fCI8qi2G1cp2j0dkfUcKu4Nk3rNza3GNnUKoxafd/msfw4NzGZlt1Ei6fI9XCJkDnUo5nsIRq1/4Bh9zzIjNmyta3FhOaN65vo1m0rxy4iDl8b0ViGZh3hv7DTsPstBeEN26gt7aYqCTpat9AU2x8aq090jVTplsqpMEkE4TdcMVvYdJXNAyYWL9XvaBmUjsZOmurOwcKnnX/6Z1ZxMTXpzy/+i7/MYBd/9VWbZfPCrz2cIV9/5BuXRKOXPGwJ38zOUT60WlU7WztahmJXFyue7k2/o289ahnf/vZ3Mt7HYzvtZdMjj1vBE0/+9Xct2dHjf5ONg2QR09bmluGwqZ1G42lru68+ajO+Zy+b/vZxe/Gw9Ye4mTXlWluGScd6mnpDepue+jvb8H0b2vTdH9iGp7Nh04pnaC3X1jJ8dlOdng2ns+n7z9mG5+1o0x7b8IMs2LT5ftqU29syEtpoMP4sbIJNqbygqg3NLSNjb32ayg425bZNNABvH6lMVKcmVX0RNsGmpK4BGjPtbRk5O1R12x2wKedtqovOik/4uXa1qra1jIZGVd2+GTbluk1zo9HLY9rllHUj6BpIYr2qroJNuW7T1VSn6KW3aUFT1yhlauloV9WXYFOux00Lq9mlwzmLCLlntbqlY7Q2texV1Wdgk5NtevLpR6ozp45dhp5dvfCB0ddzsq57ETY52Ka/j1rIjH9Q2zsysGlvk7ouDJvsY1MsFn8cc5v+8Z9S23PNOxp3m/UYtDU2tqWY16WqKzOyqdvweh/9238gR22qHrYCg0FITH8cjk1PPPH12zLnBnZz8YyvqWp7sh8b2Q1M6sHk7sy97Wx1yvWXXSmF08hsOkAO6a8Pk53PdROyPxdt6ull247UjrVNVkThi1jYNHtW1d2q2pdcAskfFDQkNd+2iNWdu1I7ndZkYNM+Qo5qr49RkY4blnPHpuoqQqr6+6lRLw9x+mv7e+xm01JWMF0xj5Btan1LqjX1r7R3Jvdo0hrtn0+8Uq+q65NvdkrucxphTTdATsbFOp6jcVMV6eWnf2lvzxCnv4f0282mudHo7WxE8+WpfU172S+fGhpeSdamXW2iqxs61c7kmrFdXR3OwKb9elXHKrrctOkU6a2WL+ucZ9MNM29YKHsukyu6jTQ2Yto0JVV1tGhiq2nhtCm1qnsxA5viVdsxcpoFUgdEAdV9cufOkyxEP35AxOXdB07L52632URIYpEUO9XfP1/WeT10U09//ymuWaynn1T18FU9e6rny1rPmDzRplhNf39NTNuP/obsXPXdnlrSvDpU2dRk0oN5dyY9BFpVRys69kQIl+WM2Nlhrts+seaQTL/fZTYtJSShSJIzZoryipDqXn2pR+4jpq02SW6wab7Ycsqwn+zZdK+qbm0xiZvaG050Jndq0rhpyytmcVNLS726LRObTktLDpMzcZsOkwGqUPchVm5JfQ5Jq0YWXTnBph7SmyhT71Iabh8Ra6kmdLG2l9dwdbEaciTGuhL46toek+Rxm06RI9SwWC+p3WN8Q5Zs2mB288BG2aY7kdQTINt0Tak9UVS0tZn0XsqqTlR0wqbjUpn9ZICbJYoucoDLN+C2uKk/IRaq1qqpXl6oEHKEt+VksaLFTVpZlJpct6lOFnkv8z2QeGyWHZteUJtM+sFbmwbpb9rSZ9KrqaqvZWLTGV7V7ZNFFLfpgCinmFVaFbifnOEenWS1n5tt6hH68KKFW1BrCIgMNr2cJrluUw+ZLwJ7LqJ554OFNm1P7boUQw40Nprc8NS8o7Fxo9ktmptU9cFMbDrNbTkswydu006y8wCH12681NpJRIF1SNR37rWpXwvJa6UFMXObYoMk5490tz0cGjKla+ZZZ1PYLAgaDU3qCxldpzvEbDkmm3bSJp3jrDiiopFjtBA7TQuqY67rIaghVWY2xUZmUyzVpvjtkdm3iQbhjZbY1K5uz8imk7Re0yo6zaaT3QIWPh2l247SCu40TXdgZBWdwabX3zj75rgptPOtt46mtenlhDadhTbVxAR1e7Jv03KrbGpIaNSN3Caaz9SSkwabzugd5LLw2neYFl3HqVUDI7zwotn09ptnz559Y9xsOk3/+zuH09hUl9DfNJ/UaJJVDcMm0+T8Ud+S+Ibs2bTREpvWq2pmd6TQqm6AdBts2p9Yn50hhwcI72o6arhIPBKbjr7FTuc4jkjw5nP0A/xwwLz3sj/e3opRK3q1tTXDsMk0OX98OaECzbZND1ll01ZVvScjm06SAV0f0d90SBZOx7tFnD7A23OHybHEQmuYNh1+h57Kt06Pa7i08w36Gd790SEzm2grn/UZset0/XvqekWZIuu/JJuWSnl0OUyTi0e5ZU9dbAxsWmOhTSsysqlb9HobbKJn/tjhA7REOiNX8r4mlu70iG36lx+fZSfy+L5xhil99if7za76Lu2lPvWzsLmWd41X1Zw6QsjSPak21bGbDaqqDXKYJRePbMupHrppvsPKps2Z3Xt5jOjtfvmqe4Dv7Mw+WdWJtYdGWtFRm/6V1TE24lv/ZnJ/U10Nv3wyn5/xWv7ztCOaRdWyczIWF69OX22eXG6NHeGZON+wKgfipjQlVve+zHfy/KOP/cRWMr377z9Nd+9l/HTXiXbYYDfrJriYPnksVj02v/W1zKaG7Nhk2R0pPAR/t/vA+LKf13Q/HnDpL8ct7G9aZ+9fGbzNW1THB8YzCj/9luwkcKlNtukLH4PfrLzOW1T7x82lQ7xVeTT7v1kZv1Et7je/TjeKn2g+aHebCNlPw6d3xrX38s23iZttWqU2NVtgU6b3EIzR7+kO/eido+Nm08AbP3x9kPvC3WDTBlXdYYFNXap6rwNssvOvDNxg0x3WBE5bEoJw2JSjNtHAqbMjY5leVdUHYBNsIveNdhywpN+svASbnG/Te++f+yCjA1ubwdhNht6mbWHY5Hib/uPDc+c+yuzI1qlbLOgfSBzpGTY50Kaf/fzcuXMffpzZkT2QeVVHW3QPwSZn2/TeB9Sljz75NPOLK8YOzI6uTcPwp2+3hWOkwKZxt+nTTz6iMp17/5OM+cV6468wW9WmxqEaebvWq+rehPsHEodIgU0Os+lLH56zjD7jsJdsMp4tg1d9uzsTpvcxGfgSNjnLpv/8wDqbfqGqhoqrlblyIm0HeXNrPRsRzPALzYMY99L5cdPHP+c13ceZ87N1apNhgK/mLv6L3t27zFpvXexXwJ2tiZfoXiCwyfFtOtY9cO6zX2Z+cCtV9WCCM+v5cAMHd7+aMNhFW+MJvr7L6Nmu+sRLdLDJqT0E773PiqdfZX6X0/bkm+Y2dXWKASwauhob2/raGhu3nhBDWtS3Jtxz0NGQNNgObHJu7+UvP8u495Jf+92WcitBR6vUx0jT+rbUrqZnwrDJLdfp/uuzX1lweC9RU15NGcdJVm3SpKSKT/YnqOtWENiEq77JodMW027L5r6+HbSu60t3k9zqtQQ2wabUCyztm0Z4RaWvM/mSCmyCTTwSv4u2/PtGJBOt5tT7CGyCTalspjo1jWD2ng7WLfUggU2wKV1lN/x7nZobaMy0hsAm2JSG11arasPwgqe+etqaW0vS2/TY87bhKRva9NOnbcOTWbKJLN/GiqddQ98ed5Cme2ZF2v3sfNRm2Mym/37cXmTHJrLiGXYZbohbUnZtZf1Pd4cH2c//2Eumpz61l00P28ymb2brQNesY5d8W9P/ZHNTI7vwe9fawXfzv9+zEzaTiZCa/7MTVdk70PCGbXyw8FazAGpvIx8y/P4XCQDD6yt4cDW/ltLe2Ges8prbuur5+nWvIY/ACMKnlXfKq3NbGg42UrrYjFCc1avWhJFBYGTcs2bV6pR7CLbd/RBUAqOLoF7a8Oydukl3rtqwHHkCMmXt8nuRCQAAAAAAAAAAAAAAAAAAAAAAAACwAcWKr3CQzYWKL3mVT3HoofqUfPoYVDxpUxQoiuILFuaoCkPnj0iRniKaf55BtweN/4a9CipFzswtcaShQY5X4fiHvcfgoHnnxvzxDHrwXsU7RNHlNf4b9sqrFLs5tzzK8MveUC7bZJJwqG8Xf0uiTR4l5PTc8vqUggCtxoO0IGLHFwoqeVqKAKvbtS35fpqQfqHYOg/7Ymkb+B5CrCQj2t7cZJM4JNP8oUvFPmUCkQdvTMMoIMU0XgjRyiw/qPiK4wlEJFGYbFMhfYezcyug+L1BrwiTWNjInrzxmq4ovsWniG0s37hNcoPYg8hQbW8uskkekkn+eLRMypM2GdMIm5SCkJ9FC3yLR08g3k+SbSKK4nybWFkSYIUsiwL1Apznx4T4Fg/74ngNNmkb5B7491i+dplNAfP84ac/jwZAQe3gjWn4qiKhTUApKCQT8vUEbrPJpx9GMf0OsQBQfMviB0QPL9+nxLd4mVoeg036W8QeROggXruhTafXdPyQTPOHyLwIySoxIY1Y5eellozI9QS6TT532BRS/IUkT+EN1Dxa6tCvjaEA1nLLSzNK2xKIl035/Fl/i9hDSAnor52PMX/YIZnnj8EmUX4Z0jBFitg3kC4V8bLJY8gxPZH2bxxtU0B8TYIkz+8tZgWwiIqScqtQUQr1LVrcVCCftQ1yDxMMr52Pnj/aIZnmj27TBEMOJdjkCxXoWzx6AhGF5xv/Dduc79gvImuEFVAlPLQsDopWh8gJn7F3Lkit0bYEChR/Hlumz6xtp22Qe6CrC/S9uUAnmT/64Znmj7ApKA4+MQ3vIaCWBf0+3h5mbTotQbxTQf83bHceV3wRh49H8RJgCcWpWenY3kvYNN7wKyvJHZ5FsAmMshNi6DUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABchl8ONR5gkymFxGs2Fisbm1UO+i8m7jIZsN3nM90lS18wAVmbgzBTNAVIHh82k01yl28YN1rR5zNJpDCNTSK5YSRgPpKwu6bzAmlOPR/kPl+hZREbyp2woViLqVz+QuLxyyQeNjWQb/i79LDB7+MrQvqkHsDtNvFxfCfQJ4XVe0WsFMnPZzMEGO1ghVdR4gRdYgjzgJg7SM5bpaf3sm1ysio+/ZDJjFZ5xjcBd9jER+2llRZ74lUdG/DfOAGCNguQN3GCLv7eQlGteRIne2EUE22yKqNNCbNeGd8EXGITLZfY3C1y/ihe0QWM85vqNiVN0MUSe+gbi/icQmLeKs0mPpWCnKzKUNMlzmhlfBNwiU1UjhCf4ocHzEVBPp2GQlJqukDSBF3xssmjzw0TT0/0yaoMNiXOaGV8E3CJTaz68cth6mkh5WOVnM8sCk+aoIvb5PMpPi8xtUmbrEpMZmUyoxVscqNNxTx4EcWRiHj45OapPQSJE3QRPkleQN9Nqk1ysio+mZXJjFawyW34FNY9wFr/ogsgKKfPY/NIpfReJk7Qxd5R6FNCoVBAn7dK7FJO2KVPVsUmszKZ0cr4JgCoMHmeQIGhOwGAUcMb/sPv2ARgEHjN5Y6pKAEAAAAAgPP5fzsqxTCmCc5tAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTExLTE2VDA3OjA5OjE4KzAwOjAwOl3VoAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0xMS0xNlQwNzowOToxOCswMDowMEsAbRwAAAAASUVORK5CYII=\" width=\"589\" height=\"352\" class=\"img_ev3q\"> Active Record is the M in MVC — the model — which is the layer of the system responsible for representing business data and logic. Active Record facilitates the creation and use of business objects whose data requires persistent storage to a database. It is an implementation of the Active Record pattern which itself is a description of an Object Relational Mapping system.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"what-is-uml\">What is UML?<a href=\"https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide#what-is-uml\" class=\"hash-link\" aria-label=\"Direct link to What is UML?\" title=\"Direct link to What is UML?\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"UML\" src=\"https://umutyildirim.com/assets/images/uml-ccbc81519db113d44ee14a4bf9d88ffd.png\" width=\"633\" height=\"776\" class=\"img_ev3q\"> UML, short for Unified Modeling Language, is a standardized modeling language consisting of an integrated set of diagrams, developed to help system and software developers for specifying, visualizing, constructing, and documenting the artifacts of software systems, as well as for business modeling and other non-software systems. The UML represents a collection of best engineering practices that have proven successful in the modeling of large and complex systems. The UML is a very important part of developing object oriented software and the software development process. The UML uses mostly graphical notations to express the design of software projects. Using the UML helps project teams communicate, explore potential designs, and validate the architectural design of the software. In this article, we will give you detailed ideas about what is UML, the history of UML and a description of each UML diagram type, along with UML examples.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"all-about-active-record-migrations\">All About Active Record Migrations<a href=\"https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide#all-about-active-record-migrations\" class=\"hash-link\" aria-label=\"Direct link to All About Active Record Migrations\" title=\"Direct link to All About Active Record Migrations\">​</a></h2>\n<p>Now you understand Models section is related to setting up your backend database but still where should you start looking? First thing first, we need to define our schema so our apps know what type of data they are receiving and storing. This is the time you can refer to the Active Record Migrations page to review some migration definitions that are supported by the built-in change method, as below: (To see a full list, you can visit here)</p>\n<ul>\n<li><code>add_column</code></li>\n<li><code>add_foreign_key</code></li>\n<li><code>create_join_table</code></li>\n<li><code>create_table</code></li>\n<li><code>drop_join_table</code></li>\n<li><code>drop_table</code> (must supply a block)</li>\n<li><code>remove_column</code> (must supply a type)</li>\n<li><code>remove_foreign_key</code> (must supply a second table)</li>\n<li><code>rename_column</code></li>\n<li><code>rename_index</code></li>\n<li><code>rename_table</code></li>\n</ul>\n<p>After all, we are humans and we make mistakes, or after a while, you need to change the database table, such as adding or removing columns, based on the new business decision and your supervisor needs you to make the changes. You may or may not remember how to make the change so it’s the place you can find the information you need.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"all-about-active-record-associations\">All About Active Record Associations<a href=\"https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide#all-about-active-record-associations\" class=\"hash-link\" aria-label=\"Direct link to All About Active Record Associations\" title=\"Direct link to All About Active Record Associations\">​</a></h2>\n<p>Now after we have the ideas of how we would like to define the schema, we also need to think about the relationship between each database table. For example, we have a table to store all the books and another table contains all the book authors. Should we use has_many and belongs_to types of association or has_and_belongs_to_many association? Since there may be a case that one book has more than one author. When you come across association-related questions that you can search for the Active Record Associations page.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"all-about-active-record-query-interface\">All About Active Record Query Interface<a href=\"https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide#all-about-active-record-query-interface\" class=\"hash-link\" aria-label=\"Direct link to All About Active Record Query Interface\" title=\"Direct link to All About Active Record Query Interface\">​</a></h2>\n<p>Eventually, you would like to retrieve the data from the database after you have finished all the database creation and it’s the moment you would like to spend your time studying Active Record Query Interface page which covers different ways that you can interact with your data using Active Record. Personally, Active Record Query Interface is the one that I visit the most, and easily get confused about which finder method should I use and how many arguments that I can pass into the method.</p>\n<p>Below is a list of often used finder methods:</p>\n<ul>\n<li><code>find</code></li>\n<li><code>extending</code></li>\n<li><code>from</code></li>\n<li><code>group</code></li>\n<li><code>having</code></li>\n<li><code>includes</code></li>\n<li><code>joins</code></li>\n<li><code>lock</code></li>\n<li><code>none</code></li>\n<li><code>order</code></li>\n<li><code>reorder</code></li>\n<li><code>reselect</code></li>\n<li><code>reverse_order</code></li>\n<li><code>select</code></li>\n<li><code>where</code></li>\n</ul>\n<p>For retrieving a single object, below are the methods you can consider:</p>\n<ul>\n<li><code>find</code></li>\n<li><code>take</code></li>\n<li><code>first</code></li>\n<li><code>last</code></li>\n<li><code>find_by</code></li>\n</ul>\n<p>For retrieving multiple objects in batches, below are the methods you can consider:</p>\n<ul>\n<li><code>find_each</code></li>\n<li><code>find_in_batches</code></li>\n<li><code>first</code></li>\n<li><code>last</code></li>\n<li><code>find_by</code></li>\n</ul>\n<p>Although, some of the finder methods you may think their functions look similar at first, you should always double-check what are their expected return result and decide which method you should use. For example, how do you decide when to use find_by, where or find if you want to search for data from the database?</p>\n<p>Use <code>find_by</code> , if you’re expecting a single record or <code>nil</code> as a return Use <code>where</code> , if you’re expecting an <code>ActiveRecord::Relation</code> object as a return Use <code>find_by</code> , if you’re expecting a single record (by its primary column, usually <code>id</code> ) as a return Key Takeaway</p>\n<p>Knowing and understanding where you get stuck is the key before you jump right into the Ruby on Rails Guide and start looking for answers. Ask yourself this question first — At what step am I having a problem now? Is it migration, association, or retrieving the data (query interface)?</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"resources\">Resources<a href=\"https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide#resources\" class=\"hash-link\" aria-label=\"Direct link to Resources\" title=\"Direct link to Resources\">​</a></h2>\n<ul>\n<li><a href=\"https://guides.rubyonrails.org/active_record_basics.html\" target=\"_blank\" rel=\"noopener noreferrer\">https://guides.rubyonrails.org/active_record_basics.html</a></li>\n<li><a href=\"https://www.theodinproject.com/courses/ruby-on-rails\" target=\"_blank\" rel=\"noopener noreferrer\">https://www.theodinproject.com/courses/ruby-on-rails</a></li>\n</ul>",
            "url": "https://umutyildirim.com/blog/ruby-active-record-built_in-methods-beginner-guide",
            "title": "Ruby Active Record Built-In Methods Beginner Guide",
            "summary": "It doesn't matter if you are a beginner or a seasoned developer. From time to time, you need to look up certain programming language documentation to help you navigate through specific information to build up your application which then solves a definite task or problem. However, this skill is especially important for beginner developers since beginner developers, like myself, don't have many experiences in using built-in methods nor understanding how to implement the methods and the keywords to look for. For example, some methods require certain numbers of parameters, or even just simply land on the right page on the documentation.",
            "date_modified": "2022-10-04T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Firebase",
                "API",
                "Firebase Functions",
                "Cloud Functions",
                "JavaScript"
            ]
        },
        {
            "id": "https://umutyildirim.com/blog/user-authentication-firebase-react-apps",
            "content_html": "<p><img decoding=\"async\" loading=\"lazy\" alt=\"Header Image\" src=\"https://umutyildirim.com/assets/images/user-authentication-firebase-react-d9e8d32f3da82b3a623defae3eb743d7.jpeg\" width=\"730\" height=\"486\" class=\"img_ev3q\"></p>\n<p>Nowadays, security is very important on websites and apps. That's mainly to ensure that private data is not leaked to the public and someone doesn't do actions on your behalf.</p>\n<p>Today, we are going to use Firebase, which is a BaaS that helps us with various services such as database authentication and cloud storage. We are going to see how we can use the authentication service in Firebase to secure our React app.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"requirements-for-authenticating-with-firebase-in-react\">Requirements for authenticating with Firebase in React<a href=\"https://umutyildirim.com/blog/user-authentication-firebase-react-apps#requirements-for-authenticating-with-firebase-in-react\" class=\"hash-link\" aria-label=\"Direct link to Requirements for authenticating with Firebase in React\" title=\"Direct link to Requirements for authenticating with Firebase in React\">​</a></h2>\n<ul>\n<li>Node.js installed</li>\n<li>Code editor — I prefer Visual Studio Code</li>\n<li>Google account — we need this to use Firebase</li>\n<li>Basic knowledge of React — I won’t recommend this tutorial for complete beginners in React</li>\n</ul>\n<h1>Setting up Firebase</h1>\n<p>Before we dive into React and start coding some good stuff, we need to set up our own Firebase project through the <img decoding=\"async\" loading=\"lazy\" src=\"https://console.firebase.google.com/u/0/\" alt=\"Firebase Console\" class=\"img_ev3q\">. To get started, navigate your browser to Firebase Console. Make sure you are logged into your Google account.</p>\n<p>Now, click on Add project and you should be presented with the following screen:</p>\n<p>Once you’ve given it a sweet name, click on <strong>Continue</strong> and you should be prompted for an option to enable Google Analytics. We don’t need Google Analytics for this tutorial, but turning it on won’t do harm, so go ahead and turn it on if you want.</p>\n<p>Once you’ve completed all the steps, you should be presented with the dashboard, which looks something like this:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Firebase Project Created\" src=\"https://umutyildirim.com/assets/images/react-firebase-console-dashboard-24ef224c4d5c34f43b7ff32c0c7f5290.png\" width=\"730\" height=\"403\" class=\"img_ev3q\"> First, let’s set up authentication. Click on <strong>Authentication</strong> on the sidebar and click on <strong>Get Started</strong> to enable the module. Now you will be presented with various authentication options:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Firebase Auth Page\" src=\"https://umutyildirim.com/assets/images/authentication-page-firebase-eb395bff024ccffa554d28ad81037b4f.png\" width=\"730\" height=\"487\" class=\"img_ev3q\"> First click on <strong>Email/Password</strong>, enable it, and save it:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Email Password Options Firebase\" src=\"https://umutyildirim.com/assets/images/email-password-options-firebase-a4ed34ea65e5f73a451e20ed87206917.png\" width=\"730\" height=\"233\" class=\"img_ev3q\"> Now press on <strong>Google</strong>:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Google Options Firebase\" src=\"https://umutyildirim.com/assets/images/google-options-firebase-console-660d8a29128a5019c43a6ad390fb6b54.png\" width=\"730\" height=\"498\" class=\"img_ev3q\"> Press enable, select a project support email address, and click on <strong>Save</strong> to activate Google Authentication for our app.</p>\n<p>Now, let’s set up the database we are going to use for our project, which is Cloud Firestore. Click on <strong>Cloud Firestore</strong> on the sidebar and click on <strong>Create Database</strong>. You should be presented with the following dialog:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Cloud Firestore Create Database\" src=\"https://umutyildirim.com/assets/images/cloud-firestore-create-database-a1694b5144cab92f557f92ba68c012fd.png\" width=\"730\" height=\"492\" class=\"img_ev3q\"> Remember to select <strong>Start in test mode</strong>. We are using test mode because we are not dealing with production-level applications in this tutorial. Production mode databases require a configuration of security rules, which is out of the scope of this tutorial.</p>\n<p>Click Next. Select the region. I’ll leave it to the default, and then press <strong>Enable</strong>. This should completely set up your Cloud Firestore database.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"creating-and-setting-up-a-react-app\">Creating and setting up a React app<a href=\"https://umutyildirim.com/blog/user-authentication-firebase-react-apps#creating-and-setting-up-a-react-app\" class=\"hash-link\" aria-label=\"Direct link to Creating and setting up a React app\" title=\"Direct link to Creating and setting up a React app\">​</a></h2>\n<p>Navigate to a safe folder and type the following command in the terminal to create a new React app:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">npx create-react-app appname</span><br></span></code></pre></div></div>\n<p>Remember to replace <code>appname</code> with a name of your choice. The name doesn’t really affect how the tutorial works. Once the React app is successfully created, type the command to install a few npm packages we will need throughout the project:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">npm install firebase react-router-dom react-firebase-hooks</span><br></span></code></pre></div></div>\n<p>Here, we are installing <code>firebase</code> to communicate with Firebase services, and we are also installing <code>react-router-dom</code> to handle the routing of the application. We use <code>react-firebase-hooks</code> to manage the authentication state of the user.</p>\n<p>Type the following command to run your React app:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">cd appname &amp;&amp; npm start</span><br></span></code></pre></div></div>\n<p>This should fire up your browser and you should see the following screen: <img decoding=\"async\" loading=\"lazy\" alt=\"React App Beginning Setup Firebase\" src=\"https://umutyildirim.com/assets/images/react-app-beginning-setup-firebase-ce9fe16631aace9d028e944625dc5b8a.png\" width=\"730\" height=\"406\" class=\"img_ev3q\"> Now, let’s do some cleanup so that we can continue with coding. Delete the following files from the <code>src</code> folder: <code>App.test.js</code>, <code>logo.svg</code>, and <code>setupTests.js</code>. Once you delete these files, delete all the contents of <code>App.css</code> and you will see an error on the React app. Don’t worry; just remove the logo imports in <code>App.js</code> and empty the div so that your <code>App.js</code> looks like this:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./App.css'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">App</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"app\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">App</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"integrating-firebase-into-our-react-app\">Integrating Firebase into our React app<a href=\"https://umutyildirim.com/blog/user-authentication-firebase-react-apps#integrating-firebase-into-our-react-app\" class=\"hash-link\" aria-label=\"Direct link to Integrating Firebase into our React app\" title=\"Direct link to Integrating Firebase into our React app\">​</a></h2>\n<p>Go to your Firebase Console dashboard, click on <strong>Project Settings</strong>, scroll down, and you should see something like this:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Project Settings No App Firebase\" src=\"https://umutyildirim.com/assets/images/project-settings-no-app-firebase-c8c62cb7cdd775099f13f097d6a85756.png\" width=\"730\" height=\"158\" class=\"img_ev3q\"> Click on the third icon to configure our Firebase project for the web. Enter the app name and click on <strong>Continue</strong>. Go back to the project settings and you should now see a config like this:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Web Config Firebase Console\" src=\"https://umutyildirim.com/assets/images/web-config-firebase-console-ccb63d8bbeb3d5160834784661594d40.png\" width=\"730\" height=\"413\" class=\"img_ev3q\"> Copy the config. Create a new file in the <code>src</code> folder named <code>firebase.js</code>. Let’s first import <code>firebase</code> modules, since Firebase uses modular usage in v9:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> initializeApp </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"firebase/app\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">​​</span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  </span><span class=\"token imports maybe-class-name\">GoogleAuthProvider</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  getAuth</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  signInWithPopup</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  signInWithEmailAndPassword</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  createUserWithEmailAndPassword</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  sendPasswordResetEmail</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  signOut</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"firebase/auth\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">​​</span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  getFirestore</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  query</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  getDocs</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  collection</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  where</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​  addDoc</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">​​</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"firebase/firestore\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Now paste in the config we just copied. Let’s initialize our app and services so that we can use Firebase throughout our app:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> app </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">​​initializeApp</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">firebaseConfig</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">​​</span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> auth </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getAuth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">app</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">​​</span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> db </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getFirestore</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">app</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>This will use our config to recognize the project and initialize authentication and database modules.</p>\n<p>We will be creating all important authentication-related functions in <code>firebase.js</code> itself. So first look at the Google Authentication function:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> googleProvider </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">GoogleAuthProvider</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">signInWithGoogle</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> res </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">signInWithPopup</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> googleProvider</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> user </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> q </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">query</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">collection</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">db</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'users'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">where</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'uid'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'=='</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">uid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> docs </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getDocs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">q</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">docs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">docs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">length</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">addDoc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">collection</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">db</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'users'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">uid</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">uid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">name</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">displayName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">authProvider</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'google'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">email</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>In the above code block, we are using a <code>try…catch</code> block along with async functions so that we can handle errors easily and avoid callbacks as much as possible.</p>\n<p>First, we are attempting to log in using the <code>GoogleAuthProvider</code> Firebase provides us. If the authentication fails, the flow is sent to the <code>catch</code> block.</p>\n<p>Then we are querying the database to check if this user is registered in our database with the user <code>uid</code>. And if there is no user with the <code>uid</code>, which also means that the user is new to our app, we make a new record in our database with additional data for future reference.</p>\n<p>Now let’s make a function for signing in using an email and password:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">logInWithEmailAndPassword</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">email</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">signInWithEmailAndPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>This code is very simple. Since we know that the user is already registered with us, we don’t need to check the database. We can proceed with the authentication right away. We just pass in the email and password to <code>signInWithEmailAndPassword</code> functions, which is provided to us by Firebase.</p>\n<p>Now, let’s create a function for registering a user with an email and password:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">registerWithEmailAndPassword</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">name</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> email</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> res </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">createUserWithEmailAndPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> user </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">addDoc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">collection</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">db</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'users'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">uid</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">uid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">authProvider</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'local'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Since we know that the user is new to our app, we create a record for the user without checking if there is one existing in our database. It’s similar to the approach we used in Google Authentication but without checks.</p>\n<p>Create a function that will send a password reset link to an email address:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">sendPasswordReset</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">sendPasswordResetEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'Password reset link sent!'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>This code is simple. We are just passing in the email in the <code>sendPasswordResetEmail</code> function provided by Firebase. The password reset email will be sent by Firebase.</p>\n<p>And finally, the logout function:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">logout</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">signOut</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Nothing much here, just firing up the <code>signOut</code> function from Firebase, and Firebase will do its magic and log out the user for us.</p>\n<p>Finally we export all the functions, and here’s how your <code>firebase.js</code> should finally look:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">initializeApp</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'firebase/app'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  </span><span class=\"token imports maybe-class-name\">GoogleAuthProvider</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  getAuth</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  signInWithPopup</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  signInWithEmailAndPassword</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  createUserWithEmailAndPassword</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  sendPasswordResetEmail</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  signOut</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\"></span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'firebase/auth'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  getFirestore</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  query</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  getDocs</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  collection</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  where</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\">  addDoc</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token imports\"></span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'firebase/firestore'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> firebaseConfig </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">apiKey</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'AIzaSyDIXJ5YT7hoNbBFqK3TBcV41-TzIO-7n7w'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">authDomain</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'fir-auth-6edd8.firebaseapp.com'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">projectId</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'fir-auth-6edd8'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">storageBucket</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'fir-auth-6edd8.appspot.com'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">messagingSenderId</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'904760319835'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">appId</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'1:904760319835:web:44fd0d957f114b4e51447e'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">measurementId</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'G-Q4TYKH9GG7'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> app </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">initializeApp</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">firebaseConfig</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> auth </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getAuth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">app</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> db </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getFirestore</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">app</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> googleProvider </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">GoogleAuthProvider</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">signInWithGoogle</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> res </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">signInWithPopup</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> googleProvider</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> user </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> q </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">query</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">collection</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">db</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'users'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">where</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'uid'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'=='</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">uid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> docs </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getDocs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">q</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">docs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">docs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">length</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">addDoc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">collection</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">db</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'users'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">uid</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">uid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">name</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">displayName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">authProvider</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'google'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">email</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">logInWithEmailAndPassword</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">email</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">signInWithEmailAndPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">registerWithEmailAndPassword</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">name</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> email</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> res </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">createUserWithEmailAndPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> user </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">addDoc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">collection</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">db</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'users'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">uid</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">uid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">authProvider</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'local'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">sendPasswordReset</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">sendPasswordResetEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'Password reset link sent!'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">message</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">logout</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">signOut</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\">  auth</span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\">  db</span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\">  signInWithGoogle</span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\">  logInWithEmailAndPassword</span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\">  registerWithEmailAndPassword</span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\">  sendPasswordReset</span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\">  logout</span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token exports\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token exports\"></span><span class=\"token exports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Next, let’s work on the actual functionality.</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"creating-the-login-page\">Creating the login page<a href=\"https://umutyildirim.com/blog/user-authentication-firebase-react-apps#creating-the-login-page\" class=\"hash-link\" aria-label=\"Direct link to Creating the login page\" title=\"Direct link to Creating the login page\">​</a></h2>\n<p>Create two new files to create a new component, <code>Login.js</code> and <code>Login.css</code>. I highly recommend installing ES7 snippets in Visual Studio Code so that you can just start typing <code>rfce</code> and press Enter to create a component boilerplate.</p>\n<p>Now, let’s assign this component to a route. To do that, we need to configure React Router. Go to <code>App.js</code> and import the following:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports maybe-class-name\">BrowserRouter</span><span class=\"token imports\"> </span><span class=\"token imports keyword module\" style=\"font-style:italic\">as</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Router</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Route</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Routes</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Then, in the JSX part of App.js, add the following configuration to enable routing for our app:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"app\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Router</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Switch</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> exact path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/\"</span><span class=\"token plain\"> component</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token maybe-class-name\">Login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Switch</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Router</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><br></span></code></pre></div></div>\n<p>Remember to import the <code>Login</code> component on the top!</p>\n<p>Go to <code>Login.css</code> and add the following styles. We won’t be focusing on styling much, so here are the styles for you to use:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.login</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">height</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vh</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">width</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vw</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">align-items</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">justify-content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.login__container</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">flex-direction</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> column</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">text-align</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token hexcode color\">#dcdcdc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">30</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.login__textBox</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">font-size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">18</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-bottom</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.login__btn</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">font-size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">18</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-bottom</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">border</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> none</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">white</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">black</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.login__google</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token hexcode color\">#4285f4</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.login</span><span class=\"token selector\" style=\"color:rgb(199, 146, 234)\"> div</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-top</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">7</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>Go to <code>Login.js</code>, and let’s look at how our login functionality works:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">React</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useEffect</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> useState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports maybe-class-name\">Link</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> useNavigate</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">auth</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> signInWithEmailAndPassword</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> signInWithGoogle</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./firebase'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useAuthState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-firebase-hooks/auth'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Login.css'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useAuthState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> navigate </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useNavigate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useEffect</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// maybe trigger a loading screen</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">navigate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'/dashboard'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"login\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"login__container\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">input</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"text\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"login__textBox\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          value</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onChange</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">target</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          placeholder</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"E-mail Address\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">input</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"password\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"login__textBox\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          value</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onChange</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">target</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          placeholder</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Password\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">button</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"login__btn\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">signInWithEmailAndPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Login</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">button</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">button className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"login__btn login__google\"</span><span class=\"token plain\"> onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">signInWithGoogle</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Login</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">with</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">Google</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">button</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Link</span><span class=\"token plain\"> to</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/reset\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token maybe-class-name\">Forgot</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">Password</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Link</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Don</span><span class=\"token plain\">'t have an account</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Link</span><span class=\"token plain\"> to</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/register\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token maybe-class-name\">Register</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Link</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> now</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">Login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>The above code might look long and hard to understand, but it’s really not. We have already covered the main authentication parts and now we are just implementing them in our layouts.</p>\n<p>Here’s what’s happening in the above code block. We are using the functions we made in <code>firebase.js</code> for authentication. We are also using <code>react-firebase-hooks</code> along with <code>useEffect</code> to track the authentication state of the user. So, if the user gets authenticated, the user will automatically get redirected to the dashboard, which we are yet to make.</p>\n<p>Here’s what you’ll see on your screen:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Basic Login Page React Firebase\" src=\"https://umutyildirim.com/assets/images/basic-login-page-react-firebase-b8e1459be66b2457c8fb1be8fd750e9d.png\" width=\"730\" height=\"402\" class=\"img_ev3q\"> Create a new component called <code>Register</code> to handle user registrations. Here are the styles for <code>Register.css</code>:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.register</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">height</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vh</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">width</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vw</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">align-items</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">justify-content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.register__container</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">flex-direction</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> column</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">text-align</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token hexcode color\">#dcdcdc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">30</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.register__textBox</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">font-size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">18</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-bottom</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.register__btn</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">font-size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">18</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-bottom</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">border</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> none</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">white</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">black</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.register__google</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token hexcode color\">#4285f4</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.register</span><span class=\"token selector\" style=\"color:rgb(199, 146, 234)\"> div</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-top</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">7</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>After that, let’s look at how the register functionality is implemented in the layout. Use this layout in <code>Register.js</code>:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">React</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useEffect</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> useState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useAuthState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-firebase-hooks/auth'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports maybe-class-name\">Link</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> useHistory</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">auth</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> registerWithEmailAndPassword</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> signInWithGoogle</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./firebase'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Register.css'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Register</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useAuthState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> history </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useHistory</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">register</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'Please enter name'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">registerWithEmailAndPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useEffect</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> history</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">replace</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'/dashboard'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"register\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"register__container\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">input</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"text\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"register__textBox\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          value</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onChange</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">target</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          placeholder</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Full Name\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">input</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"text\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"register__textBox\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          value</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onChange</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">target</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          placeholder</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"E-mail Address\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">input</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"password\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"register__textBox\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          value</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">password</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onChange</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setPassword</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">target</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          placeholder</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Password\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">button className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"register__btn\"</span><span class=\"token plain\"> onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">register</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Register</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">button</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">button</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"register__btn register__google\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">signInWithGoogle</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Register</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">with</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">Google</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">button</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Already</span><span class=\"token plain\"> have an account</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Link</span><span class=\"token plain\"> to</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token maybe-class-name\">Login</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Link</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> now</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">Register</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Here, we are using similar approach as we used in the <code>Login</code> component. We are just using the functions we previously created in <code>firebase.js</code>. Again, here we are using <code>useEffect</code> along with <code>react-firebase-hooks</code> to keep track of user authentication status.</p>\n<p>Let’s look at resetting passwords. Create a new component called <code>Reset</code>, and here’s the styling for <code>Reset.css</code>:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.reset</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">height</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vh</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">width</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vw</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">align-items</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">justify-content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.reset__container</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">flex-direction</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> column</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">text-align</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token hexcode color\">#dcdcdc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">30</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.reset__textBox</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">font-size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">18</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-bottom</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.reset__btn</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">font-size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">18</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-bottom</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">border</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> none</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">white</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">black</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.reset</span><span class=\"token selector\" style=\"color:rgb(199, 146, 234)\"> div</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-top</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">7</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>This is the layout for <code>Reset.js</code>:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">React</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useEffect</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> useState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useAuthState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-firebase-hooks/auth'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useNavigate</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports maybe-class-name\">Link</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">auth</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> sendPasswordResetEmail</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./firebase'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Reset.css'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Reset</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useAuthState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> navigate </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useNavigate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useEffect</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">navigate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'/dashboard'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"reset\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"reset__container\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">input</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"text\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"reset__textBox\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          value</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onChange</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">e</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">target</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          placeholder</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"E-mail Address\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">button</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"reset__btn\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">sendPasswordResetEmail</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Send</span><span class=\"token plain\"> password reset email</span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">button</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Don</span><span class=\"token plain\">'t have an account</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Link</span><span class=\"token plain\"> to</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/register\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token maybe-class-name\">Register</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Link</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> now</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">Reset</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>This is similar to what we did for the <code>Login</code> and <code>Register</code> components. We are simply using the functions we created earlier.</p>\n<p>Now, let’s focus on the dashboard. Create a new component called <code>Dashboard</code>, and here’s the styling for <code>Dashboard.css</code>:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.dashboard</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">height</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vh</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">width</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100</span><span class=\"token unit\">vw</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">align-items</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">justify-content</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.dashboard__container</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">display</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> flex</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">flex-direction</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> column</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">text-align</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> center</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token hexcode color\">#dcdcdc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">30</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.dashboard__btn</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">padding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">font-size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">18</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-top</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">10</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">border</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> none</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">white</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">background-color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token color\">black</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:rgb(199, 146, 234)\">.dashboard</span><span class=\"token selector\" style=\"color:rgb(199, 146, 234)\"> div</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">margin-top</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">7</span><span class=\"token unit\">px</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></span></code></pre></div></div>\n<p>And here’s the layout for <code>Dashboard.js</code>:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">React</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useEffect</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> useState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useAuthState</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-firebase-hooks/auth'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">useNavigate</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Dashboard.css'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">auth</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> db</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> logout</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./firebase'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\">query</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> collection</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> getDocs</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> where</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'firebase/firestore'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Dashboard</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useAuthState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> navigate </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useNavigate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">fetchUserName</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> q </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">query</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">collection</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">db</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'users'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">where</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'uid'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'=='</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> user</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?.</span><span class=\"token plain\">uid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> doc </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getDocs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">q</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> data </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> doc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">docs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">data</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">data</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">catch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">error</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">err</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">alert</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'An error occured while fetching user data'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useEffect</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">navigate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'/'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">fetchUserName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">user</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> loading</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"dashboard\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"dashboard__container\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token maybe-class-name\">Logged</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">in</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">as</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">user</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?.</span><span class=\"token plain\">email</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">button className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"dashboard__btn\"</span><span class=\"token plain\"> onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">logout</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token maybe-class-name\">Logout</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">button</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">Dashboard</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>Unlike the other components, there’s something else we are doing here. We are checking the authentication state. If the user is not authenticated, we redirect the user to the login page.</p>\n<p>We are also fetching our database and retrieving the name of the user based on the <code>uid</code> of the user. Finally, we are rendering out everything on the screen.</p>\n<p>Lastly, let’s add everything to the router. Your <code>App.js</code> should look like this:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./App.css'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports maybe-class-name\">BrowserRouter</span><span class=\"token imports\"> </span><span class=\"token imports keyword module\" style=\"font-style:italic\">as</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Router</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Route</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">Routes</span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'react-router-dom'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">Login</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Login'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">Register</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Register'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">Reset</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Reset'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">Dashboard</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'./Dashboard'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">App</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"app\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Router</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Routes</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> exact path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Login</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> exact path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/register\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Register</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> exact path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/reset\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Reset</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Route</span><span class=\"token plain\"> exact path</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"/dashboard\"</span><span class=\"token plain\"> element</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">Dashboard</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Routes</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token maybe-class-name\">Router</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">App</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></span></code></pre></div></div>\n<p>The app is fully functional!</p>\n<h2 class=\"anchor anchorWithStickyNavbar_LWe7\" id=\"whats-next\">What's next?<a href=\"https://umutyildirim.com/blog/user-authentication-firebase-react-apps#whats-next\" class=\"hash-link\" aria-label=\"Direct link to What's next?\" title=\"Direct link to What's next?\">​</a></h2>\n<p>Once you’re done with this build, I want you to play around with this. Try adding Facebook authentication next. What about GitHub authentication? I’d say keep experimenting with the code because that’s how you practice and learn things. If you just keep copying the code, you won’t understand the fundamentals of Firebase.</p>",
            "url": "https://umutyildirim.com/blog/user-authentication-firebase-react-apps",
            "title": "Handling user authentication with Firebase in your React apps",
            "summary": "Header Image",
            "date_modified": "2022-09-13T00:00:00.000Z",
            "author": {
                "name": "Umut YILDIRIM",
                "url": "https://github.com/umuthopeyildirim"
            },
            "tags": [
                "Firebase",
                "Auth",
                "React",
                "JavaScript"
            ]
        }
    ]
}