feat(frontend): add flags to user page
This commit is contained in:
		
							parent
							
								
									f539902711
								
							
						
					
					
						commit
						dc18ab60d2
					
				
					 10 changed files with 68 additions and 5 deletions
				
			
		|  | @ -21,3 +21,9 @@ | |||
| @import "@fontsource/firago/400.css"; | ||||
| @import "@fontsource/firago/400-italic.css"; | ||||
| @import "@fontsource/firago/700.css"; | ||||
| 
 | ||||
| .pride-flag { | ||||
| 	height: 1.5rem; | ||||
| 	max-width: 200px; | ||||
| 	border-radius: 3px; | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| import { CustomPreference, FieldEntry, Pronoun } from "~/lib/api/user"; | ||||
| import StatusLine from "~/components/StatusLine"; | ||||
| import StatusLine from "~/components/profile/StatusLine"; | ||||
| 
 | ||||
| export default function ProfileField({ | ||||
| 	name, | ||||
							
								
								
									
										28
									
								
								Foxnouns.Frontend/app/components/profile/ProfileFlag.tsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Foxnouns.Frontend/app/components/profile/ProfileFlag.tsx
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| import type { PrideFlag } from "~/lib/api/user"; | ||||
| import { OverlayTrigger, Tooltip } from "react-bootstrap"; | ||||
| 
 | ||||
| export default function ProfileFlag({ flag }: { flag: PrideFlag }) { | ||||
| 	return ( | ||||
| 		<span className="mx-2 my-1"> | ||||
| 			<OverlayTrigger | ||||
| 				key={flag.id} | ||||
| 				placement="top" | ||||
| 				overlay={ | ||||
| 					<Tooltip id={flag.id} aria-hidden={true}> | ||||
| 						{flag.description ?? flag.name} | ||||
| 					</Tooltip> | ||||
| 				} | ||||
| 			> | ||||
| 				<span> | ||||
| 					<img | ||||
| 						className="pride-flag" | ||||
| 						src={flag.image_url} | ||||
| 						alt={flag.description ?? flag.name} | ||||
| 						style={{ pointerEvents: "none" }} | ||||
| 					/> | ||||
| 				</span> | ||||
| 			</OverlayTrigger>{" "} | ||||
| 			{flag.name} | ||||
| 		</span> | ||||
| 	); | ||||
| } | ||||
|  | @ -7,8 +7,8 @@ import { | |||
| 	Pronoun, | ||||
| } from "~/lib/api/user"; | ||||
| import classNames from "classnames"; | ||||
| import StatusIcon from "~/components/StatusIcon"; | ||||
| import PronounLink from "~/components/PronounLink"; | ||||
| import StatusIcon from "~/components/profile/StatusIcon"; | ||||
| import PronounLink from "~/components/profile/PronounLink"; | ||||
| 
 | ||||
| export default function StatusLine({ | ||||
| 	entry, | ||||
							
								
								
									
										5
									
								
								Foxnouns.Frontend/app/lib/api/member.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Foxnouns.Frontend/app/lib/api/member.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| import { PartialMember, PrideFlag } from "~/lib/api/user"; | ||||
| 
 | ||||
| export type Member = PartialMember & { | ||||
| 	flags: PrideFlag[]; | ||||
| }; | ||||
|  | @ -13,6 +13,7 @@ export type User = PartialUser & { | |||
| 	names: FieldEntry[]; | ||||
| 	pronouns: Pronoun[]; | ||||
| 	fields: Field[]; | ||||
| 	flags: PrideFlag[]; | ||||
| }; | ||||
| 
 | ||||
| export type UserWithMembers = User & { members: PartialMember[] }; | ||||
|  | @ -50,6 +51,13 @@ export type Field = { | |||
| 	entries: FieldEntry[]; | ||||
| }; | ||||
| 
 | ||||
| export type PrideFlag = { | ||||
| 	id: string; | ||||
| 	image_url: string; | ||||
| 	name: string; | ||||
| 	description: string | null; | ||||
| }; | ||||
| 
 | ||||
| export type CustomPreference = { | ||||
| 	icon: string; | ||||
| 	tooltip: string; | ||||
|  |  | |||
|  | @ -6,12 +6,13 @@ import { loader as rootLoader } from "~/root"; | |||
| import { Alert, Button, Pagination } from "react-bootstrap"; | ||||
| import { Trans, useTranslation } from "react-i18next"; | ||||
| import { renderMarkdown } from "~/lib/markdown"; | ||||
| import ProfileLink from "~/components/ProfileLink"; | ||||
| import ProfileField from "~/components/ProfileField"; | ||||
| import ProfileLink from "~/components/profile/ProfileLink"; | ||||
| import ProfileField from "~/components/profile/ProfileField"; | ||||
| import { PersonPlusFill } from "react-bootstrap-icons"; | ||||
| import { defaultAvatarUrl } from "~/lib/utils"; | ||||
| import MemberCard from "~/routes/$username/MemberCard"; | ||||
| import { ReactNode } from "react"; | ||||
| import ProfileFlag from "~/components/profile/ProfileFlag"; | ||||
| 
 | ||||
| export const meta: MetaFunction<typeof loader> = ({ data }) => { | ||||
| 	const { user } = data!; | ||||
|  | @ -92,6 +93,13 @@ export default function UserPage() { | |||
| 							height={200} | ||||
| 							className="rounded-circle img-fluid" | ||||
| 						/> | ||||
| 						{user.flags && user.bio && ( | ||||
| 							<div className="d-flex flex-wrap m-4"> | ||||
| 								{user.flags.map((f, i) => ( | ||||
| 									<ProfileFlag flag={f} key={i} /> | ||||
| 								))} | ||||
| 							</div> | ||||
| 						)} | ||||
| 					</div> | ||||
| 					<div className="col-md"> | ||||
| 						{user.display_name ? ( | ||||
|  | @ -146,6 +154,14 @@ export default function UserPage() { | |||
| 					))} | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			{/* If a user or member has no bio, flags are displayed in a row below the other profile info, rather than just below the avatar */} | ||||
| 			{user.flags && !user.bio && ( | ||||
| 				<div className="d-flex flex-wrap m-4"> | ||||
| 					{user.flags.map((f, i) => ( | ||||
| 						<ProfileFlag flag={f} key={i} /> | ||||
| 					))} | ||||
| 				</div> | ||||
| 			)} | ||||
| 			{(members.length > 0 || isMeUser) && ( | ||||
| 				<> | ||||
| 					<hr /> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue