From 545cf75e9993f4dbc0653512d01b198f111998bf Mon Sep 17 00:00:00 2001
From: Sebastien Castiel <sebastien@castiel.me>
Date: Wed, 24 Jan 2024 11:12:55 -0500
Subject: Join group by URL (Closes #55)

---
 src/app/groups/recent-group-list.tsx | 68 +++++++++++++++++++++++++++---------
 1 file changed, 51 insertions(+), 17 deletions(-)

(limited to 'src/app/groups/recent-group-list.tsx')

diff --git a/src/app/groups/recent-group-list.tsx b/src/app/groups/recent-group-list.tsx
index 5f41fdb..9ad6f56 100644
--- a/src/app/groups/recent-group-list.tsx
+++ b/src/app/groups/recent-group-list.tsx
@@ -1,5 +1,6 @@
 'use client'
 import { getGroupsAction } from '@/app/groups/actions'
+import { AddGroupByUrlButton } from '@/app/groups/add-group-by-url-button'
 import {
   RecentGroups,
   getArchivedGroups,
@@ -10,7 +11,7 @@ import { Button } from '@/components/ui/button'
 import { getGroups } from '@/lib/api'
 import { Loader2 } from 'lucide-react'
 import Link from 'next/link'
-import { SetStateAction, useEffect, useState } from 'react'
+import { PropsWithChildren, SetStateAction, useEffect, useState } from 'react'
 import { RecentGroupListCard } from './recent-group-list-card'
 
 export type RecentGroupsState =
@@ -54,7 +55,7 @@ function sortGroups(
 export function RecentGroupList() {
   const [state, setState] = useState<RecentGroupsState>({ status: 'pending' })
 
-  useEffect(() => {
+  function loadGroups() {
     const groupsInStorage = getRecentGroups()
     const starredGroups = getStarredGroups()
     const archivedGroups = getArchivedGroups()
@@ -73,35 +74,43 @@ export function RecentGroupList() {
         archivedGroups,
       })
     })
+  }
+
+  useEffect(() => {
+    loadGroups()
   }, [])
 
   if (state.status === 'pending') {
     return (
-      <p>
-        <Loader2 className="w-4 m-4 mr-2 inline animate-spin" /> Loading recent
-        groups…
-      </p>
+      <GroupsPage reload={loadGroups}>
+        <p>
+          <Loader2 className="w-4 m-4 mr-2 inline animate-spin" /> Loading
+          recent groups…
+        </p>
+      </GroupsPage>
     )
   }
 
   if (state.groups.length === 0) {
     return (
-      <div className="text-sm space-y-2">
-        <p>You have not visited any group recently.</p>
-        <p>
-          <Button variant="link" asChild className="-m-4">
-            <Link href={`/groups/create`}>Create one</Link>
-          </Button>{' '}
-          or ask a friend to send you the link to an existing one.
-        </p>
-      </div>
+      <GroupsPage reload={loadGroups}>
+        <div className="text-sm space-y-2">
+          <p>You have not visited any group recently.</p>
+          <p>
+            <Button variant="link" asChild className="-m-4">
+              <Link href={`/groups/create`}>Create one</Link>
+            </Button>{' '}
+            or ask a friend to send you the link to an existing one.
+          </p>
+        </div>
+      </GroupsPage>
     )
   }
 
   const { starredGroupInfo, groupInfo, archivedGroupInfo } = sortGroups(state)
 
   return (
-    <>
+    <GroupsPage reload={loadGroups}>
       {starredGroupInfo.length > 0 && (
         <>
           <h2 className="mb-2">Starred groups</h2>
@@ -132,7 +141,7 @@ export function RecentGroupList() {
           </div>
         </>
       )}
-    </>
+    </GroupsPage>
   )
 }
 
@@ -158,3 +167,28 @@ function GroupList({
     </ul>
   )
 }
+
+function GroupsPage({
+  children,
+  reload,
+}: PropsWithChildren<{ reload: () => void }>) {
+  return (
+    <>
+      <div className="flex flex-col sm:flex-row sm:items-center justify-between gap-2">
+        <h1 className="font-bold text-2xl flex-1">
+          <Link href="/groups">My groups</Link>
+        </h1>
+        <div className="flex gap-2">
+          <AddGroupByUrlButton reload={reload} />
+          <Button asChild>
+            <Link href="/groups/create">
+              {/* <Plus className="w-4 h-4 mr-2" /> */}
+              <>Create</>
+            </Link>
+          </Button>
+        </div>
+      </div>
+      <div>{children}</div>
+    </>
+  )
+}
-- 
cgit v1.3

