aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastien Castiel <sebastien@castiel.me>2023-12-13 12:55:31 -0500
committerSebastien Castiel <sebastien@castiel.me>2023-12-13 13:01:59 -0500
commit9e2834abc323e9b46803b764b0d04393d437a7cc (patch)
treec14d3fa189af3cc8f58c5fd0b437157360e13e6e
parent6bd99d9a346d8af23911b73de011ea951c889661 (diff)
Add share button
-rw-r--r--src/app/groups/[groupId]/layout.tsx2
-rw-r--r--src/app/groups/[groupId]/share-button.tsx12
-rw-r--r--src/components/share-url-button.tsx44
3 files changed, 54 insertions, 4 deletions
diff --git a/src/app/groups/[groupId]/layout.tsx b/src/app/groups/[groupId]/layout.tsx
index ca50762..07cf17f 100644
--- a/src/app/groups/[groupId]/layout.tsx
+++ b/src/app/groups/[groupId]/layout.tsx
@@ -42,7 +42,7 @@ export default async function GroupLayout({
<div className="flex gap-2 justify-between">
<GroupTabs groupId={groupId} />
- <ShareButton groupId={groupId} />
+ <ShareButton group={group} />
</div>
</div>
diff --git a/src/app/groups/[groupId]/share-button.tsx b/src/app/groups/[groupId]/share-button.tsx
index 808f3a0..fe2e5fb 100644
--- a/src/app/groups/[groupId]/share-button.tsx
+++ b/src/app/groups/[groupId]/share-button.tsx
@@ -1,4 +1,5 @@
import { CopyButton } from '@/components/copy-button'
+import { ShareUrlButton } from '@/components/share-url-button'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import {
@@ -7,14 +8,15 @@ import {
PopoverTrigger,
} from '@/components/ui/popover'
import { env } from '@/lib/env'
+import { Group } from '@prisma/client'
import { Share } from 'lucide-react'
type Props = {
- groupId: string
+ group: Group
}
-export function ShareButton({ groupId }: Props) {
- const url = `${env.NEXT_PUBLIC_BASE_URL}/groups/${groupId}`
+export function ShareButton({ group }: Props) {
+ const url = `${env.NEXT_PUBLIC_BASE_URL}/groups/${group.id}`
return (
<Popover>
@@ -31,6 +33,10 @@ export function ShareButton({ groupId }: Props) {
<div className="flex gap-2">
<Input className="flex-1" defaultValue={url} readOnly />
<CopyButton text={url} />
+ <ShareUrlButton
+ text={`Join my group ${group.name} on Spliit`}
+ url={url}
+ />
</div>
<p>
<strong>Warning!</strong> Every person with the group URL will be able
diff --git a/src/components/share-url-button.tsx b/src/components/share-url-button.tsx
new file mode 100644
index 0000000..d31aa78
--- /dev/null
+++ b/src/components/share-url-button.tsx
@@ -0,0 +1,44 @@
+'use client'
+
+import { Button } from '@/components/ui/button'
+import { Share } from 'lucide-react'
+import { useEffect, useState } from 'react'
+
+interface Props {
+ text: string
+ url: string
+}
+
+export function ShareUrlButton({ url, text }: Props) {
+ const canShare = useCanShare(url, text)
+ if (!canShare) return null
+
+ return (
+ <Button
+ size="icon"
+ variant="secondary"
+ type="button"
+ onClick={() => {
+ if (navigator.share) {
+ navigator.share({ text, url })
+ } else {
+ console.log('Sharing is not available', { text, url })
+ }
+ }}
+ >
+ <Share className="w-4 h-4" />
+ </Button>
+ )
+}
+
+function useCanShare(url: string, text: string) {
+ const [canShare, setCanShare] = useState<boolean | null>(null)
+
+ useEffect(() => {
+ setCanShare(
+ navigator.share !== undefined && navigator.canShare({ url, text }),
+ )
+ }, [text, url])
+
+ return canShare
+}