mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 10:47:04 +02:00
feat: migrate urls
This commit is contained in:
1 parent
165a9cd719
commit
b90b355f8f
18 files changed
+37
-44
No files matched your search
Vendored
+1
@@ -132,6 +132,7 @@
|
|||||||
"outdir",
|
"outdir",
|
||||||
"outfile",
|
"outfile",
|
||||||
"ownedtanks",
|
"ownedtanks",
|
||||||
|
"padder",
|
||||||
"partytown",
|
"partytown",
|
||||||
"PIXELFORMAT",
|
"PIXELFORMAT",
|
||||||
"playerachievements",
|
"playerachievements",
|
||||||
|
|||||||
@@ -107,8 +107,8 @@ export const auctionCommand = new Promise<CommandRegistry>((resolve) => {
|
|||||||
|
|
||||||
if (!tank) return '';
|
if (!tank) return '';
|
||||||
|
|
||||||
const name = `[${tank.name}](<https://blitzkit.app/tools/tankopedia/${
|
const name = `[${tank.name}](<https://blitzkit.app/tanks/${
|
||||||
tank.id
|
tank.slug
|
||||||
}>)`;
|
}>)`;
|
||||||
const next =
|
const next =
|
||||||
data.next_price === null
|
data.next_price === null
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export const ownedTanksCommand = new Promise<CommandRegistry>((resolve) => {
|
|||||||
)
|
)
|
||||||
.map(
|
.map(
|
||||||
(tank) =>
|
(tank) =>
|
||||||
`[${flags[tank.nation]} ${markdownEscape(unwrap(tank.name))}](<https://blitzkit.app/tools/tankopedia/${tank.id}>)`,
|
`[${flags[tank.nation]} ${markdownEscape(unwrap(tank.name))}](<https://blitzkit.app/tanks/${tank.slug}>)`,
|
||||||
);
|
);
|
||||||
const lines = [title, ...tankList];
|
const lines = [title, ...tankList];
|
||||||
|
|
||||||
|
|||||||
@@ -10,16 +10,16 @@ message TankDefinitions {
|
|||||||
|
|
||||||
message TankDefinition {
|
message TankDefinition {
|
||||||
required uint32 id = 1;
|
required uint32 id = 1;
|
||||||
map<uint32, uint32> roles = 2;
|
required string slug = 2;
|
||||||
required bool fixed_camouflage = 4;
|
map<uint32, uint32> roles = 3;
|
||||||
repeated int32 camouflages = 5;
|
required bool fixed_camouflage = 5;
|
||||||
repeated int32 ancestors = 6;
|
repeated int32 camouflages = 6;
|
||||||
repeated int32 successors = 7;
|
repeated int32 ancestors = 7;
|
||||||
repeated Crew crew = 8;
|
repeated int32 successors = 8;
|
||||||
required uint32 health = 9;
|
repeated Crew crew = 9;
|
||||||
required string nation = 10;
|
required uint32 health = 10;
|
||||||
required I18nString name = 11;
|
required string nation = 11;
|
||||||
optional I18nString name_full = 12;
|
required I18nString name = 12;
|
||||||
required TankType type = 13;
|
required TankType type = 13;
|
||||||
required uint32 max_consumables = 14;
|
required uint32 max_consumables = 14;
|
||||||
required uint32 max_provisions = 15;
|
required uint32 max_provisions = 15;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export async function popularTanks() {
|
|||||||
fieldName: 'pagePath',
|
fieldName: 'pagePath',
|
||||||
stringFilter: {
|
stringFilter: {
|
||||||
matchType: 'BEGINS_WITH',
|
matchType: 'BEGINS_WITH',
|
||||||
value: '/tools/tankopedia/',
|
value: '/tanks/',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -43,7 +43,7 @@ export async function popularTanks() {
|
|||||||
(row) =>
|
(row) =>
|
||||||
row.dimensionValues &&
|
row.dimensionValues &&
|
||||||
row.dimensionValues[0].value &&
|
row.dimensionValues[0].value &&
|
||||||
row.dimensionValues[0].value !== '/tools/tankopedia/' &&
|
row.dimensionValues[0].value !== '/tanks/' &&
|
||||||
row.metricValues &&
|
row.metricValues &&
|
||||||
row.metricValues[0].value,
|
row.metricValues[0].value,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ export function TankCard({ index, tank }: TankCardProps) {
|
|||||||
return (
|
return (
|
||||||
<StickyColumnHeaderCell>
|
<StickyColumnHeaderCell>
|
||||||
<Flex direction="column" align="center" justify="between" gap="2">
|
<Flex direction="column" align="center" justify="between" gap="2">
|
||||||
<TankControl index={index} key={tank.id} id={tank.id} />
|
<TankControl index={index} key={tank.id} slug={tank.slug} />
|
||||||
|
|
||||||
<Flex
|
<Flex
|
||||||
ref={draggable}
|
ref={draggable}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { TankSearch } from '../TankSearch';
|
|||||||
|
|
||||||
interface TankControlProps {
|
interface TankControlProps {
|
||||||
index: number;
|
index: number;
|
||||||
id: number;
|
slug: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const [provisionDefinitions, modelDefinitions] = await Promise.all([
|
const [provisionDefinitions, modelDefinitions] = await Promise.all([
|
||||||
@@ -19,7 +19,7 @@ const [provisionDefinitions, modelDefinitions] = await Promise.all([
|
|||||||
awaitableModelDefinitions,
|
awaitableModelDefinitions,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export function TankControl({ index, id }: TankControlProps) {
|
export function TankControl({ index, slug }: TankControlProps) {
|
||||||
const { locale } = useLocale();
|
const { locale } = useLocale();
|
||||||
const [switchTankDialogOpen, setSwitchTankDialogOpen] = useState(false);
|
const [switchTankDialogOpen, setSwitchTankDialogOpen] = useState(false);
|
||||||
const mutateCompareEphemeral = CompareEphemeral.useMutation();
|
const mutateCompareEphemeral = CompareEphemeral.useMutation();
|
||||||
@@ -79,11 +79,7 @@ export function TankControl({ index, id }: TankControlProps) {
|
|||||||
</Dialog.Content>
|
</Dialog.Content>
|
||||||
</Dialog.Root>
|
</Dialog.Root>
|
||||||
|
|
||||||
<LinkI18n
|
<LinkI18n locale={locale} href={`/tanks/${slug}`} target="_blank">
|
||||||
locale={locale}
|
|
||||||
href={`/tools/tankopedia/${id}`}
|
|
||||||
target="_blank"
|
|
||||||
>
|
|
||||||
<IconButton variant="ghost">
|
<IconButton variant="ghost">
|
||||||
<ExternalLinkIcon />
|
<ExternalLinkIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ const strings = getStrings(locale);
|
|||||||
(branch) =>
|
(branch) =>
|
||||||
branch !== assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH),
|
branch !== assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH),
|
||||||
);
|
);
|
||||||
const selected = Astro.url.pathname.includes(`/tools/${tool.id}`);
|
const selected = Astro.url.pathname.includes(`/${tool.id}`);
|
||||||
const toolStrings =
|
const toolStrings =
|
||||||
strings.website.tools[
|
strings.website.tools[
|
||||||
(tool.stringsId ??
|
(tool.stringsId ??
|
||||||
@@ -157,7 +157,7 @@ const strings = getStrings(locale);
|
|||||||
color="gray"
|
color="gray"
|
||||||
highContrast={selected}
|
highContrast={selected}
|
||||||
size="2"
|
size="2"
|
||||||
href={`/tools/${tool.id}`}
|
href={`/${tool.id}`}
|
||||||
underline="hover"
|
underline="hover"
|
||||||
>
|
>
|
||||||
{toolStrings.name}
|
{toolStrings.name}
|
||||||
@@ -227,12 +227,12 @@ const strings = getStrings(locale);
|
|||||||
color="gray"
|
color="gray"
|
||||||
highContrast
|
highContrast
|
||||||
style={{ display: 'contents' }}
|
style={{ display: 'contents' }}
|
||||||
href={`/tools/${tool.id}`}
|
href={`/${tool.id}`}
|
||||||
>
|
>
|
||||||
<Box
|
<Box
|
||||||
style={{
|
style={{
|
||||||
borderRadius: Var('radius-2'),
|
borderRadius: Var('radius-2'),
|
||||||
backgroundImage: `url(/assets/images/tools/${tool.id}.webp)`,
|
backgroundImage: `url(/assets/images/${tool.id}.webp)`,
|
||||||
backgroundSize: '200%',
|
backgroundSize: '200%',
|
||||||
backgroundPosition: 'right center',
|
backgroundPosition: 'right center',
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export const TankCard = forwardRef<HTMLSpanElement, TankCardProps>(
|
|||||||
locale={locale}
|
locale={locale}
|
||||||
className="link"
|
className="link"
|
||||||
underline="hover"
|
underline="hover"
|
||||||
href={provideLink ? `/tools/tankopedia/${tank.id}` : '#'}
|
href={provideLink ? `/tanks/${tank.slug}` : '#'}
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
if (!provideLink) event.preventDefault();
|
if (!provideLink) event.preventDefault();
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -18,11 +18,7 @@ export function TankRowHeaderCell({ tank }: TankRowHeaderCellProps) {
|
|||||||
width={{ initial: '144px', sm: '240px' }}
|
width={{ initial: '144px', sm: '240px' }}
|
||||||
style={{ overflow: 'hidden' }}
|
style={{ overflow: 'hidden' }}
|
||||||
>
|
>
|
||||||
<LinkI18n
|
<LinkI18n locale={locale} href={`/tanks/${tank.slug}`} tabIndex={-1}>
|
||||||
locale={locale}
|
|
||||||
href={`/tools/tankopedia/${tank.id}`}
|
|
||||||
tabIndex={-1}
|
|
||||||
>
|
|
||||||
<img
|
<img
|
||||||
alt={unwrap(tank.name)}
|
alt={unwrap(tank.name)}
|
||||||
draggable={false}
|
draggable={false}
|
||||||
@@ -48,7 +44,7 @@ export function TankRowHeaderCell({ tank }: TankRowHeaderCellProps) {
|
|||||||
highContrast={tank.type === TankType.RESEARCHABLE}
|
highContrast={tank.type === TankType.RESEARCHABLE}
|
||||||
underline="hover"
|
underline="hover"
|
||||||
wrap="nowrap"
|
wrap="nowrap"
|
||||||
href={`/tools/tankopedia/${tank.id}`}
|
href={`/tanks/${tank.slug}`}
|
||||||
style={{
|
style={{
|
||||||
paddingLeft: 'var(--space-2)',
|
paddingLeft: 'var(--space-2)',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export function QuickLink({ topResult }: QuickLinkProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<TextField.Slot>
|
<TextField.Slot>
|
||||||
<LinkI18n locale={locale} href={`/tools/tankopedia/${topResult.id}`}>
|
<LinkI18n locale={locale} href={`/tanks/${topResult.slug}`}>
|
||||||
<Button variant="ghost">
|
<Button variant="ghost">
|
||||||
{unwrap(topResult.name)} <CaretRightIcon />
|
{unwrap(topResult.name)} <CaretRightIcon />
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export function SearchBar({ topResult, skeleton, onSelect }: SearchBarProps) {
|
|||||||
if (onSelect) {
|
if (onSelect) {
|
||||||
onSelect(topResult);
|
onSelect(topResult);
|
||||||
} else {
|
} else {
|
||||||
window.location.href = `/tools/tankopedia/${topResult.id}`;
|
window.location.href = `/tanks/${topResult.slug}`;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[topResult],
|
[topResult],
|
||||||
|
|||||||
+4
-1
@@ -135,7 +135,10 @@ function ModuleButton({
|
|||||||
);
|
);
|
||||||
|
|
||||||
return isTank ? (
|
return isTank ? (
|
||||||
<LinkI18n locale={locale} href={`/tools/tankopedia/${unlock.id}`}>
|
<LinkI18n
|
||||||
|
locale={locale}
|
||||||
|
href={`/tanks/${tankDefinitions.tanks[unlock.id].slug}`}
|
||||||
|
>
|
||||||
{button}
|
{button}
|
||||||
</LinkI18n>
|
</LinkI18n>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export function Node({ id, highlight, nextIds, skeleton }: NodeProps) {
|
|||||||
return (
|
return (
|
||||||
<LinkI18n
|
<LinkI18n
|
||||||
locale={locale}
|
locale={locale}
|
||||||
href={`/tools/tankopedia/${id}`}
|
href={`/tanks/${tankDefinitions.tanks[id].slug}`}
|
||||||
key={id}
|
key={id}
|
||||||
style={{
|
style={{
|
||||||
textDecoration: 'none',
|
textDecoration: 'none',
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export function Share() {
|
|||||||
<CopyButton
|
<CopyButton
|
||||||
variant="outline"
|
variant="outline"
|
||||||
copy={() =>
|
copy={() =>
|
||||||
`${location.origin}/tools/tier-list?${generateTierListParams(rows)}`
|
`${location.origin}/tier-list?${generateTierListParams(rows)}`
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Share2Icon /> {strings.website.tools.tier_list.buttons.share}
|
<Share2Icon /> {strings.website.tools.tier_list.buttons.share}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ const toolStrings =
|
|||||||
{locale}
|
{locale}
|
||||||
className="link"
|
className="link"
|
||||||
underline="none"
|
underline="none"
|
||||||
href={disabled ? '#' : (tool.href ?? `/tools/${tool.id}`)}
|
href={disabled ? '#' : (tool.href ?? `/${tool.id}`)}
|
||||||
target={tool.href ? '_blank' : undefined}
|
target={tool.href ? '_blank' : undefined}
|
||||||
>
|
>
|
||||||
<Box
|
<Box
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
export function pushTankopediaPath(id: number) {
|
|
||||||
window.history.pushState(null, '', `/tools/tankopedia/${id}`);
|
|
||||||
}
|
|
||||||
@@ -50,7 +50,7 @@ function Content() {
|
|||||||
>
|
>
|
||||||
<LinkI18n
|
<LinkI18n
|
||||||
locale={locale}
|
locale={locale}
|
||||||
href={`/tools/embed/${embed}`}
|
href={`/embed/${embed}`}
|
||||||
color="gray"
|
color="gray"
|
||||||
highContrast
|
highContrast
|
||||||
style={{
|
style={{
|
||||||
|
|||||||
Reference in new issue
Block a user