This is an automated email from the ASF dual-hosted git repository.

shuai pushed a commit to branch feat/1.4.0/personal
in repository https://gitbox.apache.org/repos/asf/incubator-answer.git


The following commit(s) were added to refs/heads/feat/1.4.0/personal by this 
push:
     new 346ea47b fix: badge detail list styles format
346ea47b is described below

commit 346ea47b9139f91d679c1fd42fdc885e87d53a90
Author: shuai <[email protected]>
AuthorDate: Mon Aug 12 17:45:03 2024 +0800

    fix: badge detail list styles format
---
 i18n/en_US.yaml                                    |  2 +-
 ui/src/common/interface.ts                         |  1 +
 ui/src/components/CardBadge/index.tsx              | 23 +++++++++++----
 .../pages/Badges/Detail/components/Badge/index.tsx |  6 ++--
 .../Badges/Detail/components/UserCard/index.tsx    | 31 +++++++++-----------
 .../Users/Personal/components/Badges/index.tsx     | 11 ++++++--
 .../Users/Personal/components/Overview/index.tsx   | 33 +++++++++++++++-------
 ui/src/pages/Users/Personal/index.tsx              |  7 ++++-
 ui/src/services/client/badges.ts                   | 16 +++++++++++
 9 files changed, 89 insertions(+), 41 deletions(-)

diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml
index f71ac337..98ffd2ea 100644
--- a/i18n/en_US.yaml
+++ b/i18n/en_US.yaml
@@ -1479,7 +1479,7 @@ ui:
     earned_x: Earned x{{ number }}
     x_awarded: "{{ number }} awarded"
     can_earn_multiple: You can earn this multiple times.
-
+    earned: Earned
 
   admin:
     admin_header:
