Skip to content

Commit 195cc9c

Browse files
authored
refactor(ui): move Toggle component to Composition API + TS (#3281)
* refactor(frontend): move Toggle component to Composition API + TS **Toggle.vue**: - Enable composition API and TS - Added `disabled` to props - Remove redundant `checked` - Replace `modelValue` and `emits` with `defineModel` compiler macro **Others**: - Replace emit handling and `model-value` with `v-model` where simple logic was used - Not `FeatureFlagSettings.vue` (contained custom code on receiving emit) - Not `Mods.vue` (contained custom code on receiving emit) - Remove redundant `checked` attribute * fix(app): toggles not updating value
1 parent 719b395 commit 195cc9c

File tree

9 files changed

+35
-110
lines changed

9 files changed

+35
-110
lines changed

apps/app-frontend/src/components/ui/instance_settings/WindowSettings.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { handleError } from '@/store/notifications'
55
import { defineMessages, useVIntl } from '@vintl/vintl'
66
import { get } from '@/helpers/settings'
77
import { edit } from '@/helpers/profile'
8-
import type { InstanceSettingsTabProps, AppSettings } from '../../../helpers/types'
8+
import type { AppSettings, InstanceSettingsTabProps } from '../../../helpers/types'
99
1010
const { formatMessage } = useVIntl()
1111
@@ -114,7 +114,6 @@ const messages = defineMessages({
114114
<Toggle
115115
id="fullscreen"
116116
:model-value="overrideWindowSettings ? fullscreenSetting : globalSettings.force_fullscreen"
117-
:checked="fullscreenSetting"
118117
:disabled="!overrideWindowSettings"
119118
@update:model-value="
120119
(e) => {

apps/app-frontend/src/components/ui/settings/AppearanceSettings.vue

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script setup lang="ts">
2-
import { Toggle, ThemeSelector, TeleportDropdownMenu } from '@modrinth/ui'
2+
import { TeleportDropdownMenu, ThemeSelector, Toggle } from '@modrinth/ui'
33
import { useTheming } from '@/store/state'
44
import { get, set } from '@/helpers/settings'
5-
import { watch, ref } from 'vue'
5+
import { ref, watch } from 'vue'
66
import { getOS } from '@/helpers/utils'
77
88
const themeStore = useTheming()
@@ -46,7 +46,6 @@ watch(
4646
<Toggle
4747
id="advanced-rendering"
4848
:model-value="themeStore.advancedRendering"
49-
:checked="themeStore.advancedRendering"
5049
@update:model-value="
5150
(e) => {
5251
themeStore.advancedRendering = e
@@ -61,33 +60,15 @@ watch(
6160
<h2 class="m-0 text-lg font-extrabold text-contrast">Native Decorations</h2>
6261
<p class="m-0 mt-1">Use system window frame (app restart required).</p>
6362
</div>
64-
<Toggle
65-
id="native-decorations"
66-
:model-value="settings.native_decorations"
67-
:checked="settings.native_decorations"
68-
@update:model-value="
69-
(e) => {
70-
settings.native_decorations = e
71-
}
72-
"
73-
/>
63+
<Toggle id="native-decorations" v-model="settings.native_decorations" />
7464
</div>
7565

7666
<div class="mt-4 flex items-center justify-between">
7767
<div>
7868
<h2 class="m-0 text-lg font-extrabold text-contrast">Minimize launcher</h2>
7969
<p class="m-0 mt-1">Minimize the launcher when a Minecraft process starts.</p>
8070
</div>
81-
<Toggle
82-
id="minimize-launcher"
83-
:model-value="settings.hide_on_process_start"
84-
:checked="settings.hide_on_process_start"
85-
@update:model-value="
86-
(e) => {
87-
settings.hide_on_process_start = e
88-
}
89-
"
90-
/>
71+
<Toggle id="minimize-launcher" v-model="settings.hide_on_process_start" />
9172
</div>
9273

9374
<div class="mt-4 flex items-center justify-between">
@@ -111,7 +92,6 @@ watch(
11192
<Toggle
11293
id="toggle-sidebar"
11394
:model-value="settings.toggle_sidebar"
114-
:checked="settings.toggle_sidebar"
11595
@update:model-value="
11696
(e) => {
11797
settings.toggle_sidebar = e

apps/app-frontend/src/components/ui/settings/DefaultInstanceSettings.vue

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,7 @@ watch(
5757
</p>
5858
</div>
5959

60-
<Toggle
61-
id="fullscreen"
62-
:model-value="settings.force_fullscreen"
63-
:checked="settings.force_fullscreen"
64-
@update:model-value="
65-
(e) => {
66-
settings.force_fullscreen = e
67-
}
68-
"
69-
/>
60+
<Toggle id="fullscreen" v-model="settings.force_fullscreen" />
7061
</div>
7162

7263
<div class="flex items-center justify-between gap-4">

apps/app-frontend/src/components/ui/settings/FeatureFlagSettings.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ watch(
3737
<Toggle
3838
id="advanced-rendering"
3939
:model-value="getStoreValue(option)"
40-
:checked="getStoreValue(option)"
4140
@update:model-value="() => setStoreValue(option, !themeStore.featureFlags[option])"
4241
/>
4342
</div>

apps/app-frontend/src/components/ui/settings/PrivacySettings.vue

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,7 @@ watch(
3030
option, you opt out and ads will no longer be shown based on your interests.
3131
</p>
3232
</div>
33-
<Toggle
34-
id="personalized-ads"
35-
:model-value="settings.personalized_ads"
36-
:checked="settings.personalized_ads"
37-
@update:model-value="
38-
(e) => {
39-
settings.personalized_ads = e
40-
}
41-
"
42-
/>
33+
<Toggle id="personalized-ads" v-model="settings.personalized_ads" />
4334
</div>
4435

4536
<div class="mt-4 flex items-center justify-between gap-4">
@@ -51,16 +42,7 @@ watch(
5142
longer be collected.
5243
</p>
5344
</div>
54-
<Toggle
55-
id="opt-out-analytics"
56-
:model-value="settings.telemetry"
57-
:checked="settings.telemetry"
58-
@update:model-value="
59-
(e) => {
60-
settings.telemetry = e
61-
}
62-
"
63-
/>
45+
<Toggle id="opt-out-analytics" v-model="settings.telemetry" />
6446
</div>
6547

6648
<div class="mt-4 flex items-center justify-between gap-4">
@@ -75,10 +57,6 @@ watch(
7557
as those added by mods. (app restart required to take effect)
7658
</p>
7759
</div>
78-
<Toggle
79-
id="disable-discord-rpc"
80-
v-model="settings.discord_rpc"
81-
:checked="settings.discord_rpc"
82-
/>
60+
<Toggle id="disable-discord-rpc" v-model="settings.discord_rpc" />
8361
</div>
8462
</template>

apps/app-frontend/src/pages/instance/Mods.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,6 @@
179179
<Toggle
180180
class="!mx-2"
181181
:model-value="!item.data.disabled"
182-
:checked="!item.data.disabled"
183182
@update:model-value="toggleDisableMod(item.data)"
184183
/>
185184
<ButtonStyled type="transparent" circular>

apps/frontend/src/pages/admin/billing/[id].vue

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,7 @@
4040
</span>
4141
<span> Whether or not the subscription should be unprovisioned on refund. </span>
4242
</label>
43-
<Toggle
44-
id="unprovision"
45-
:model-value="unprovision"
46-
:checked="unprovision"
47-
@update:model-value="() => (unprovision = !unprovision)"
48-
/>
43+
<Toggle id="unprovision" v-model="unprovision" />
4944
</div>
5045
<div class="flex gap-2">
5146
<ButtonStyled color="brand">
@@ -114,7 +109,7 @@
114109
</div>
115110
</template>
116111
<script setup>
117-
import { Badge, NewModal, ButtonStyled, DropdownSelect, Toggle } from "@modrinth/ui";
112+
import { Badge, ButtonStyled, DropdownSelect, NewModal, Toggle } from "@modrinth/ui";
118113
import { formatPrice } from "@modrinth/utils";
119114
import { CheckIcon, XIcon } from "@modrinth/assets";
120115
import { products } from "~/generated/state.json";

packages/ui/src/components/base/MarkdownEditor.vue

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@
225225
</template>
226226
</div>
227227
<div class="preview">
228-
<Toggle id="preview" v-model="previewMode" :checked="previewMode" />
228+
<Toggle id="preview" v-model="previewMode" />
229229
<label class="label" for="preview"> Preview </label>
230230
</div>
231231
</div>
@@ -263,31 +263,31 @@
263263
</template>
264264

265265
<script setup lang="ts">
266-
import { type Component, computed, ref, onMounted, onBeforeUnmount, toRef, watch } from 'vue'
266+
import { type Component, computed, onBeforeUnmount, onMounted, ref, toRef, watch } from 'vue'
267267
import { Compartment, EditorState } from '@codemirror/state'
268268
import { EditorView, keymap, placeholder as cm_placeholder } from '@codemirror/view'
269269
import { markdown } from '@codemirror/lang-markdown'
270-
import { indentWithTab, historyKeymap, history } from '@codemirror/commands'
270+
import { history, historyKeymap, indentWithTab } from '@codemirror/commands'
271271
import {
272+
AlignLeftIcon,
273+
BoldIcon,
274+
CodeIcon,
272275
Heading1Icon,
273276
Heading2Icon,
274277
Heading3Icon,
275-
BoldIcon,
278+
ImageIcon,
279+
InfoIcon,
276280
ItalicIcon,
277-
ScanEyeIcon,
278-
StrikethroughIcon,
279-
CodeIcon,
281+
LinkIcon,
280282
ListBulletedIcon,
281283
ListOrderedIcon,
282-
TextQuoteIcon,
283-
LinkIcon,
284-
ImageIcon,
285-
YouTubeIcon,
286-
AlignLeftIcon,
287284
PlusIcon,
288-
XIcon,
285+
ScanEyeIcon,
286+
StrikethroughIcon,
287+
TextQuoteIcon,
289288
UploadIcon,
290-
InfoIcon,
289+
XIcon,
290+
YouTubeIcon,
291291
} from '@modrinth/assets'
292292
import { markdownCommands, modrinthMarkdownEditorKeymap } from '@modrinth/utils/codemirror'
293293
import { renderHighlightedString } from '@modrinth/utils/highlight'
Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,19 @@
11
<template>
22
<input
3-
:id="id"
43
type="checkbox"
54
class="switch stylized-toggle"
5+
:id="id"
6+
:disabled="disabled"
67
:checked="checked"
7-
@change="toggle"
8+
@change="checked = !checked"
89
/>
910
</template>
1011

11-
<script>
12-
export default {
13-
props: {
14-
id: {
15-
type: String,
16-
required: true,
17-
},
18-
modelValue: {
19-
type: Boolean,
20-
},
21-
checked: {
22-
type: Boolean,
23-
required: true,
24-
},
25-
},
26-
emits: ['update:modelValue'],
27-
methods: {
28-
toggle() {
29-
if (!this.disabled) {
30-
this.$emit('update:modelValue', !this.modelValue)
31-
}
32-
},
33-
},
34-
}
12+
<script setup lang="ts">
13+
defineProps<{
14+
id?: string
15+
disabled?: boolean
16+
}>()
17+
18+
const checked = defineModel<boolean>()
3519
</script>

0 commit comments

Comments
 (0)