diff --git a/src/components/DiffOptionsButton.svelte b/src/components/DiffOptionsButton.svelte index f8a9c85a6..e5a00a4a9 100644 --- a/src/components/DiffOptionsButton.svelte +++ b/src/components/DiffOptionsButton.svelte @@ -99,8 +99,8 @@ active={expanded} {onclick} title="Diff settings" - styleHeight="1.75rem" - styleWidth="1.75rem" + styleHeight="2rem" + styleWidth="2rem" stylePadding="0" styleJustifyContent="center"> diff --git a/src/components/RepoHeader.svelte b/src/components/RepoHeader.svelte index f8b8f0300..da2c62fec 100644 --- a/src/components/RepoHeader.svelte +++ b/src/components/RepoHeader.svelte @@ -2,15 +2,12 @@ import type { Config } from "@bindings/config/Config"; import type { RepoInfo } from "@bindings/repo/RepoInfo"; - import debounce from "lodash/debounce"; - - import { writeToClipboard } from "@app/lib/invoke"; import { explorerUrl, truncateDid } from "@app/lib/utils"; - import Button from "@app/components/Button.svelte"; import CheckoutRepoButton from "@app/components/CheckoutRepoButton.svelte"; import HoverPopover from "@app/components/HoverPopover.svelte"; import Icon from "@app/components/Icon.svelte"; + import ShareButton from "@app/components/ShareButton.svelte"; import UserAvatar from "@app/components/UserAvatar.svelte"; import VisibilityBadge from "@app/components/VisibilityBadge.svelte"; @@ -22,17 +19,6 @@ const { repo, config }: Props = $props(); const project = $derived(repo.payloads["xyz.radicle.project"]!); - - let copyIcon: "link" | "checkmark" = $state("link"); - const restoreCopyIcon = debounce(() => { - copyIcon = "link"; - }, 1000); - - async function copyLink() { - await writeToClipboard(explorerUrl(repo.rid, config)); - copyIcon = "checkmark"; - restoreCopyIcon(); - } + + + + +
+ + + + {#snippet toggle(onclick)} + + {/snippet} + {#snippet popover()} +
+ + {#snippet item(action)} + { + shareAction.value = action.kind; + closeFocused(); + void run(action.kind); + }}> + + {action.title} + + {/snippet} + +
+ {/snippet} +
+
diff --git a/src/lib/shareAction.svelte.ts b/src/lib/shareAction.svelte.ts new file mode 100644 index 000000000..a60d86228 --- /dev/null +++ b/src/lib/shareAction.svelte.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; + +export const shareActionSchema = z.enum(["open", "copyLink", "copyId"]); + +export type ShareAction = z.infer; + +const KEY = "shareAction"; + +export const defaultShareAction: ShareAction = "copyLink"; + +function load(): ShareAction { + const raw = globalThis.localStorage?.getItem(KEY); + if (!raw) { + return defaultShareAction; + } + const parsed = shareActionSchema.safeParse(raw); + return parsed.success ? parsed.data : defaultShareAction; +} + +export const shareAction = $state<{ value: ShareAction }>({ value: load() }); + +// A detached root effect persists changes for the whole session; the module +// singleton is never torn down. +$effect.root(() => { + $effect(() => { + globalThis.localStorage?.setItem(KEY, shareAction.value); + }); +}); diff --git a/src/views/repo/Issue.svelte b/src/views/repo/Issue.svelte index cba0e9cde..70e88ed97 100644 --- a/src/views/repo/Issue.svelte +++ b/src/views/repo/Issue.svelte @@ -16,8 +16,6 @@ import * as roles from "@app/lib/roles"; import * as router from "@app/lib/router"; import { - explorerHost, - explorerUrl, issueStatusBackgroundColor, issueStatusColor, issueStatusLabel, @@ -30,13 +28,13 @@ import CommentComponent from "@app/components/Comment.svelte"; import Discussion from "@app/components/Discussion.svelte"; import EditableTitle from "@app/components/EditableTitle.svelte"; - import ExternalLink from "@app/components/ExternalLink.svelte"; import Icon from "@app/components/Icon.svelte"; import Id from "@app/components/Id.svelte"; import IssueStateButton from "@app/components/IssueStateButton.svelte"; import IssueTimeline from "@app/components/IssueTimeline.svelte"; import LabelInput from "@app/components/LabelInput.svelte"; import ScrollArea from "@app/components/ScrollArea.svelte"; + import ShareButton from "@app/components/ShareButton.svelte"; import Topbar from "@app/components/Topbar.svelte"; import CreateIssueModal from "@app/modals/CreateIssue.svelte"; @@ -324,11 +322,13 @@ - -
+
+
-
+
+
diff --git a/src/views/repo/RepoCommit.svelte b/src/views/repo/RepoCommit.svelte index ac2a24ec5..32351b6b9 100644 --- a/src/views/repo/RepoCommit.svelte +++ b/src/views/repo/RepoCommit.svelte @@ -16,8 +16,6 @@ import type { SidebarData } from "@app/lib/router/definitions"; import { absoluteTimestamp, - explorerHost, - explorerUrl, formatOid, formatTimestamp, gravatarURL, @@ -28,12 +26,12 @@ import DiffActions from "@app/components/DiffActions.svelte"; import DiffOptionsButton from "@app/components/DiffOptionsButton.svelte"; import DiffStatBadge from "@app/components/DiffStatBadge.svelte"; - import ExternalLink from "@app/components/ExternalLink.svelte"; import Icon from "@app/components/Icon.svelte"; import Id from "@app/components/Id.svelte"; import JobCob from "@app/components/JobCob.svelte"; import PierreDiff from "@app/components/PierreDiff.svelte"; import PierreTree from "@app/components/PierreTree.svelte"; + import ShareButton from "@app/components/ShareButton.svelte"; import Topbar from "@app/components/Topbar.svelte"; import Layout from "./Layout.svelte"; @@ -375,14 +373,15 @@ -
+ + +