summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts/use-form.ts
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
commitbe7e3b9a0cb81b78a744993fef2fa2fd2833fa9c (patch)
treec82e18ce93ec0a24c57d7e36eb54a09266b3a25b /packages/frontend/src/scripts/use-form.ts
parentenhnace(frontend): 文字列比較のためのローマナイズを強化(... (diff)
downloadsharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.gz
sharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.bz2
sharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.zip
refactor(frontend): scripts -> utility
Diffstat (limited to 'packages/frontend/src/scripts/use-form.ts')
-rw-r--r--packages/frontend/src/scripts/use-form.ts56
1 files changed, 0 insertions, 56 deletions
diff --git a/packages/frontend/src/scripts/use-form.ts b/packages/frontend/src/scripts/use-form.ts
deleted file mode 100644
index 26cca839c3..0000000000
--- a/packages/frontend/src/scripts/use-form.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and misskey-project
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-import { computed, reactive, watch } from 'vue';
-import type { Reactive } from 'vue';
-
-function copy<T>(v: T): T {
- return JSON.parse(JSON.stringify(v));
-}
-
-function unwrapReactive<T>(v: Reactive<T>): T {
- return JSON.parse(JSON.stringify(v));
-}
-
-export function useForm<T extends Record<string, any>>(initialState: T, save: (newState: T) => Promise<void>) {
- const currentState = reactive<T>(copy(initialState));
- const previousState = reactive<T>(copy(initialState));
-
- const modifiedStates = reactive<Record<keyof T, boolean>>({} as any);
- for (const key in currentState) {
- modifiedStates[key] = false;
- }
- const modified = computed(() => Object.values(modifiedStates).some(v => v));
- const modifiedCount = computed(() => Object.values(modifiedStates).filter(v => v).length);
-
- watch([currentState, previousState], () => {
- for (const key in modifiedStates) {
- modifiedStates[key] = currentState[key] !== previousState[key];
- }
- }, { deep: true });
-
- async function _save() {
- await save(unwrapReactive(currentState));
- for (const key in currentState) {
- previousState[key] = copy(currentState[key]);
- }
- }
-
- function discard() {
- for (const key in currentState) {
- currentState[key] = copy(previousState[key]);
- }
- }
-
- return {
- state: currentState,
- savedState: previousState,
- modifiedStates,
- modified,
- modifiedCount,
- save: _save,
- discard,
- };
-}