diff --git a/ui/src/common/interface.ts b/ui/src/common/interface.ts
index 45f957c2..608a2465 100644
--- a/ui/src/common/interface.ts
+++ b/ui/src/common/interface.ts
@@ -744,6 +744,7 @@ export interface BadgeListItem {
   earned: boolean;
   /** 1: bronze 2: silver 3:gold */
   level: number;
+  earned_count?: number;
 }
 
 export interface BadgeListGroupItem {
diff --git a/ui/src/components/CardBadge/index.tsx 
b/ui/src/components/CardBadge/index.tsx
index 6fb4af7c..bb42630c 100644
--- a/ui/src/components/CardBadge/index.tsx
+++ b/ui/src/components/CardBadge/index.tsx
@@ -32,23 +32,34 @@ import './index.scss';
 interface IProps {
   data: Type.BadgeListItem;
   showAwardedCount?: boolean;
+  urlSearchParams?: string;
+  badgePillType?: 'earned' | 'count';
 }
 
-const Index: FC<IProps> = ({ data, showAwardedCount = false }) => {
+const Index: FC<IProps> = ({
+  data,
+  badgePillType = 'earned',
+  showAwardedCount = false,
+  urlSearchParams,
+}) => {
   const { t } = useTranslation('translation', { keyPrefix: 'badges' });
   console.log(data);
   return (
-    <Link className="card text-center badge-card" to={`/badges/${data.id}`}>
+    <Link
+      className="card text-center badge-card"
+      to={`/badges/${data.id}${urlSearchParams ? `?${urlSearchParams}` : ''}`}>
       <Card.Body>
-        {data.earned && (
+        {data.earned && badgePillType === 'earned' && (
           <Badge bg="success" className="label">
             {t('earned')}
           </Badge>
         )}
 
-        {/* <Badge pill={badgePill} bg="success" className="label">
-          {showEarned ? t('earned') : data.award_count}
-        </Badge> */}
+        {badgePillType === 'count' && Number(data?.earned_count) > 0 && (
+          <Badge pill bg="success" className="label">
+            x{data.earned_count}
+          </Badge>
+        )}
         {data.icon.startsWith('http') ? (
           <img src={data.icon} width={96} height={96} alt={data.name} />
         ) : (
diff --git a/ui/src/pages/Badges/Detail/components/Badge/index.tsx 
b/ui/src/pages/Badges/Detail/components/Badge/index.tsx
index 1fc5d43d..affb73e6 100644
--- a/ui/src/pages/Badges/Detail/components/Badge/index.tsx
+++ b/ui/src/pages/Badges/Detail/components/Badge/index.tsx
@@ -69,16 +69,16 @@ const Index: FC<IProps> = ({ data }) => {
             <div className="mt-2">{t('can_earn_multiple')}</div>
           )}
 
-          {data.award_count > 0 && data.earned_count > 0 && (
+          {(data.award_count > 0 || data.earned_count > 0) && (
             <div className="small mt-2">
               {data.award_count > 0 && (
-                <span className="text-secondary">
+                <span className="text-secondary me-2">
                   {t('x_awarded', { number: formatCount(data.award_count) })}
                 </span>
               )}
 
               {data.earned_count > 0 && (
-                <Badge bg="success" className="ms-2">
+                <Badge bg="success">
                   {t('earned_x', { number: data.earned_count })}
                 </Badge>
               )}
diff --git a/ui/src/pages/Badges/Detail/components/UserCard/index.tsx 
b/ui/src/pages/Badges/Detail/components/UserCard/index.tsx
index d874ceb9..116a81b3 100644
--- a/ui/src/pages/Badges/Detail/components/UserCard/index.tsx
+++ b/ui/src/pages/Badges/Detail/components/UserCard/index.tsx
@@ -21,20 +21,17 @@ import { memo, FC } from 'react';
 import { Link } from 'react-router-dom';
 import { useTranslation } from 'react-i18next';
 
-import classnames from 'classnames';
-
 import { Avatar } from '@/components';
 import { formatCount } from '@/utils';
 
 interface Props {
   data: any;
-  className?: string;
 }
 
-const Index: FC<Props> = ({ data, className = '' }) => {
+const Index: FC<Props> = ({ data }) => {
   const { t } = useTranslation('translation', { keyPrefix: 'badges' });
   return (
-    <div className={classnames('d-flex', className)}>
+    <div className="d-flex">
       {data?.status !== 'deleted' ? (
         <Link to={`/users/${data?.username}`}>
           <Avatar
@@ -72,19 +69,17 @@ const Index: FC<Props> = ({ data, className = '' }) => {
           />
         </>
       )}
-      <div className="small text-secondary d-flex flex-row flex-md-column 
align-items-center align-items-md-start">
-        <div className="me-1 me-md-0 d-flex align-items-center">
-          {data?.status !== 'deleted' ? (
-            <Link
-              to={`/users/${data?.username}`}
-              className="me-1 text-break name-ellipsis"
-              style={{ maxWidth: '100px' }}>
-              {data?.display_name}
-            </Link>
-          ) : (
-            <span className="me-1 text-break">{data?.display_name}</span>
-          )}
-        </div>
+      <div className="small text-secondary d-flex flex-column">
+        {data?.status !== 'deleted' ? (
+          <Link
+            to={`/users/${data?.username}`}
+            className="me-1 text-break name-ellipsis"
+            style={{ maxWidth: '100px' }}>
+            {data?.display_name}
+          </Link>
+        ) : (
+          <span className="me-1 text-break">{data?.display_name}</span>
+        )}
         <div className="text-secondary">
           {formatCount(data?.rank)}{' '}
           {t('x_reputation', { keyPrefix: 'personal' })}
diff --git a/ui/src/pages/Users/Personal/components/Badges/index.tsx 
b/ui/src/pages/Users/Personal/components/Badges/index.tsx
index 0ef00f39..cd6830c9 100644
--- a/ui/src/pages/Users/Personal/components/Badges/index.tsx
+++ b/ui/src/pages/Users/Personal/components/Badges/index.tsx
@@ -24,10 +24,11 @@ import { CardBadge } from '@/components';
 
 interface IProps {
   data: Type.BadgeListItem[];
+  username: string;
   visible: boolean;
 }
 
-const Index: FC<IProps> = ({ data, visible }) => {
+const Index: FC<IProps> = ({ data, visible, username }) => {
   console.log(data);
   if (!visible) {
     return null;
@@ -35,7 +36,13 @@ const Index: FC<IProps> = ({ data, visible }) => {
   return (
     <div className="d-flex flex-wrap" style={{ margin: '-12px' }}>
       {data.map((item) => {
-        return <CardBadge data={item} />;
+        return (
+          <CardBadge
+            data={item}
+            urlSearchParams={`username=${username}`}
+            badgePillType="count"
+          />
+        );
       })}
     </div>
   );
diff --git a/ui/src/pages/Users/Personal/components/Overview/index.tsx 
b/ui/src/pages/Users/Personal/components/Overview/index.tsx
index b4dd548b..6b247b0c 100644
--- a/ui/src/pages/Users/Personal/components/Overview/index.tsx
+++ b/ui/src/pages/Users/Personal/components/Overview/index.tsx
@@ -22,16 +22,21 @@ import { useTranslation } from 'react-i18next';
 import { Row, Col } from 'react-bootstrap';
 
 // import * as Type from '@/common/interface';
-// import { CardBadge } from '@/components';
+import { CardBadge } from '@/components';
+import { useGetRecentAwardBadges } from '@/services';
 import TopList from '../TopList';
 
 interface Props {
+  username: string;
   visible: boolean;
   introduction: string;
   data;
 }
-const Index: FC<Props> = ({ visible, introduction, data }) => {
+const Index: FC<Props> = ({ visible, introduction, data, username }) => {
   const { t } = useTranslation('translation', { keyPrefix: 'personal' });
+  const { data: recentBadges } = useGetRecentAwardBadges(
+    visible ? username : null,
+  );
   if (!visible) {
     return null;
   }
@@ -66,14 +71,22 @@ const Index: FC<Props> = ({ visible, introduction, data }) 
=> {
         </Col>
       </Row>
 
-      <div className="mb-5">
-        <h5 className="mb-3">{t('recent_badges')}</h5>
-        {/* <div className="d-flex flex-wrap" style={{ margin: '-12px' }}>
-          {[0, 1, 2, 3, 4, 5, 6].map((item) => {
-            return <CardBadge data={item} badgePill />;
-          })}
-        </div> */}
-      </div>
+      {Number(recentBadges?.count) > 0 && (
+        <div className="mb-5">
+          <h5 className="mb-3">{t('recent_badges')}</h5>
+          <div className="d-flex flex-wrap" style={{ margin: '-12px' }}>
+            {recentBadges?.list?.map((item) => {
+              return (
+                <CardBadge
+                  data={item}
+                  urlSearchParams={`username=${username}`}
+                  badgePillType="count"
+                />
+              );
+            })}
+          </div>
+        </div>
+      )}
     </div>
   );
 };
diff --git a/ui/src/pages/Users/Personal/index.tsx 
b/ui/src/pages/Users/Personal/index.tsx
index 96704b85..e9516ace 100644
--- a/ui/src/pages/Users/Personal/index.tsx
+++ b/ui/src/pages/Users/Personal/index.tsx
@@ -102,6 +102,7 @@ const Personal: FC = () => {
             visible={tabName === 'overview'}
             introduction={userInfo?.bio_html || ''}
             data={topData}
+            username={username}
           />
 
           <ListHead
@@ -119,7 +120,11 @@ const Personal: FC = () => {
           <Reputation data={list} visible={tabName === 'reputation'} />
           <Comments data={list} visible={tabName === 'comments'} />
           <Votes data={list} visible={tabName === 'votes'} />
-          <Badges data={list} visible={tabName === 'badges'} />
+          <Badges
+            data={list}
+            visible={tabName === 'badges'}
+            username={username}
+          />
           {!list?.length && !isLoading && <Empty />}
 
           {count > 0 && (
diff --git a/ui/src/services/client/badges.ts b/ui/src/services/client/badges.ts
index 476f85d1..7f3f8abd 100644
--- a/ui/src/services/client/badges.ts
+++ b/ui/src/services/client/badges.ts
@@ -64,3 +64,19 @@ export const useBadgeDetailList = (params: 
Type.BadgeDetailListReq) => {
     mutate,
   };
 };
+
+export const useGetRecentAwardBadges = (username) => {
+  const apiUrl = username
+    ? `/answer/api/v1/badge/user/awards/recent?username=${username}`
+    : null;
+  const { data, error, mutate } = useSWR<
+    { count: number; list: Array<Type.BadgeListItem> },
+    Error
+  >(apiUrl, request.instance.get);
+  return {
+    data,
+    isLoading: !data && !error,
+    error,
+    mutate,
+  };
+};

Reply via email to