From 1ff965969d95264b9ad8488ec08cf4b8e13b569b Mon Sep 17 00:00:00 2001 From: codytseng Date: Mon, 22 Sep 2025 22:45:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostEditor/PostRelaySelector.tsx | 128 ++++++++++++++---- 1 file changed, 103 insertions(+), 25 deletions(-) diff --git a/src/components/PostEditor/PostRelaySelector.tsx b/src/components/PostEditor/PostRelaySelector.tsx index 38a3bc2a..922eb833 100644 --- a/src/components/PostEditor/PostRelaySelector.tsx +++ b/src/components/PostEditor/PostRelaySelector.tsx @@ -1,4 +1,5 @@ import { Button } from '@/components/ui/button' +import { Drawer, DrawerContent, DrawerOverlay } from '@/components/ui/drawer' import { DropdownMenu, DropdownMenuCheckboxItem, @@ -6,11 +7,14 @@ import { DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' +import { Separator } from '@/components/ui/separator' import { isProtectedEvent } from '@/lib/event' import { simplifyUrl } from '@/lib/url' import { useCurrentRelays } from '@/providers/CurrentRelaysProvider' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' +import { useScreenSize } from '@/providers/ScreenSizeProvider' import client from '@/services/client.service' +import { Check } from 'lucide-react' import { NostrEvent } from 'nostr-tools' import { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -42,6 +46,8 @@ export default function PostRelaySelector({ setAdditionalRelayUrls: Dispatch> }) { const { t } = useTranslation() + const { isSmallScreen } = useScreenSize() + const [isDrawerOpen, setIsDrawerOpen] = useState(false) const { relayUrls } = useCurrentRelays() const { relaySets, favoriteRelays } = useFavoriteRelays() const [postTargetItems, setPostTargetItems] = useState([]) @@ -147,63 +153,135 @@ export default function PostRelaySelector({ [] ) - return ( - -
- {t('Post to')} - - - -
- - { + return ( + <> + item.type === 'writeRelays')} - onSelect={(e) => e.preventDefault()} onCheckedChange={handleWriteRelaysCheckedChange} > {t('Write relays')} - + {relaySets.length > 0 && ( <> - + {relaySets .filter(({ relayUrls }) => relayUrls.length) .map(({ id, name, relayUrls }) => ( - item.type === 'relaySet' && item.id === id )} - onSelect={(e) => e.preventDefault()} onCheckedChange={(checked) => handleRelaySetCheckedChange(checked, id, relayUrls)} >
{name} ({relayUrls.length})
-
+ ))} )} {selectableRelays.length > 0 && ( <> - + {selectableRelays.map((url) => ( - item.type === 'relay' && item.url === url)} - onSelect={(e) => e.preventDefault()} onCheckedChange={(checked) => handleRelayCheckedChange(checked, url)} - className="flex items-center gap-2" > - -
{simplifyUrl(url)}
-
+
+ +
{simplifyUrl(url)}
+
+ ))} )} + + ) + }, [postTargetItems, relaySets, selectableRelays]) + + if (isSmallScreen) { + return ( + <> +
+ {t('Post to')} + +
+ + setIsDrawerOpen(false)} /> + {content} + + + ) + } + + return ( + +
+ {t('Post to')} + + + +
+ + {content}
) } + +function MenuSeparator() { + const { isSmallScreen } = useScreenSize() + if (isSmallScreen) { + return + } + return +} + +function MenuItem({ + children, + checked, + onCheckedChange +}: { + children: React.ReactNode + checked: boolean + onCheckedChange: (checked: boolean) => void +}) { + const { isSmallScreen } = useScreenSize() + + if (isSmallScreen) { + return ( +
onCheckedChange(!checked)} + className="flex items-center gap-2 px-4 py-3 clickable" + > +
+ {checked && } +
+ {children} +
+ ) + } + + return ( + e.preventDefault()} + onCheckedChange={onCheckedChange} + className="flex items-center gap-2" + > + {children} + + ) +}