From ad1bb5e95cf041d6d481f0408f5ce7fddefa7f97 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Wed, 9 Apr 2025 21:10:56 -0500 Subject: [PATCH] Integrate native share sheets --- src/camera/CameraShareModal.tsx | 3 ++- src/film/FilmShareModal.tsx | 3 ++- src/focal/FocalLengthShareModal.tsx | 3 ++- src/focal/index.ts | 7 +++++-- src/lens/LensShareModal.tsx | 3 ++- src/photo/PhotoShareModal.tsx | 3 ++- src/recipe/PhotoRecipeOverlayButton.tsx | 2 +- src/recipe/RecipeShareModal.tsx | 3 ++- src/share/ShareModal.tsx | 16 ++++++++++++++-- src/tag/TagShareModal.tsx | 3 ++- 10 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/camera/CameraShareModal.tsx b/src/camera/CameraShareModal.tsx index a4d0d532..e0cb2faf 100644 --- a/src/camera/CameraShareModal.tsx +++ b/src/camera/CameraShareModal.tsx @@ -2,7 +2,7 @@ import { absolutePathForCamera } from '@/app/paths'; import { PhotoSetAttributes } from '../category'; import ShareModal from '@/share/ShareModal'; import CameraOGTile from './CameraOGTile'; -import { Camera } from '.'; +import { Camera, formatCameraText } from '.'; import { shareTextForCamera } from './meta'; export default function CameraShareModal({ @@ -16,6 +16,7 @@ export default function CameraShareModal({ return ( diff --git a/src/film/FilmShareModal.tsx b/src/film/FilmShareModal.tsx index 9fdff02c..096cfb29 100644 --- a/src/film/FilmShareModal.tsx +++ b/src/film/FilmShareModal.tsx @@ -2,7 +2,7 @@ import { absolutePathForFilm } from '@/app/paths'; import { PhotoSetAttributes } from '../category'; import ShareModal from '@/share/ShareModal'; import FilmOGTile from './FilmOGTile'; -import { shareTextForFilm } from '.'; +import { labelForFilm, shareTextForFilm } from '.'; export default function FilmShareModal({ film, @@ -15,6 +15,7 @@ export default function FilmShareModal({ return ( diff --git a/src/focal/FocalLengthShareModal.tsx b/src/focal/FocalLengthShareModal.tsx index 5a8028e4..931d60d8 100644 --- a/src/focal/FocalLengthShareModal.tsx +++ b/src/focal/FocalLengthShareModal.tsx @@ -2,7 +2,7 @@ import { absolutePathForFocalLength } from '@/app/paths'; import { PhotoSetAttributes } from '../category'; import ShareModal from '@/share/ShareModal'; import FocalLengthOGTile from './FocalLengthOGTile'; -import { shareTextFocalLength } from '.'; +import { formatFocalLengthSafe, shareTextFocalLength } from '.'; export default function FocalLengthShareModal({ focal, @@ -15,6 +15,7 @@ export default function FocalLengthShareModal({ return ( diff --git a/src/focal/index.ts b/src/focal/index.ts index 8d744a79..609a1836 100644 --- a/src/focal/index.ts +++ b/src/focal/index.ts @@ -19,10 +19,13 @@ export const getFocalLengthFromString = (focalString?: string) => { return focal ? parseInt(focal, 10) : 0; }; -export const formatFocalLength = (focal?: number) => focal ? - `${focal}mm` +export const formatFocalLength = (focal?: number) => focal + ? formatFocalLengthSafe(focal) : undefined; +export const formatFocalLengthSafe = (focal = 0) => + `${focal}mm`; + export const titleForFocalLength = ( focal: number, photos: Photo[], diff --git a/src/lens/LensShareModal.tsx b/src/lens/LensShareModal.tsx index 5e0705f4..f18a32c1 100644 --- a/src/lens/LensShareModal.tsx +++ b/src/lens/LensShareModal.tsx @@ -1,7 +1,7 @@ import { absolutePathForLens } from '@/app/paths'; import { PhotoSetAttributes } from '../category'; import ShareModal from '@/share/ShareModal'; -import { Lens } from '.'; +import { formatLensText, Lens } from '.'; import { shareTextForLens } from './meta'; import LensOGTile from './LensOGTile'; @@ -16,6 +16,7 @@ export default function LensShareModal({ return ( diff --git a/src/photo/PhotoShareModal.tsx b/src/photo/PhotoShareModal.tsx index a72f4504..02576b7f 100644 --- a/src/photo/PhotoShareModal.tsx +++ b/src/photo/PhotoShareModal.tsx @@ -1,6 +1,6 @@ import PhotoOGTile from '@/photo/PhotoOGTile'; import { absolutePathForPhoto } from '@/app/paths'; -import { Photo } from '.'; +import { Photo, titleForPhoto } from '.'; import { PhotoSetCategory } from '../category'; import ShareModal from '@/share/ShareModal'; @@ -10,6 +10,7 @@ export default function PhotoShareModal( return ( diff --git a/src/recipe/PhotoRecipeOverlayButton.tsx b/src/recipe/PhotoRecipeOverlayButton.tsx index 90207092..932c39d7 100644 --- a/src/recipe/PhotoRecipeOverlayButton.tsx +++ b/src/recipe/PhotoRecipeOverlayButton.tsx @@ -30,7 +30,7 @@ export default function PhotoRecipeOverlayButton({ 'rounded-md shadow-none', 'border-[1.5px] border-medium', 'p-0 inline-flex items-center justify-center', - 'size-[17px] md:size-5', + 'size-[17px] sm:size-5', 'hover:bg-extra-dim active:bg-dim', className, )}> diff --git a/src/recipe/RecipeShareModal.tsx b/src/recipe/RecipeShareModal.tsx index 28e04189..f5396473 100644 --- a/src/recipe/RecipeShareModal.tsx +++ b/src/recipe/RecipeShareModal.tsx @@ -1,7 +1,7 @@ import { absolutePathForRecipe } from '@/app/paths'; import { PhotoSetAttributes } from '../category'; import ShareModal from '@/share/ShareModal'; -import { shareTextForRecipe } from '.'; +import { formatRecipe, shareTextForRecipe } from '.'; import RecipeOGTile from './RecipeOGTile'; export default function RecipeShareModal({ @@ -15,6 +15,7 @@ export default function RecipeShareModal({ return ( diff --git a/src/share/ShareModal.tsx b/src/share/ShareModal.tsx index 124758bc..cd6021db 100644 --- a/src/share/ShareModal.tsx +++ b/src/share/ShareModal.tsx @@ -12,16 +12,19 @@ import { SHOW_SOCIAL } from '@/app/config'; import { generateXPostText } from '@/utility/social'; import { useAppState } from '@/state/AppState'; import useOnPathChange from '@/utility/useOnPathChange'; +import { IoArrowUp } from 'react-icons/io5'; export default function ShareModal({ title, pathShare, socialText, + navigatorTitle, children, }: { title?: string pathShare: string socialText: string + navigatorTitle: string children: ReactNode }) { const { @@ -41,7 +44,7 @@ export default function ShareModal({ ) =>
-
+
{shortenUrl(pathShare)}
{renderIcon( @@ -88,6 +91,15 @@ export default function ShareModal({ true, )}
+ {typeof navigator !== 'undefined' && navigator.share && + renderIcon( + , + () => navigator.share({ + title: navigatorTitle, + url: pathShare, + }) + .catch(() => console.log('Share canceled')), + )} {SHOW_SOCIAL && renderIcon( , diff --git a/src/tag/TagShareModal.tsx b/src/tag/TagShareModal.tsx index 66c6ed77..38bfaeb0 100644 --- a/src/tag/TagShareModal.tsx +++ b/src/tag/TagShareModal.tsx @@ -2,7 +2,7 @@ import { absolutePathForTag } from '@/app/paths'; import { PhotoSetAttributes } from '../category'; import ShareModal from '@/share/ShareModal'; import TagOGTile from './TagOGTile'; -import { shareTextForTag } from '.'; +import { formatTag, shareTextForTag } from '.'; export default function TagShareModal({ tag, @@ -15,6 +15,7 @@ export default function TagShareModal({ return (