From 3aafe4d9f186b566287f102a8db1c73833b66646 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com>
Date: Fri, 30 May 2025 15:06:44 -0500
Subject: [PATCH] feat: code split
---
.../{gallery.webp => avatars.webp} | Bin
.../src/components/Avatars/Group.tsx | 78 ++++++++++++++
.../src/components/ToolOpenGraph.astro | 33 ++++++
.../website-ue/src/layouts/ToolLayout.astro | 45 ++++++++
.../src/pages/[...locale]/avatars/_index.tsx | 99 ++++--------------
.../src/pages/[...locale]/avatars/index.astro | 7 +-
6 files changed, 179 insertions(+), 83 deletions(-)
rename packages/website-ue/public/assets/tool-backgrounds/{gallery.webp => avatars.webp} (100%)
create mode 100644 packages/website-ue/src/components/Avatars/Group.tsx
create mode 100644 packages/website-ue/src/components/ToolOpenGraph.astro
create mode 100644 packages/website-ue/src/layouts/ToolLayout.astro
diff --git a/packages/website-ue/public/assets/tool-backgrounds/gallery.webp b/packages/website-ue/public/assets/tool-backgrounds/avatars.webp
similarity index 100%
rename from packages/website-ue/public/assets/tool-backgrounds/gallery.webp
rename to packages/website-ue/public/assets/tool-backgrounds/avatars.webp
diff --git a/packages/website-ue/src/components/Avatars/Group.tsx b/packages/website-ue/src/components/Avatars/Group.tsx
new file mode 100644
index 000000000..d5fca2711
--- /dev/null
+++ b/packages/website-ue/src/components/Avatars/Group.tsx
@@ -0,0 +1,78 @@
+import type { ProfileAvatarComponent } from '@protos/blitz_static_profile_avatar_component';
+import type { SellableComponent } from '@protos/blitz_static_sellable_component';
+import type { StuffUIComponent } from '@protos/blitz_static_stuff_ui_component';
+import { Badge, Box, Flex, Text } from '@radix-ui/themes';
+import { literals } from 'packages/i18n/src';
+import { Var } from '../../core/radix/var';
+import { useLocale } from '../../hooks/useLocale';
+
+interface AvatarGroupProps {
+ name: string;
+ avatars: {
+ stuff: StuffUIComponent;
+ avatar: ProfileAvatarComponent;
+ sellable: SellableComponent;
+ }[];
+}
+
+const dx = '4px';
+const MAX_AVATARS_PREVIEW = 5;
+
+export function AvatarGroup({ avatars, name }: AvatarGroupProps) {
+ const { strings } = useLocale();
+ const avatarsReduced = [...avatars].reverse().slice(0, MAX_AVATARS_PREVIEW);
+
+ return (
+
+
+ {avatarsReduced.map((avatar, index) => (
+
+ {avatars.length > 1 && (
+
+ )}
+
+ ))}
+
+ {avatars.length > 1 && (
+
+
+ {literals(strings.common.units.times, [`${avatars.length}`])}
+
+
+ )}
+
+
+
+ {name}
+
+
+ );
+}
diff --git a/packages/website-ue/src/components/ToolOpenGraph.astro b/packages/website-ue/src/components/ToolOpenGraph.astro
new file mode 100644
index 000000000..8952e6ec5
--- /dev/null
+++ b/packages/website-ue/src/components/ToolOpenGraph.astro
@@ -0,0 +1,33 @@
+---
+import { AstroSeo } from '@astrolib/seo';
+import { type Tool } from '../constants/tools';
+import { getStrings } from '../core/i18n/getStrings';
+
+interface Props {
+ tool: Tool;
+ locale: string;
+}
+
+const { tool, locale } = Astro.props;
+const strings = await getStrings(locale);
+const toolStrings =
+ strings.website.tools[
+ (tool.strings ?? tool.id) as keyof typeof strings.website.tools
+ ];
+---
+
+
diff --git a/packages/website-ue/src/layouts/ToolLayout.astro b/packages/website-ue/src/layouts/ToolLayout.astro
new file mode 100644
index 000000000..ecd29b924
--- /dev/null
+++ b/packages/website-ue/src/layouts/ToolLayout.astro
@@ -0,0 +1,45 @@
+---
+import { Box, Flex, Heading, Text } from '@radix-ui/themes';
+import ToolOpenGraph from '../components/ToolOpenGraph.astro';
+import { type Tool } from '../constants/tools';
+import { getStrings } from '../core/i18n/getStrings';
+import BaseLayout from './BaseLayout.astro';
+
+interface Props {
+ tool: Tool;
+ locale: string;
+}
+
+const { tool, locale } = Astro.props;
+const strings = await getStrings(locale);
+const toolStrings =
+ strings.website.tools[
+ (tool.strings ?? tool.id) as keyof typeof strings.website.tools
+ ];
+---
+
+
+
+
+
+
+ {toolStrings.name}
+ {toolStrings.description}
+
+
+
+
+
diff --git a/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx b/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx
index 65dbd7bf0..d25cb7214 100644
--- a/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx
+++ b/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx
@@ -1,12 +1,12 @@
import { ProfileAvatarComponent } from '@protos/blitz_static_profile_avatar_component';
+import { SellableComponent } from '@protos/blitz_static_sellable_component';
import { StuffUIComponent } from '@protos/blitz_static_stuff_ui_component';
import { BlitzkitAllAvatarsComponent } from '@protos/blitzkit_static_all_avatars_component';
-import { Badge, Box, Flex, Grid, Text } from '@radix-ui/themes';
+import { Grid } from '@radix-ui/themes';
import { CatalogItemAccessor } from 'packages/core/src/blitz/catalogItemAccessor';
-import { literals } from 'packages/i18n/src';
+import { AvatarGroup } from 'packages/website-ue/src/components/Avatars/Group';
import { PageWrapper } from 'packages/website-ue/src/components/PageWrapper';
import { metadata } from 'packages/website-ue/src/core/blitz/metadata';
-import { Var } from 'packages/website-ue/src/core/radix/var';
import {
LocaleProvider,
useLocale,
@@ -30,27 +30,25 @@ export function Page({ localeData }: LocaleAcceptorProps) {
);
}
-const dx = '4px';
-const MAX_AVATARS_PREVIEW = 5;
-
function Content() {
const { gameStrings, strings } = useLocale();
const groups = useMemo(() => {
const avatars = allAvatars
- .map((avatar) => {
- const item = new CatalogItemAccessor(avatar);
- const stuffComponent = item.get(StuffUIComponent, 'UIComponent');
- const avatarComponent = item.get(
+ .map((id) => {
+ const item = new CatalogItemAccessor(id);
+ const stuff = item.get(StuffUIComponent, 'UIComponent');
+ const avatar = item.get(
ProfileAvatarComponent,
'profileAvatarComponent',
);
+ const sellable = item.get(SellableComponent, 'sellableComponent');
const name =
- gameStrings[stuffComponent.display_name] ??
- strings.website.tools.avatars.unnamed_avatar;
+ gameStrings[stuff.display_name] ??
+ strings.website.tools.avatars.unnamed_avatar; // maybe move to dumb component?
- return { avatar, name, stuffComponent, avatarComponent };
+ return { avatar, name, stuff, sellable };
})
- .sort((a, b) => a.stuffComponent.grade - b.stuffComponent.grade)
+ .sort((a, b) => a.stuff.grade - b.stuff.grade)
.sort((a, b) => a.name.localeCompare(b.name));
const groups: Record = {};
@@ -68,77 +66,18 @@ function Content() {
return (
- {groups.map(([name, avatars]) => {
- const avatarsReduced = [...avatars]
- .reverse()
- .slice(0, MAX_AVATARS_PREVIEW);
-
- return (
-
-
- {avatarsReduced.map((avatar, index) => (
-
- {avatars.length > 1 && (
-
- )}
-
- ))}
-
- {avatars.length > 1 && (
-
-
- {literals(strings.common.units.times, [
- `${avatars.length}`,
- ])}
-
-
- )}
-
-
-
- {name}
-
-
- );
- })}
+ {groups.map(([name, avatars]) => (
+
+ ))}
);
diff --git a/packages/website-ue/src/pages/[...locale]/avatars/index.astro b/packages/website-ue/src/pages/[...locale]/avatars/index.astro
index 08f034df3..6a196da7d 100644
--- a/packages/website-ue/src/pages/[...locale]/avatars/index.astro
+++ b/packages/website-ue/src/pages/[...locale]/avatars/index.astro
@@ -1,6 +1,7 @@
---
+import { avatarsTool } from 'packages/website-ue/src/constants/tools';
import { metadata } from 'packages/website-ue/src/core/blitz/metadata';
-import BaseLayout from 'packages/website-ue/src/layouts/BaseLayout.astro';
+import ToolLayout from 'packages/website-ue/src/layouts/ToolLayout.astro';
import { Page } from './_index';
export { getStaticPaths } from '../index.astro';
@@ -12,6 +13,6 @@ const gameStrings = await metadata.stringsPartial(locale, [
]);
---
-
+
-
+