Skip to content

Commit 1d64b2e

Browse files
authored
Refactor search page, migrate to /discover/ (#4862)
1 parent 251e89f commit 1d64b2e

File tree

22 files changed

+1252
-973
lines changed

22 files changed

+1252
-973
lines changed

apps/frontend/nuxt.config.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { consola } from 'consola'
77
import { promises as fs } from 'fs'
88
import { globIterate } from 'glob'
99
import { defineNuxtConfig } from 'nuxt/config'
10-
import { basename, relative, resolve } from 'pathe'
10+
import { basename, relative } from 'pathe'
1111
import svgLoader from 'vite-svg-loader'
1212

1313
const STAGING_API_URL = 'https://staging-api.modrinth.com/v2/'
@@ -176,23 +176,6 @@ export default defineNuxtConfig({
176176

177177
console.log('Tags generated!')
178178
},
179-
'pages:extend'(routes) {
180-
routes.splice(
181-
routes.findIndex((x) => x.name === 'search-searchProjectType'),
182-
1,
183-
)
184-
185-
const types = ['mods', 'modpacks', 'plugins', 'resourcepacks', 'shaders', 'datapacks']
186-
187-
types.forEach((type) =>
188-
routes.push({
189-
name: `search-${type}`,
190-
path: `/${type}`,
191-
file: resolve(__dirname, 'src/pages/search/[searchProjectType].vue'),
192-
children: [],
193-
}),
194-
)
195-
},
196179
async 'vintl:extendOptions'(opts) {
197180
opts.locales ??= []
198181

apps/frontend/src/composables/featureFlags.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const DEFAULT_FEATURE_FLAGS = validateValues({
4040
newProjectGeneralSettings: false,
4141
newProjectEnvironmentSettings: true,
4242
hideRussiaCensorshipBanner: false,
43+
serverDiscovery: false,
4344
// advancedRendering: true,
4445
// externalLinksNewTab: true,
4546
// notUsingBlockers: false,

apps/frontend/src/composables/generated.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import type { ISO3166, Labrinth } from '@modrinth/api-client'
2+
import type { DisplayProjectType } from '@modrinth/utils'
23

34
import generatedState from '~/generated/state.json'
5+
import type { DisplayMode } from '~/plugins/cosmetics'
46

57
export interface ProjectType {
68
actual: string
7-
id: string
9+
id: DisplayProjectType
810
display: string
911
}
1012

@@ -25,7 +27,7 @@ export interface GeneratedState extends Labrinth.State.GeneratedState {
2527
// Additional runtime-defined fields not from the API
2628
projectTypes: ProjectType[]
2729
loaderData: LoaderData
28-
projectViewModes: string[]
30+
projectViewModes: DisplayMode[]
2931
approvedStatuses: string[]
3032
rejectedStatuses: string[]
3133
staffRoles: string[]

apps/frontend/src/layouts/default.vue

Lines changed: 55 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -237,74 +237,76 @@
237237
<template v-if="flags.projectTypesPrimaryNav">
238238
<ButtonStyled
239239
type="transparent"
240-
:highlighted="route.name === 'search-mods' || route.path.startsWith('/mod/')"
240+
:highlighted="route.name === 'discover-mods' || route.path.startsWith('/mod/')"
241241
:highlighted-style="
242-
route.name === 'search-mods' ? 'main-nav-primary' : 'main-nav-secondary'
242+
route.name === 'discover-mods' ? 'main-nav-primary' : 'main-nav-secondary'
243243
"
244244
>
245-
<nuxt-link to="/mods">
245+
<nuxt-link to="/discover/mods">
246246
<BoxIcon aria-hidden="true" />
247247
{{ formatMessage(commonProjectTypeCategoryMessages.mod) }}
248248
</nuxt-link>
249249
</ButtonStyled>
250250
<ButtonStyled
251251
type="transparent"
252252
:highlighted="
253-
route.name === 'search-resourcepacks' || route.path.startsWith('/resourcepack/')
253+
route.name === 'discover-resourcepacks' || route.path.startsWith('/resourcepack/')
254254
"
255255
:highlighted-style="
256-
route.name === 'search-resourcepacks' ? 'main-nav-primary' : 'main-nav-secondary'
256+
route.name === 'discover-resourcepacks' ? 'main-nav-primary' : 'main-nav-secondary'
257257
"
258258
>
259-
<nuxt-link to="/resourcepacks">
259+
<nuxt-link to="/discover/resourcepacks">
260260
<PaintbrushIcon aria-hidden="true" />
261261
{{ formatMessage(commonProjectTypeCategoryMessages.resourcepack) }}
262262
</nuxt-link>
263263
</ButtonStyled>
264264
<ButtonStyled
265265
type="transparent"
266-
:highlighted="route.name === 'search-datapacks' || route.path.startsWith('/datapack/')"
266+
:highlighted="
267+
route.name === 'discover-datapacks' || route.path.startsWith('/datapack/')
268+
"
267269
:highlighted-style="
268-
route.name === 'search-datapacks' ? 'main-nav-primary' : 'main-nav-secondary'
270+
route.name === 'discover-datapacks' ? 'main-nav-primary' : 'main-nav-secondary'
269271
"
270272
>
271-
<nuxt-link to="/datapacks">
273+
<nuxt-link to="/discover/datapacks">
272274
<BracesIcon aria-hidden="true" />
273275
{{ formatMessage(commonProjectTypeCategoryMessages.datapack) }}
274276
</nuxt-link>
275277
</ButtonStyled>
276278
<ButtonStyled
277279
type="transparent"
278-
:highlighted="route.name === 'search-modpacks' || route.path.startsWith('/modpack/')"
280+
:highlighted="route.name === 'discover-modpacks' || route.path.startsWith('/modpack/')"
279281
:highlighted-style="
280-
route.name === 'search-modpacks' ? 'main-nav-primary' : 'main-nav-secondary'
282+
route.name === 'discover-modpacks' ? 'main-nav-primary' : 'main-nav-secondary'
281283
"
282284
>
283-
<nuxt-link to="/modpacks">
285+
<nuxt-link to="/discover/modpacks">
284286
<PackageOpenIcon aria-hidden="true" />
285287
{{ formatMessage(commonProjectTypeCategoryMessages.modpack) }}
286288
</nuxt-link>
287289
</ButtonStyled>
288290
<ButtonStyled
289291
type="transparent"
290-
:highlighted="route.name === 'search-shaders' || route.path.startsWith('/shader/')"
292+
:highlighted="route.name === 'discover-shaders' || route.path.startsWith('/shader/')"
291293
:highlighted-style="
292-
route.name === 'search-shaders' ? 'main-nav-primary' : 'main-nav-secondary'
294+
route.name === 'discover-shaders' ? 'main-nav-primary' : 'main-nav-secondary'
293295
"
294296
>
295-
<nuxt-link to="/shaders">
297+
<nuxt-link to="/discover/shaders">
296298
<GlassesIcon aria-hidden="true" />
297299
{{ formatMessage(commonProjectTypeCategoryMessages.shader) }}
298300
</nuxt-link>
299301
</ButtonStyled>
300302
<ButtonStyled
301303
type="transparent"
302-
:highlighted="route.name === 'search-plugins' || route.path.startsWith('/plugin/')"
304+
:highlighted="route.name === 'discover-plugins' || route.path.startsWith('/plugin/')"
303305
:highlighted-style="
304-
route.name === 'search-plugins' ? 'main-nav-primary' : 'main-nav-secondary'
306+
route.name === 'discover-plugins' ? 'main-nav-primary' : 'main-nav-secondary'
305307
"
306308
>
307-
<nuxt-link to="/plugins">
309+
<nuxt-link to="/discover/plugins">
308310
<PlugIcon aria-hidden="true" />
309311
{{ formatMessage(commonProjectTypeCategoryMessages.plugin) }}
310312
</nuxt-link>
@@ -320,55 +322,66 @@
320322
:options="[
321323
{
322324
id: 'mods',
323-
action: '/mods',
325+
action: '/discover/mods',
324326
},
325327
{
326328
id: 'resourcepacks',
327-
action: '/resourcepacks',
329+
action: '/discover/resourcepacks',
328330
},
329331
{
330332
id: 'datapacks',
331-
action: '/datapacks',
333+
action: '/discover/datapacks',
332334
},
333335
{
334336
id: 'shaders',
335-
action: '/shaders',
337+
action: '/discover/shaders',
336338
},
337339
{
338340
id: 'modpacks',
339-
action: '/modpacks',
341+
action: '/discover/modpacks',
340342
},
341343
{
342344
id: 'plugins',
343-
action: '/plugins',
345+
action: '/discover/plugins',
346+
},
347+
{
348+
id: 'servers',
349+
action: '/discover/servers',
350+
shown: flags.serverDiscovery,
344351
},
345352
]"
346353
hoverable
347354
>
348355
<BoxIcon
349-
v-if="route.name === 'search-mods' || route.path.startsWith('/mod/')"
356+
v-if="route.name === 'discover-mods' || route.path.startsWith('/mod/')"
350357
aria-hidden="true"
351358
/>
352359
<PaintbrushIcon
353360
v-else-if="
354-
route.name === 'search-resourcepacks' || route.path.startsWith('/resourcepack/')
361+
route.name === 'discover-resourcepacks' || route.path.startsWith('/resourcepack/')
355362
"
356363
aria-hidden="true"
357364
/>
358365
<BracesIcon
359-
v-else-if="route.name === 'search-datapacks' || route.path.startsWith('/datapack/')"
366+
v-else-if="
367+
route.name === 'discover-datapacks' || route.path.startsWith('/datapack/')
368+
"
360369
aria-hidden="true"
361370
/>
362371
<PackageOpenIcon
363-
v-else-if="route.name === 'search-modpacks' || route.path.startsWith('/modpack/')"
372+
v-else-if="route.name === 'discover-modpacks' || route.path.startsWith('/modpack/')"
364373
aria-hidden="true"
365374
/>
366375
<GlassesIcon
367-
v-else-if="route.name === 'search-shaders' || route.path.startsWith('/shader/')"
376+
v-else-if="route.name === 'discover-shaders' || route.path.startsWith('/shader/')"
368377
aria-hidden="true"
369378
/>
370379
<PlugIcon
371-
v-else-if="route.name === 'search-plugins' || route.path.startsWith('/plugin/')"
380+
v-else-if="route.name === 'discover-plugins' || route.path.startsWith('/plugin/')"
381+
aria-hidden="true"
382+
/>
383+
<ServerIcon
384+
v-else-if="route.name === 'discover-servers' || route.path.startsWith('/server/')"
372385
aria-hidden="true"
373386
/>
374387
<CompassIcon v-else aria-hidden="true" />
@@ -402,13 +415,17 @@
402415
<PackageOpenIcon aria-hidden="true" />
403416
{{ formatMessage(commonProjectTypeCategoryMessages.modpack) }}
404417
</template>
418+
<template #servers>
419+
<ServerIcon aria-hidden="true" />
420+
{{ formatMessage(commonProjectTypeCategoryMessages.server) }}
421+
</template>
405422
</TeleportOverflowMenu>
406423
</ButtonStyled>
407424
<ButtonStyled
408425
type="transparent"
409426
:highlighted="
410427
route.name?.startsWith('hosting') ||
411-
(route.name?.startsWith('search-') && route.query.sid)
428+
(route.name?.startsWith('discover-') && !!route.query.sid)
412429
"
413430
:highlighted-style="
414431
route.name === 'hosting' ? 'main-nav-primary' : 'main-nav-secondary'
@@ -1328,27 +1345,27 @@ const navRoutes = computed(() => [
13281345
{
13291346
id: 'mods',
13301347
label: formatMessage(getProjectTypeMessage('mod', true)),
1331-
href: '/mods',
1348+
href: '/discover/mods',
13321349
},
13331350
{
13341351
label: formatMessage(getProjectTypeMessage('plugin', true)),
1335-
href: '/plugins',
1352+
href: '/discover/plugins',
13361353
},
13371354
{
13381355
label: formatMessage(getProjectTypeMessage('datapack', true)),
1339-
href: '/datapacks',
1356+
href: '/discover/datapacks',
13401357
},
13411358
{
13421359
label: formatMessage(getProjectTypeMessage('shader', true)),
1343-
href: '/shaders',
1360+
href: '/discover/shaders',
13441361
},
13451362
{
13461363
label: formatMessage(getProjectTypeMessage('resourcepack', true)),
1347-
href: '/resourcepacks',
1364+
href: '/discover/resourcepacks',
13481365
},
13491366
{
13501367
label: formatMessage(getProjectTypeMessage('modpack', true)),
1351-
href: '/modpacks',
1368+
href: '/discover/modpacks',
13521369
},
13531370
])
13541371
@@ -1439,7 +1456,7 @@ const userMenuOptions = computed(() => {
14391456
})
14401457
14411458
const isDiscovering = computed(
1442-
() => route.name && route.name.startsWith('search-') && !route.query.sid,
1459+
() => route.name && route.name.startsWith('discover-') && !route.query.sid,
14431460
)
14441461
14451462
const isDiscoveringSubpage = computed(

apps/frontend/src/locales/en-US/index.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,9 @@
968968
"dashboard.withdraw.error.tax-form.title": {
969969
"message": "Please complete tax form"
970970
},
971+
"discover.title": {
972+
"message": "Discover"
973+
},
971974
"error.collection.404.list_item.1": {
972975
"message": "You may have mistyped the collection's URL."
973976
},
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export default defineNuxtRouteMiddleware((to) => {
2+
if (
3+
to.path.startsWith('/mods') ||
4+
to.path.startsWith('/modpacks') ||
5+
to.path.startsWith('/plugins') ||
6+
to.path.startsWith('/datapacks') ||
7+
to.path.startsWith('/resourcepacks') ||
8+
to.path.startsWith('/shaders')
9+
) {
10+
const target = '/discover' + to.fullPath
11+
return navigateTo(target, { redirectCode: 301 })
12+
}
13+
})

apps/frontend/src/pages/collection/[id].vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@
364364
<span v-if="auth.user && auth.user.id === creator.id" class="preserve-lines text">
365365
<IntlFormatted :message-id="messages.noProjectsAuthLabel">
366366
<template #create-link="{ children }">
367-
<a class="link" @click.prevent="$router.push('/mods')">
367+
<a class="link" @click.prevent="$router.push('/discover/mods')">
368368
<component :is="() => children" />
369369
</a>
370370
</template>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<script setup lang="ts">
2+
import { commonProjectTypeCategoryMessages } from '@modrinth/ui'
3+
import { useVIntl } from '@vintl/vintl'
4+
5+
import NavTabs from '~/components/ui/NavTabs.vue'
6+
const { formatMessage } = useVIntl()
7+
8+
const flags = useFeatureFlags()
9+
const cosmetics = useCosmetics()
10+
const route = useRoute()
11+
12+
const allowTabChanging = computed(() => !route.query.sid)
13+
14+
const selectableProjectTypes = [
15+
{
16+
label: formatMessage(commonProjectTypeCategoryMessages.mod),
17+
href: `/discover/mods`,
18+
type: 'mods',
19+
},
20+
{
21+
label: formatMessage(commonProjectTypeCategoryMessages.resourcepack),
22+
href: `/discover/resourcepacks`,
23+
type: 'resourcepacks',
24+
},
25+
{
26+
label: formatMessage(commonProjectTypeCategoryMessages.datapack),
27+
href: `/discover/datapacks`,
28+
type: 'datapacks',
29+
},
30+
{
31+
label: formatMessage(commonProjectTypeCategoryMessages.shader),
32+
href: `/discover/shaders`,
33+
type: 'shaders',
34+
},
35+
{
36+
label: formatMessage(commonProjectTypeCategoryMessages.modpack),
37+
href: `/discover/modpacks`,
38+
type: 'modpacks',
39+
},
40+
{
41+
label: formatMessage(commonProjectTypeCategoryMessages.plugin),
42+
href: `/discover/plugins`,
43+
type: 'plugins',
44+
},
45+
{
46+
label: formatMessage(commonProjectTypeCategoryMessages.server),
47+
href: `/discover/servers`,
48+
type: 'servers',
49+
shown: flags.value.serverDiscovery,
50+
},
51+
]
52+
</script>
53+
<template>
54+
<div class="new-page sidebar" :class="{ 'alt-layout': !cosmetics.rightSearchLayout }">
55+
<section class="normal-page__header mb-4 flex flex-col gap-4">
56+
<div id="discover-header-prefix" class="empty:hidden"></div>
57+
<NavTabs
58+
v-if="!flags.projectTypesPrimaryNav && allowTabChanging"
59+
:links="selectableProjectTypes"
60+
class="hidden md:flex"
61+
/>
62+
</section>
63+
<NuxtPage />
64+
</div>
65+
</template>

0 commit comments

Comments
 (0)