Skip to content

Commit 49281eb

Browse files
committed
feat: show proper compatibility info
1 parent 4e811be commit 49281eb

File tree

12 files changed

+193
-64
lines changed

12 files changed

+193
-64
lines changed

src/gql/home/mods.graphql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ query GetMods($offset: Int!, $limit: Int!, $search: String, $order: Order, $orde
2626
sml_version
2727
}
2828
}
29+
compatibility {
30+
EA {
31+
note
32+
state
33+
}
34+
EXP {
35+
note
36+
state
37+
}
38+
}
2939
}
3040
}
3141
}

src/gql/mods/mod.graphql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,15 @@ query GetMod($mod: String!) {
4343
avatar
4444
}
4545
}
46+
compatibility {
47+
EA {
48+
note
49+
state
50+
}
51+
EXP {
52+
note
53+
state
54+
}
55+
}
4656
}
4757
}

src/lib/components/mods/ModCard.svelte

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
import IconButton, { Icon } from '@smui/icon-button';
55
import FicsitCard from '$lib/components/general/FicsitCard.svelte';
66
import { installMod } from '$lib/stores/launcher';
7-
import { modStatus } from '$lib/utils/mod';
87
import { prettyNumber } from '$lib/utils/formatting';
8+
import OutdatedBanner from '$lib/components/mods/compatibility/OutdatedBanner.svelte';
9+
import CompatibilityButton from '$lib/components/mods/compatibility/CompatibilityButton.svelte';
910
10-
export let mod: Pick<Mod, 'id' | 'mod_reference' | 'name' | 'logo' | 'views' | 'downloads' | 'short_description'> & {
11+
export let mod: Pick<
12+
Mod,
13+
'id' | 'mod_reference' | 'name' | 'logo' | 'views' | 'downloads' | 'short_description' | 'compatibility'
14+
> & {
1115
latestVersions: {
1216
alpha?: Maybe<Pick<Version, 'id' | 'sml_version'>>;
1317
beta?: Maybe<Pick<Version, 'id' | 'sml_version'>>;
@@ -35,18 +39,9 @@
3539
download
3640
</IconButton>
3741
{/if}
42+
<CompatibilityButton compatibility={mod.compatibility} />
3843
</div>
3944
<div slot="outer">
40-
{#if modStatus(mod.latestVersions) === 'own-risk'}
41-
<div class="mod-own-risk">
42-
<div class="mod-inset" />
43-
<div class="mod-stripe">USE AT YOUR OWN RISK</div>
44-
</div>
45-
{:else if modStatus(mod.latestVersions) === 'outdated'}
46-
<div class="mod-outdated">
47-
<div class="mod-inset" />
48-
<div class="mod-stripe">OUTDATED</div>
49-
</div>
50-
{/if}
45+
<OutdatedBanner compatibility={mod.compatibility} />
5146
</div>
5247
</FicsitCard>
Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,16 @@
11
<script lang="ts">
22
import { assets } from '$app/paths';
3-
import { modStatus } from '$lib/utils/mod';
4-
import type { Maybe, Version } from '$lib/generated';
3+
import type { CompatibilityInfoInput } from '$lib/generated';
4+
import OutdatedBanner from '$lib/components/mods/compatibility/OutdatedBanner.svelte';
55
66
export let modLogo!: string;
77
export let modName!: string;
8-
export let latestVersions:
9-
| {
10-
alpha?: Maybe<Pick<Version, 'sml_version'>>;
11-
beta?: Maybe<Pick<Version, 'sml_version'>>;
12-
release?: Maybe<Pick<Version, 'sml_version'>>;
13-
}
14-
| undefined;
8+
export let compatibility: CompatibilityInfoInput;
159
1610
$: logo = modLogo || assets + '/images/no_image.webp';
1711
</script>
1812

1913
<div class="relative overflow-hidden">
20-
{#if modStatus(latestVersions) === 'own-risk'}
21-
<div class="mod-own-risk">
22-
<div class="mod-inset" />
23-
<div class="mod-stripe">USE AT YOUR OWN RISK</div>
24-
</div>
25-
{:else if modStatus(latestVersions) === 'outdated'}
26-
<div class="mod-outdated">
27-
<div class="mod-inset" />
28-
<div class="mod-stripe">OUTDATED</div>
29-
</div>
30-
{/if}
14+
<OutdatedBanner {compatibility} logo={true} />
3115
<img class="rounded-lg sm:max-w-lg max-w-full w-full" src={logo} alt="Logo for {modName}" />
3216
</div>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<script lang="ts">
2+
import type { CompatibilityInfoInput } from '$lib/generated';
3+
import { CompatibilityState } from '$lib/generated';
4+
import IconButton from '@smui/icon-button';
5+
import Dialog, { Content, Title } from '@smui/dialog';
6+
import CompatibilityInfo from '$lib/components/mods/compatibility/CompatibilityInfo.svelte';
7+
let open = false;
8+
9+
export let compatibility: CompatibilityInfoInput;
10+
11+
let CSSClass = '';
12+
if (compatibility) {
13+
switch (compatibility.EXP.state) {
14+
case CompatibilityState.Broken:
15+
CSSClass = 'mod-broken-button';
16+
break;
17+
case CompatibilityState.Damaged:
18+
CSSClass = 'mod-damaged-button';
19+
break;
20+
}
21+
}
22+
</script>
23+
24+
{#if compatibility}
25+
<IconButton
26+
class="{CSSClass} material-icons"
27+
title="Compatibility issues"
28+
on:click={() => {
29+
open = true;
30+
}}
31+
>
32+
warning
33+
</IconButton>
34+
35+
<Dialog bind:open>
36+
<Title>Compatibility Info</Title>
37+
<Content>
38+
<CompatibilityInfo {compatibility} />
39+
</Content>
40+
</Dialog>
41+
{/if}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<script lang="ts">
2+
import type { CompatibilityInfoInput } from '$lib/generated';
3+
import CompatibilityStateText from '$lib/components/mods/compatibility/CompatibilityStateText.svelte';
4+
5+
export let compatibility: CompatibilityInfoInput;
6+
</script>
7+
8+
{#if compatibility}
9+
<div>Early Access: <CompatibilityStateText state={compatibility.EA.state} /></div>
10+
{#if compatibility.EA.note}
11+
{compatibility.EA.note}
12+
{/if}
13+
<br />
14+
<div>Experimental: <CompatibilityStateText state={compatibility.EXP.state} /></div>
15+
{#if compatibility.EXP.note}
16+
{compatibility.EXP.note}
17+
{/if}
18+
{/if}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script lang="ts">
2+
import type { CompatibilityInfoInput } from '$lib/generated';
3+
4+
export let compatibility: CompatibilityInfoInput;
5+
</script>
6+
7+
<h1>
8+
{compatibility.EA.state}
9+
</h1>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script lang="ts">
2+
import type { CompatibilityState } from '$lib/generated';
3+
export let state: CompatibilityState;
4+
5+
function classForState(state: CompatibilityState): string {
6+
return `mod-state-${state.toString().toLowerCase()}`;
7+
}
8+
</script>
9+
10+
<p class="{classForState(state)} mod-state">{state}</p>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<script lang="ts">
2+
import type { CompatibilityInfoInput } from '$lib/generated';
3+
import { CompatibilityState } from '$lib/generated';
4+
5+
export let compatibility: CompatibilityInfoInput;
6+
export let logo = false;
7+
8+
let CSSClass = '';
9+
if (compatibility) {
10+
switch (compatibility.EXP.state) {
11+
case CompatibilityState.Broken:
12+
CSSClass += 'mod-outdated-stripe';
13+
CSSClass += ' mod-broken';
14+
break;
15+
case CompatibilityState.Damaged:
16+
CSSClass += 'mod-outdated-stripe';
17+
CSSClass += ' mod-damaged';
18+
break;
19+
}
20+
}
21+
if (logo) {
22+
CSSClass += ' mod-logo-outdated';
23+
}
24+
</script>
25+
26+
<div class={CSSClass}>
27+
<!-- <div class="mod-inset"/>-->
28+
</div>

src/lib/core/graphql.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ export const initializeGraphQLClient = (fetch?: LoadInput['fetch']): Client => {
2828
UserMod: () => null,
2929
GetGuides: () => null,
3030
OAuthOptions: () => null,
31-
UserRoles: () => null
31+
UserRoles: () => null,
32+
Compatibility: () => null,
33+
CompatibilityInfoInput: () => null,
34+
CompatibilityInfo: () => null
3235
},
3336
updates: {
3437
Mutation: {

0 commit comments

Comments
 (0)