Skip to content

Commit

Permalink
Make verification less prominent
Browse files Browse the repository at this point in the history
Add the hover to the listing instead of showing the link, follows the
proposal we worked on at the mobile hackfest

Closes #1270
  • Loading branch information
razzeee committed Jul 2, 2023
1 parent e5a7dcd commit c4940b9
Show file tree
Hide file tree
Showing 5 changed files with 197 additions and 127 deletions.
5 changes: 1 addition & 4 deletions frontend/src/components/application/AppHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,7 @@ export function AppHeader({
})}
</div>
)}
<Verification
appId={app.id}
verificationStatus={verificationStatus}
></Verification>
<Verification appId={app.id} verificationStatus={verificationStatus} />
</div>

<div className="flex items-center justify-center gap-4 sm:ml-auto">
Expand Down
21 changes: 7 additions & 14 deletions frontend/src/components/application/ApplicationCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { useTranslation } from "next-i18next"
import { VerificationText } from "src/verification"
import { VerificationStatus } from "src/types/VerificationStatus"
import { VerificationProvider } from "src/verificationProvider"
import VerificationIcon from "./VerificationIcon"

interface Props {
application: AppstreamListItem
Expand Down Expand Up @@ -60,26 +61,18 @@ const ApplicationCard: FunctionComponent<Props> = ({ application, link }) => {
<LogoImage iconUrl={application.icon} appName={application.name} />
</div>
<div className="flex flex-col justify-center overflow-hidden">
<div className="flex">
<div className="flex gap-1">
<h4 className="truncate whitespace-nowrap text-base font-semibold text-flathub-dark-gunmetal dark:text-flathub-gainsborow">
{application.name}
{application.name}{" "}
</h4>
<VerificationIcon
appId={application.id}
verificationStatus={verificationStatus}
/>
</div>
<div className="mt-2 line-clamp-2 text-sm text-flathub-dark-gunmetal dark:text-flathub-gainsborow md:line-clamp-3">
{application.summary}
</div>
{application.metadata?.["flathub::verification::verified"] && (
<div className="mt-1 flex items-center text-xs font-semibold">
<HiCheckBadge
className="h-5 w-5 text-flathub-celestial-blue"
title={t("app-is-verified")}
aria-hidden={true}
/>
<span aria-label={t("app-is-verified")}>
{VerificationText(verificationStatus)}
</span>
</div>
)}
</div>
</Link>
)
Expand Down
115 changes: 6 additions & 109 deletions frontend/src/components/application/Verification.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,9 @@
import { FunctionComponent, useState } from "react"
import { FunctionComponent } from "react"
import React from "react"

import { HiCheckBadge } from "react-icons/hi2"
import { Trans, useTranslation } from "next-i18next"
import { VerificationStatus } from "src/types/VerificationStatus"
import {
useFloating,
useHover,
useInteractions,
offset,
shift,
autoPlacement,
useRole,
useDismiss,
useFocus,
} from "@floating-ui/react-dom-interactions"
import { verificationProviderToHumanReadable } from "src/verificationProvider"
import { clsx } from "clsx"
import { VerificationText } from "src/verification"
import VerificationIcon from "./VerificationIcon"

interface Props {
appId: string
Expand All @@ -28,34 +14,6 @@ const Verification: FunctionComponent<Props> = ({
appId,
verificationStatus,
}) => {
const { t } = useTranslation()

const [isOpen, setIsOpen] = useState(false)
const { x, y, reference, floating, strategy, context, placement } =
useFloating({
open: isOpen,
onOpenChange: setIsOpen,
middleware: [shift(), autoPlacement(), offset(6)],
})
const hover = useHover(context, { move: false })
const focus = useFocus(context)
const dismiss = useDismiss(context)
const role = useRole(context, { role: "tooltip" })

const { getReferenceProps, getFloatingProps } = useInteractions([
hover,
focus,
dismiss,
role,
])

const staticSide = {
top: "bottom",
right: "left",
bottom: "top",
left: "right",
}[placement.split("-")[0]]

const verificationText = VerificationText(verificationStatus)
let verifiedLink = null

Expand Down Expand Up @@ -109,72 +67,11 @@ const Verification: FunctionComponent<Props> = ({
if (verificationStatus?.verified == true) {
return (
<div className="flex items-center justify-center text-xs font-semibold text-flathub-celestial-blue sm:justify-start">
<button ref={reference} {...getReferenceProps}>
<HiCheckBadge
className="h-5 w-5 text-flathub-celestial-blue"
aria-label={t("app-is-verified")}
/>
</button>
<VerificationIcon
appId={appId}
verificationStatus={verificationStatus}
/>
{verifiedLink}

{isOpen && (
<div
ref={floating}
style={{
position: strategy,
top: y ?? 0,
left: x ?? 0,
}}
className={clsx(
"z-20 mx-1 max-w-sm rounded-xl p-4",
"border-1 border border-flathub-gray-x11 dark:border-flathub-sonic-silver",
"bg-flathub-white dark:bg-flathub-granite-gray dark:text-flathub-gainsborow",
)}
{...getFloatingProps()}
>
{
verificationStatus.method == "manual" ? (
<Trans i18nKey={"verified-manually-tooltip"}>
The ownership of the <b>{{ app_id: appId }}</b> application ID
has been manually verified by Flathub staff
</Trans>
) : verificationStatus.method == "website" ? (
<Trans
i18nKey={"verified-website-tooltip"}
values={{
app_id: appId,
website: verificationStatus.website,
}}
>
The ownership of the <b>{{ app_id: appId }}</b> application ID
has been verified by the owner of{" "}
<b>{{ website: verificationStatus.website }}</b>
</Trans>
) : verificationStatus.method == "login_provider" ? (
<Trans i18nKey={"verified-login-provider-tooltip"}>
The ownership of the <b>{{ app_id: appId }}</b> application ID
has been verified by{" "}
<b>
@
{{
login_provider: verificationProviderToHumanReadable(
verificationStatus.login_provider,
),
}}
</b>{" "}
on{" "}
<b>
{{
login_name: verificationStatus.login_name,
}}
</b>
</Trans>
) : (
t("verified")
) // Should never happen
}
</div>
)}
</div>
)
} else {
Expand Down
58 changes: 58 additions & 0 deletions frontend/src/components/application/VerificationIcon.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import React from "react"
import { Meta } from "@storybook/react"
import VerificationIcon from "./VerificationIcon"
import {
VerificationStatusLoginProvider,
VerificationStatusManual,
VerificationStatusWebsite,
} from "../../types/VerificationStatus"
export default {
title: "Components/Application/VerificationIcon",
component: VerificationIcon,
} as Meta<typeof VerificationIcon>

export const manualVerification = () => {
const verificationStatus: VerificationStatusManual = {
verified: true,
timestamp: 1678175850,
detail: "",
method: "manual",
}
return (
<VerificationIcon
appId="org.flathub.Example"
verificationStatus={verificationStatus}
/>
)
}
export const websiteVerification = () => {
const verificationStatus: VerificationStatusWebsite = {
verified: true,
timestamp: 1678175850,
detail: "",
method: "website",
website: "https://example.com",
}
return (
<VerificationIcon
appId="com.example.Example"
verificationStatus={verificationStatus}
/>
)
}
export const loginProviderVerification = () => {
const verificationStatus: VerificationStatusLoginProvider = {
verified: true,
timestamp: 1678175850,
login_name: "user_name",
method: "login_provider",
login_provider: "github",
detail: "",
}
return (
<VerificationIcon
appId="io.github.Example"
verificationStatus={verificationStatus}
/>
)
}
125 changes: 125 additions & 0 deletions frontend/src/components/application/VerificationIcon.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import { FunctionComponent, useState } from "react"
import React from "react"

import { HiCheckBadge } from "react-icons/hi2"
import { Trans, useTranslation } from "next-i18next"
import { VerificationStatus } from "src/types/VerificationStatus"
import {
useFloating,
useHover,
useInteractions,
offset,
shift,
autoPlacement,
useRole,
useDismiss,
useFocus,
} from "@floating-ui/react-dom-interactions"
import { verificationProviderToHumanReadable } from "src/verificationProvider"
import { clsx } from "clsx"

interface Props {
appId: string
verificationStatus: VerificationStatus
}

const VerificationIcon: FunctionComponent<Props> = ({
appId,
verificationStatus,
}) => {
const { t } = useTranslation()

const [isOpen, setIsOpen] = useState(false)
const { x, y, reference, floating, strategy, context, placement } =
useFloating({
open: isOpen,
onOpenChange: setIsOpen,
middleware: [shift(), autoPlacement(), offset(6)],
})
const hover = useHover(context, { move: false })
const focus = useFocus(context)
const dismiss = useDismiss(context)
const role = useRole(context, { role: "tooltip" })

const { getReferenceProps, getFloatingProps } = useInteractions([
hover,
focus,
dismiss,
role,
])

if (verificationStatus?.verified == true) {
return (
<>
<button ref={reference} {...getReferenceProps}>
<HiCheckBadge
className="h-5 w-5 text-flathub-celestial-blue"
aria-label={t("app-is-verified")}
/>
</button>

{isOpen && (
<div
ref={floating}
style={{
position: strategy,
top: y ?? 0,
left: x ?? 0,
}}
className={clsx(
"z-20 mx-1 max-w-sm rounded-xl p-4",
"border-1 border border-flathub-gray-x11 dark:border-flathub-sonic-silver",
"bg-flathub-white dark:bg-flathub-granite-gray dark:text-flathub-gainsborow",
)}
{...getFloatingProps()}
>
{
verificationStatus.method == "manual" ? (
<Trans i18nKey={"verified-manually-tooltip"}>
The ownership of the <b>{{ app_id: appId }}</b> application ID
has been manually verified by Flathub staff
</Trans>
) : verificationStatus.method == "website" ? (
<Trans
i18nKey={"verified-website-tooltip"}
values={{
app_id: appId,
website: verificationStatus.website,
}}
>
The ownership of the <b>{{ app_id: appId }}</b> application ID
has been verified by the owner of{" "}
<b>{{ website: verificationStatus.website }}</b>
</Trans>
) : verificationStatus.method == "login_provider" ? (
<Trans i18nKey={"verified-login-provider-tooltip"}>
The ownership of the <b>{{ app_id: appId }}</b> application ID
has been verified by{" "}
<b>
@
{{
login_provider: verificationProviderToHumanReadable(
verificationStatus.login_provider,
),
}}
</b>{" "}
on{" "}
<b>
{{
login_name: verificationStatus.login_name,
}}
</b>
</Trans>
) : (
t("verified")
) // Should never happen
}
</div>
)}
</>
)
} else {
return null
}
}
export default VerificationIcon

0 comments on commit c4940b9

Please sign in to comment.