create-pixi-vn 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/template-react-vite-muijoy/src/components/menus/settings/system-controls.tsx +2 -2
- package/template-react-vite-muijoy/src/components/quick-tools.tsx +4 -4
- package/template-react-vite-muijoy/src/lib/hooks/hotkeys-hooks.ts +4 -4
- package/template-react-vite-muijoy/src/lib/hooks/save-hooks.tsx +7 -7
- package/template-react-vite-muijoy/src/lib/query/narration-query.ts +12 -12
- package/template-react-vite-muijoy/src/lib/query/save-query.ts +4 -4
- package/template-react-vite-muijoy/src/lib/query/settings-query.ts +2 -2
- package/template-react-vite-muijoy/vite.config.ts +3 -3
- package/template-react-vite-muijoy-ink/src/components/menus/settings/system-controls.tsx +2 -2
- package/template-react-vite-muijoy-ink/src/components/quick-tools.tsx +4 -4
- package/template-react-vite-muijoy-ink/src/lib/hooks/hotkeys-hooks.ts +4 -4
- package/template-react-vite-muijoy-ink/src/lib/hooks/save-hooks.tsx +7 -7
- package/template-react-vite-muijoy-ink/src/lib/query/narration-query.ts +12 -12
- package/template-react-vite-muijoy-ink/src/lib/query/save-query.ts +4 -4
- package/template-react-vite-muijoy-ink/src/lib/query/settings-query.ts +2 -2
- package/template-react-vite-muijoy-ink/vite.config.ts +3 -3
- package/template-react-vite-muijoy-ink-tauri/.assetpack.ts +9 -0
- package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/system-controls.tsx +2 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/quick-tools.tsx +4 -4
- package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/hotkeys-hooks.ts +4 -4
- package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/save-hooks.tsx +7 -7
- package/template-react-vite-muijoy-ink-tauri/src/lib/query/narration-query.ts +12 -12
- package/template-react-vite-muijoy-ink-tauri/src/lib/query/save-query.ts +4 -4
- package/template-react-vite-muijoy-ink-tauri/src/lib/query/settings-query.ts +2 -2
- package/template-react-vite-muijoy-ink-tauri/src-tauri/Cargo.toml +7 -0
- package/template-react-vite-muijoy-ink-tauri/vite.config.ts +3 -3
- package/template-react-vite-muijoy-tauri/.assetpack.ts +9 -0
- package/template-react-vite-muijoy-tauri/src/components/menus/settings/system-controls.tsx +2 -2
- package/template-react-vite-muijoy-tauri/src/components/quick-tools.tsx +4 -4
- package/template-react-vite-muijoy-tauri/src/lib/hooks/hotkeys-hooks.ts +4 -4
- package/template-react-vite-muijoy-tauri/src/lib/hooks/save-hooks.tsx +7 -7
- package/template-react-vite-muijoy-tauri/src/lib/query/narration-query.ts +12 -12
- package/template-react-vite-muijoy-tauri/src/lib/query/save-query.ts +4 -4
- package/template-react-vite-muijoy-tauri/src/lib/query/settings-query.ts +2 -2
- package/template-react-vite-muijoy-tauri/src-tauri/Cargo.toml +7 -0
- package/template-react-vite-muijoy-tauri/vite.config.ts +3 -3
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
|
|
|
14
14
|
import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
|
|
15
15
|
import { downloadResourceToTranslate } from "@/lib/i18n";
|
|
16
16
|
import {
|
|
17
|
-
|
|
17
|
+
IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
|
|
18
18
|
useQueryIsFullModeScreen,
|
|
19
19
|
} from "@/lib/query/settings-query";
|
|
20
20
|
import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
|
|
@@ -162,7 +162,7 @@ export function FullScreenSettings() {
|
|
|
162
162
|
promise.finally(() => {
|
|
163
163
|
setLoading(false);
|
|
164
164
|
queryClient.invalidateQueries({
|
|
165
|
-
queryKey: [
|
|
165
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
166
166
|
});
|
|
167
167
|
});
|
|
168
168
|
}}
|
|
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
|
7
7
|
import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
|
|
8
8
|
import { useQueryCanGoBack } from "@/lib/query/narration-query";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
11
|
+
SAVES_USE_QUERY_KEY,
|
|
12
12
|
useQueryLastSave,
|
|
13
13
|
} from "@/lib/query/save-query";
|
|
14
14
|
import { AutoSettings } from "@/lib/stores/auto-settings-store";
|
|
@@ -105,8 +105,8 @@ export function QuickTools() {
|
|
|
105
105
|
className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
|
|
106
106
|
onClick={() => {
|
|
107
107
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
108
|
-
queryClient.setQueryData([
|
|
109
|
-
queryClient.setQueryData([
|
|
108
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
109
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
110
110
|
});
|
|
111
111
|
toast.promise(savePromise, {
|
|
112
112
|
loading: t("saving"),
|
|
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
5
|
import { useQueryInputValue } from "@/lib/query/narration-query";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
8
|
+
SAVES_USE_QUERY_KEY,
|
|
9
9
|
useQueryLastSave,
|
|
10
10
|
} from "@/lib/query/save-query";
|
|
11
11
|
import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
|
|
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
|
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
50
|
-
queryClient.setQueryData([
|
|
51
|
-
queryClient.setQueryData([
|
|
50
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
51
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
52
52
|
});
|
|
53
53
|
toast.promise(savePromise, {
|
|
54
54
|
loading: t("saving"),
|
|
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
|
|
|
2
2
|
import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
|
|
3
3
|
import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
|
-
import {
|
|
5
|
+
import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
|
|
6
6
|
import {
|
|
7
7
|
addRefreshSave,
|
|
8
8
|
deleteSaveFromIndexDB,
|
|
@@ -62,8 +62,8 @@ export function useSaveActions() {
|
|
|
62
62
|
onConfirm: () =>
|
|
63
63
|
deleteSaveFromIndexDB(id)
|
|
64
64
|
.then(() => {
|
|
65
|
-
queryClient.setQueryData([
|
|
66
|
-
queryClient.invalidateQueries({ queryKey: [
|
|
65
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
|
|
66
|
+
queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
|
|
67
67
|
toast.success(t("success_delete"));
|
|
68
68
|
return true;
|
|
69
69
|
})
|
|
@@ -95,8 +95,8 @@ export function useSaveActions() {
|
|
|
95
95
|
id,
|
|
96
96
|
name: tempSaveNameRef.current,
|
|
97
97
|
}).then((save) => {
|
|
98
|
-
queryClient.setQueryData([
|
|
99
|
-
queryClient.setQueryData([
|
|
98
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
99
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
100
100
|
});
|
|
101
101
|
toast.promise(savePromise, {
|
|
102
102
|
loading: t("saving"),
|
|
@@ -138,8 +138,8 @@ export function useSaveActions() {
|
|
|
138
138
|
id,
|
|
139
139
|
name: tempSaveNameRef.current,
|
|
140
140
|
}).then((save) => {
|
|
141
|
-
queryClient.setQueryData([
|
|
142
|
-
queryClient.setQueryData([
|
|
141
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
142
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
143
143
|
});
|
|
144
144
|
toast.promise(savePromise, {
|
|
145
145
|
loading: t("saving"),
|
|
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
|
|
|
3
3
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
|
|
7
7
|
export function useQueryCanGoBack() {
|
|
8
8
|
return useQuery({
|
|
9
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
9
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
|
|
10
10
|
queryFn: async () => stepHistory.canGoBack,
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
|
|
15
15
|
export function useQueryChoiceMenuOptions() {
|
|
16
16
|
const { t } = useTranslation(["narration"]);
|
|
17
17
|
return useQuery({
|
|
18
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
18
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
|
|
19
19
|
queryFn: async () =>
|
|
20
20
|
narration.choices?.map((option) => ({
|
|
21
21
|
...option,
|
|
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
|
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
const
|
|
30
|
+
const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
|
|
31
31
|
export function useQueryInputValue<T>() {
|
|
32
32
|
return useQuery({
|
|
33
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
33
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
|
|
34
34
|
queryFn: async () => ({
|
|
35
35
|
isRequired: narration.isRequiredInput,
|
|
36
36
|
type: narration.inputType,
|
|
@@ -44,13 +44,13 @@ type DialogueModel = {
|
|
|
44
44
|
text?: string;
|
|
45
45
|
character?: CharacterInterface;
|
|
46
46
|
};
|
|
47
|
-
const
|
|
47
|
+
const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
|
|
48
48
|
export function useQueryDialogue() {
|
|
49
49
|
const { t } = useTranslation(["narration"]);
|
|
50
50
|
const queryClient = useQueryClient();
|
|
51
51
|
|
|
52
52
|
return useQuery<DialogueModel>({
|
|
53
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
53
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
|
|
54
54
|
queryFn: async ({ queryKey }) => {
|
|
55
55
|
const dialogue = narration.dialogue;
|
|
56
56
|
let text = dialogue?.text;
|
|
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
|
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
const
|
|
92
|
+
const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
|
|
93
93
|
export function useQueryCanGoNext() {
|
|
94
94
|
return useQuery({
|
|
95
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
95
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
|
|
96
96
|
queryFn: async () => narration.canContinue && !narration.isRequiredInput,
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
const
|
|
100
|
+
const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
|
|
101
101
|
export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
|
|
102
102
|
const { t } = useTranslation(["narration"]);
|
|
103
103
|
const normalizedSearch = searchString?.toLowerCase().trim();
|
|
104
104
|
|
|
105
105
|
return useQuery({
|
|
106
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
106
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
|
|
107
107
|
queryFn: async () => {
|
|
108
108
|
const promises = stepHistory.narrativeHistory.map(async (step) => {
|
|
109
109
|
const character = step.dialogue?.character;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
|
|
5
5
|
export function useQuerySaves({ id }: { id: number }) {
|
|
6
6
|
return useQuery({
|
|
7
|
-
queryKey: [
|
|
7
|
+
queryKey: [SAVES_USE_QUERY_KEY, id],
|
|
8
8
|
queryFn: async () => (await getSaveFromIndexDB(id)) || null,
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export const
|
|
12
|
+
export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
|
|
13
13
|
export function useQueryLastSave() {
|
|
14
14
|
return useQuery({
|
|
15
|
-
queryKey: [
|
|
15
|
+
queryKey: [LAST_SAVE_USE_QUERY_KEY],
|
|
16
16
|
queryFn: async () => (await getLastSaveFromIndexDB()) || null,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
2
|
|
|
3
|
-
export const
|
|
3
|
+
export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
|
|
4
4
|
|
|
5
5
|
export function useQueryIsFullModeScreen() {
|
|
6
6
|
return useQuery({
|
|
7
|
-
queryKey: [
|
|
7
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
8
8
|
queryFn: async () => document.fullscreenElement !== null,
|
|
9
9
|
});
|
|
10
10
|
}
|
|
@@ -19,7 +19,7 @@ import assetPackConfig from "./.assetpack.ts";
|
|
|
19
19
|
const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
|
|
20
20
|
|
|
21
21
|
// https://vite.dev/config/
|
|
22
|
-
export default defineConfig({
|
|
22
|
+
export default defineConfig(({ mode }) => ({
|
|
23
23
|
plugins: [
|
|
24
24
|
assetpackPlugin(),
|
|
25
25
|
checker({
|
|
@@ -27,7 +27,7 @@ export default defineConfig({
|
|
|
27
27
|
tsconfigPath: "tsconfig.app.json",
|
|
28
28
|
},
|
|
29
29
|
}),
|
|
30
|
-
devtools(),
|
|
30
|
+
mode !== "production" && devtools(),
|
|
31
31
|
tanstackRouter({ target: "react", autoCodeSplitting: true }),
|
|
32
32
|
react(),
|
|
33
33
|
tailwindcss(),
|
|
@@ -112,7 +112,7 @@ export default defineConfig({
|
|
|
112
112
|
},
|
|
113
113
|
},
|
|
114
114
|
},
|
|
115
|
-
});
|
|
115
|
+
}));
|
|
116
116
|
|
|
117
117
|
function assetpackPlugin(): Plugin {
|
|
118
118
|
let mode: ResolvedConfig["command"];
|
|
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
|
|
|
14
14
|
import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
|
|
15
15
|
import { downloadResourceToTranslate } from "@/lib/i18n";
|
|
16
16
|
import {
|
|
17
|
-
|
|
17
|
+
IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
|
|
18
18
|
useQueryIsFullModeScreen,
|
|
19
19
|
} from "@/lib/query/settings-query";
|
|
20
20
|
import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
|
|
@@ -162,7 +162,7 @@ export function FullScreenSettings() {
|
|
|
162
162
|
promise.finally(() => {
|
|
163
163
|
setLoading(false);
|
|
164
164
|
queryClient.invalidateQueries({
|
|
165
|
-
queryKey: [
|
|
165
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
166
166
|
});
|
|
167
167
|
});
|
|
168
168
|
}}
|
|
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
|
7
7
|
import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
|
|
8
8
|
import { useQueryCanGoBack } from "@/lib/query/narration-query";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
11
|
+
SAVES_USE_QUERY_KEY,
|
|
12
12
|
useQueryLastSave,
|
|
13
13
|
} from "@/lib/query/save-query";
|
|
14
14
|
import { AutoSettings } from "@/lib/stores/auto-settings-store";
|
|
@@ -105,8 +105,8 @@ export function QuickTools() {
|
|
|
105
105
|
className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
|
|
106
106
|
onClick={() => {
|
|
107
107
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
108
|
-
queryClient.setQueryData([
|
|
109
|
-
queryClient.setQueryData([
|
|
108
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
109
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
110
110
|
});
|
|
111
111
|
toast.promise(savePromise, {
|
|
112
112
|
loading: t("saving"),
|
|
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
5
|
import { useQueryInputValue } from "@/lib/query/narration-query";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
8
|
+
SAVES_USE_QUERY_KEY,
|
|
9
9
|
useQueryLastSave,
|
|
10
10
|
} from "@/lib/query/save-query";
|
|
11
11
|
import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
|
|
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
|
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
50
|
-
queryClient.setQueryData([
|
|
51
|
-
queryClient.setQueryData([
|
|
50
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
51
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
52
52
|
});
|
|
53
53
|
toast.promise(savePromise, {
|
|
54
54
|
loading: t("saving"),
|
|
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
|
|
|
2
2
|
import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
|
|
3
3
|
import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
|
-
import {
|
|
5
|
+
import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
|
|
6
6
|
import {
|
|
7
7
|
addRefreshSave,
|
|
8
8
|
deleteSaveFromIndexDB,
|
|
@@ -62,8 +62,8 @@ export function useSaveActions() {
|
|
|
62
62
|
onConfirm: () =>
|
|
63
63
|
deleteSaveFromIndexDB(id)
|
|
64
64
|
.then(() => {
|
|
65
|
-
queryClient.setQueryData([
|
|
66
|
-
queryClient.invalidateQueries({ queryKey: [
|
|
65
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
|
|
66
|
+
queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
|
|
67
67
|
toast.success(t("success_delete"));
|
|
68
68
|
return true;
|
|
69
69
|
})
|
|
@@ -95,8 +95,8 @@ export function useSaveActions() {
|
|
|
95
95
|
id,
|
|
96
96
|
name: tempSaveNameRef.current,
|
|
97
97
|
}).then((save) => {
|
|
98
|
-
queryClient.setQueryData([
|
|
99
|
-
queryClient.setQueryData([
|
|
98
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
99
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
100
100
|
});
|
|
101
101
|
toast.promise(savePromise, {
|
|
102
102
|
loading: t("saving"),
|
|
@@ -138,8 +138,8 @@ export function useSaveActions() {
|
|
|
138
138
|
id,
|
|
139
139
|
name: tempSaveNameRef.current,
|
|
140
140
|
}).then((save) => {
|
|
141
|
-
queryClient.setQueryData([
|
|
142
|
-
queryClient.setQueryData([
|
|
141
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
142
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
143
143
|
});
|
|
144
144
|
toast.promise(savePromise, {
|
|
145
145
|
loading: t("saving"),
|
|
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
|
|
|
3
3
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
|
|
7
7
|
export function useQueryCanGoBack() {
|
|
8
8
|
return useQuery({
|
|
9
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
9
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
|
|
10
10
|
queryFn: async () => stepHistory.canGoBack,
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
|
|
15
15
|
export function useQueryChoiceMenuOptions() {
|
|
16
16
|
const { t } = useTranslation(["narration"]);
|
|
17
17
|
return useQuery({
|
|
18
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
18
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
|
|
19
19
|
queryFn: async () =>
|
|
20
20
|
narration.choices?.map((option) => ({
|
|
21
21
|
...option,
|
|
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
|
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
const
|
|
30
|
+
const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
|
|
31
31
|
export function useQueryInputValue<T>() {
|
|
32
32
|
return useQuery({
|
|
33
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
33
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
|
|
34
34
|
queryFn: async () => ({
|
|
35
35
|
isRequired: narration.isRequiredInput,
|
|
36
36
|
type: narration.inputType,
|
|
@@ -44,13 +44,13 @@ type DialogueModel = {
|
|
|
44
44
|
text?: string;
|
|
45
45
|
character?: CharacterInterface;
|
|
46
46
|
};
|
|
47
|
-
const
|
|
47
|
+
const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
|
|
48
48
|
export function useQueryDialogue() {
|
|
49
49
|
const { t } = useTranslation(["narration"]);
|
|
50
50
|
const queryClient = useQueryClient();
|
|
51
51
|
|
|
52
52
|
return useQuery<DialogueModel>({
|
|
53
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
53
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
|
|
54
54
|
queryFn: async ({ queryKey }) => {
|
|
55
55
|
const dialogue = narration.dialogue;
|
|
56
56
|
let text = dialogue?.text;
|
|
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
|
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
const
|
|
92
|
+
const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
|
|
93
93
|
export function useQueryCanGoNext() {
|
|
94
94
|
return useQuery({
|
|
95
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
95
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
|
|
96
96
|
queryFn: async () => narration.canContinue && !narration.isRequiredInput,
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
const
|
|
100
|
+
const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
|
|
101
101
|
export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
|
|
102
102
|
const { t } = useTranslation(["narration"]);
|
|
103
103
|
const normalizedSearch = searchString?.toLowerCase().trim();
|
|
104
104
|
|
|
105
105
|
return useQuery({
|
|
106
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
106
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
|
|
107
107
|
queryFn: async () => {
|
|
108
108
|
const promises = stepHistory.narrativeHistory.map(async (step) => {
|
|
109
109
|
const character = step.dialogue?.character;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
|
|
5
5
|
export function useQuerySaves({ id }: { id: number }) {
|
|
6
6
|
return useQuery({
|
|
7
|
-
queryKey: [
|
|
7
|
+
queryKey: [SAVES_USE_QUERY_KEY, id],
|
|
8
8
|
queryFn: async () => (await getSaveFromIndexDB(id)) || null,
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export const
|
|
12
|
+
export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
|
|
13
13
|
export function useQueryLastSave() {
|
|
14
14
|
return useQuery({
|
|
15
|
-
queryKey: [
|
|
15
|
+
queryKey: [LAST_SAVE_USE_QUERY_KEY],
|
|
16
16
|
queryFn: async () => (await getLastSaveFromIndexDB()) || null,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
2
|
|
|
3
|
-
export const
|
|
3
|
+
export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
|
|
4
4
|
|
|
5
5
|
export function useQueryIsFullModeScreen() {
|
|
6
6
|
return useQuery({
|
|
7
|
-
queryKey: [
|
|
7
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
8
8
|
queryFn: async () => document.fullscreenElement !== null,
|
|
9
9
|
});
|
|
10
10
|
}
|
|
@@ -20,7 +20,7 @@ import assetPackConfig from "./.assetpack.ts";
|
|
|
20
20
|
const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
|
|
21
21
|
|
|
22
22
|
// https://vite.dev/config/
|
|
23
|
-
export default defineConfig({
|
|
23
|
+
export default defineConfig(({ mode }) => ({
|
|
24
24
|
plugins: [
|
|
25
25
|
assetpackPlugin(),
|
|
26
26
|
checker({
|
|
@@ -28,7 +28,7 @@ export default defineConfig({
|
|
|
28
28
|
tsconfigPath: "tsconfig.app.json",
|
|
29
29
|
},
|
|
30
30
|
}),
|
|
31
|
-
devtools(),
|
|
31
|
+
mode !== "production" && devtools(),
|
|
32
32
|
tanstackRouter({ target: "react", autoCodeSplitting: true }),
|
|
33
33
|
react(),
|
|
34
34
|
tailwindcss(),
|
|
@@ -118,7 +118,7 @@ export default defineConfig({
|
|
|
118
118
|
},
|
|
119
119
|
},
|
|
120
120
|
},
|
|
121
|
-
});
|
|
121
|
+
}));
|
|
122
122
|
|
|
123
123
|
function assetpackPlugin(): Plugin {
|
|
124
124
|
let mode: ResolvedConfig["command"];
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { AssetPackConfig } from "@assetpack/core";
|
|
2
2
|
import { pixiPipes } from "@assetpack/core/pixi";
|
|
3
3
|
|
|
4
|
+
// TAURI_ENV_TARGET_TRIPLE is set by `tauri build` before running beforeBuildCommand
|
|
5
|
+
const isTauri = !!process.env.TAURI_ENV_TARGET_TRIPLE;
|
|
6
|
+
|
|
4
7
|
const config: AssetPackConfig = {
|
|
5
8
|
entry: "./src/assets",
|
|
6
9
|
output: "./public/assets",
|
|
@@ -11,6 +14,12 @@ const config: AssetPackConfig = {
|
|
|
11
14
|
output: "src/assets/manifest.gen.json",
|
|
12
15
|
createShortcuts: true,
|
|
13
16
|
},
|
|
17
|
+
// For Tauri: skip @0.5x mipmaps (unused on desktop, WebView handles DPR)
|
|
18
|
+
resolutions: isTauri ? { default: 1 } : undefined,
|
|
19
|
+
// For Tauri: raise WebP quality — files are local so bandwidth is not a concern
|
|
20
|
+
compression: isTauri
|
|
21
|
+
? { png: true, jpg: true, webp: { quality: 88, alphaQuality: 88 } }
|
|
22
|
+
: undefined,
|
|
14
23
|
}),
|
|
15
24
|
],
|
|
16
25
|
};
|
package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/system-controls.tsx
CHANGED
|
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
|
|
|
14
14
|
import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
|
|
15
15
|
import { downloadResourceToTranslate } from "@/lib/i18n";
|
|
16
16
|
import {
|
|
17
|
-
|
|
17
|
+
IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
|
|
18
18
|
useQueryIsFullModeScreen,
|
|
19
19
|
} from "@/lib/query/settings-query";
|
|
20
20
|
import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
|
|
@@ -172,7 +172,7 @@ export function FullScreenSettings() {
|
|
|
172
172
|
promise.finally(() => {
|
|
173
173
|
setLoading(false);
|
|
174
174
|
queryClient.invalidateQueries({
|
|
175
|
-
queryKey: [
|
|
175
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
176
176
|
});
|
|
177
177
|
});
|
|
178
178
|
}}
|
|
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
|
7
7
|
import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
|
|
8
8
|
import { useQueryCanGoBack } from "@/lib/query/narration-query";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
11
|
+
SAVES_USE_QUERY_KEY,
|
|
12
12
|
useQueryLastSave,
|
|
13
13
|
} from "@/lib/query/save-query";
|
|
14
14
|
import { AutoSettings } from "@/lib/stores/auto-settings-store";
|
|
@@ -105,8 +105,8 @@ export function QuickTools() {
|
|
|
105
105
|
className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
|
|
106
106
|
onClick={() => {
|
|
107
107
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
108
|
-
queryClient.setQueryData([
|
|
109
|
-
queryClient.setQueryData([
|
|
108
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
109
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
110
110
|
});
|
|
111
111
|
toast.promise(savePromise, {
|
|
112
112
|
loading: t("saving"),
|
|
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
5
|
import { useQueryInputValue } from "@/lib/query/narration-query";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
8
|
+
SAVES_USE_QUERY_KEY,
|
|
9
9
|
useQueryLastSave,
|
|
10
10
|
} from "@/lib/query/save-query";
|
|
11
11
|
import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
|
|
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
|
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
50
|
-
queryClient.setQueryData([
|
|
51
|
-
queryClient.setQueryData([
|
|
50
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
51
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
52
52
|
});
|
|
53
53
|
toast.promise(savePromise, {
|
|
54
54
|
loading: t("saving"),
|
|
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
|
|
|
2
2
|
import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
|
|
3
3
|
import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
|
-
import {
|
|
5
|
+
import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
|
|
6
6
|
import {
|
|
7
7
|
addRefreshSave,
|
|
8
8
|
deleteSaveFromIndexDB,
|
|
@@ -62,8 +62,8 @@ export function useSaveActions() {
|
|
|
62
62
|
onConfirm: () =>
|
|
63
63
|
deleteSaveFromIndexDB(id)
|
|
64
64
|
.then(() => {
|
|
65
|
-
queryClient.setQueryData([
|
|
66
|
-
queryClient.invalidateQueries({ queryKey: [
|
|
65
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
|
|
66
|
+
queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
|
|
67
67
|
toast.success(t("success_delete"));
|
|
68
68
|
return true;
|
|
69
69
|
})
|
|
@@ -95,8 +95,8 @@ export function useSaveActions() {
|
|
|
95
95
|
id,
|
|
96
96
|
name: tempSaveNameRef.current,
|
|
97
97
|
}).then((save) => {
|
|
98
|
-
queryClient.setQueryData([
|
|
99
|
-
queryClient.setQueryData([
|
|
98
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
99
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
100
100
|
});
|
|
101
101
|
toast.promise(savePromise, {
|
|
102
102
|
loading: t("saving"),
|
|
@@ -138,8 +138,8 @@ export function useSaveActions() {
|
|
|
138
138
|
id,
|
|
139
139
|
name: tempSaveNameRef.current,
|
|
140
140
|
}).then((save) => {
|
|
141
|
-
queryClient.setQueryData([
|
|
142
|
-
queryClient.setQueryData([
|
|
141
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
142
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
143
143
|
});
|
|
144
144
|
toast.promise(savePromise, {
|
|
145
145
|
loading: t("saving"),
|
|
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
|
|
|
3
3
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
|
|
7
7
|
export function useQueryCanGoBack() {
|
|
8
8
|
return useQuery({
|
|
9
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
9
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
|
|
10
10
|
queryFn: async () => stepHistory.canGoBack,
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
|
|
15
15
|
export function useQueryChoiceMenuOptions() {
|
|
16
16
|
const { t } = useTranslation(["narration"]);
|
|
17
17
|
return useQuery({
|
|
18
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
18
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
|
|
19
19
|
queryFn: async () =>
|
|
20
20
|
narration.choices?.map((option) => ({
|
|
21
21
|
...option,
|
|
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
|
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
const
|
|
30
|
+
const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
|
|
31
31
|
export function useQueryInputValue<T>() {
|
|
32
32
|
return useQuery({
|
|
33
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
33
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
|
|
34
34
|
queryFn: async () => ({
|
|
35
35
|
isRequired: narration.isRequiredInput,
|
|
36
36
|
type: narration.inputType,
|
|
@@ -44,13 +44,13 @@ type DialogueModel = {
|
|
|
44
44
|
text?: string;
|
|
45
45
|
character?: CharacterInterface;
|
|
46
46
|
};
|
|
47
|
-
const
|
|
47
|
+
const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
|
|
48
48
|
export function useQueryDialogue() {
|
|
49
49
|
const { t } = useTranslation(["narration"]);
|
|
50
50
|
const queryClient = useQueryClient();
|
|
51
51
|
|
|
52
52
|
return useQuery<DialogueModel>({
|
|
53
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
53
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
|
|
54
54
|
queryFn: async ({ queryKey }) => {
|
|
55
55
|
const dialogue = narration.dialogue;
|
|
56
56
|
let text = dialogue?.text;
|
|
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
|
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
const
|
|
92
|
+
const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
|
|
93
93
|
export function useQueryCanGoNext() {
|
|
94
94
|
return useQuery({
|
|
95
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
95
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
|
|
96
96
|
queryFn: async () => narration.canContinue && !narration.isRequiredInput,
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
const
|
|
100
|
+
const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
|
|
101
101
|
export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
|
|
102
102
|
const { t } = useTranslation(["narration"]);
|
|
103
103
|
const normalizedSearch = searchString?.toLowerCase().trim();
|
|
104
104
|
|
|
105
105
|
return useQuery({
|
|
106
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
106
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
|
|
107
107
|
queryFn: async () => {
|
|
108
108
|
const promises = stepHistory.narrativeHistory.map(async (step) => {
|
|
109
109
|
const character = step.dialogue?.character;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
|
|
5
5
|
export function useQuerySaves({ id }: { id: number }) {
|
|
6
6
|
return useQuery({
|
|
7
|
-
queryKey: [
|
|
7
|
+
queryKey: [SAVES_USE_QUERY_KEY, id],
|
|
8
8
|
queryFn: async () => (await getSaveFromIndexDB(id)) || null,
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export const
|
|
12
|
+
export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
|
|
13
13
|
export function useQueryLastSave() {
|
|
14
14
|
return useQuery({
|
|
15
|
-
queryKey: [
|
|
15
|
+
queryKey: [LAST_SAVE_USE_QUERY_KEY],
|
|
16
16
|
queryFn: async () => (await getLastSaveFromIndexDB()) || null,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
2
|
import { getCurrentWindow } from "@tauri-apps/api/window";
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
|
|
5
5
|
|
|
6
6
|
export function useQueryIsFullModeScreen() {
|
|
7
7
|
return useQuery({
|
|
8
|
-
queryKey: [
|
|
8
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
9
9
|
queryFn: async () => {
|
|
10
10
|
if (window.__TAURI__) {
|
|
11
11
|
return getCurrentWindow().isFullscreen();
|
|
@@ -41,3 +41,10 @@ serde = { version = "1", features = ["derive"] }
|
|
|
41
41
|
serde_json = "1"
|
|
42
42
|
steamworks = { version = "0.13", optional = true }
|
|
43
43
|
|
|
44
|
+
[profile.release]
|
|
45
|
+
opt-level = "z" # max runtime performance
|
|
46
|
+
lto = true # link-time optimization — removes dead code across crates
|
|
47
|
+
codegen-units = 1 # slower compile, smaller output
|
|
48
|
+
panic = "abort" # no stack unwinding machinery
|
|
49
|
+
strip = true # strip symbols from the binary
|
|
50
|
+
|
|
@@ -22,7 +22,7 @@ const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
|
|
|
22
22
|
const host = process.env.TAURI_DEV_HOST;
|
|
23
23
|
|
|
24
24
|
// https://vite.dev/config/
|
|
25
|
-
export default defineConfig({
|
|
25
|
+
export default defineConfig(({ mode }) => ({
|
|
26
26
|
plugins: [
|
|
27
27
|
assetpackPlugin(),
|
|
28
28
|
checker({
|
|
@@ -30,7 +30,7 @@ export default defineConfig({
|
|
|
30
30
|
tsconfigPath: "tsconfig.app.json",
|
|
31
31
|
},
|
|
32
32
|
}),
|
|
33
|
-
devtools(),
|
|
33
|
+
mode !== "production" && devtools(),
|
|
34
34
|
tanstackRouter({ target: "react", autoCodeSplitting: true }),
|
|
35
35
|
react(),
|
|
36
36
|
tailwindcss(),
|
|
@@ -142,7 +142,7 @@ export default defineConfig({
|
|
|
142
142
|
ignored: ["**/src-tauri/**"],
|
|
143
143
|
},
|
|
144
144
|
},
|
|
145
|
-
});
|
|
145
|
+
}));
|
|
146
146
|
|
|
147
147
|
function assetpackPlugin(): Plugin {
|
|
148
148
|
let mode: ResolvedConfig["command"];
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { AssetPackConfig } from "@assetpack/core";
|
|
2
2
|
import { pixiPipes } from "@assetpack/core/pixi";
|
|
3
3
|
|
|
4
|
+
// TAURI_ENV_TARGET_TRIPLE is set by `tauri build` before running beforeBuildCommand
|
|
5
|
+
const isTauri = !!process.env.TAURI_ENV_TARGET_TRIPLE;
|
|
6
|
+
|
|
4
7
|
const config: AssetPackConfig = {
|
|
5
8
|
entry: "./src/assets",
|
|
6
9
|
output: "./public/assets",
|
|
@@ -11,6 +14,12 @@ const config: AssetPackConfig = {
|
|
|
11
14
|
output: "src/assets/manifest.gen.json",
|
|
12
15
|
createShortcuts: true,
|
|
13
16
|
},
|
|
17
|
+
// For Tauri: skip @0.5x mipmaps (unused on desktop, WebView handles DPR)
|
|
18
|
+
resolutions: isTauri ? { default: 1 } : undefined,
|
|
19
|
+
// For Tauri: raise WebP quality — files are local so bandwidth is not a concern
|
|
20
|
+
compression: isTauri
|
|
21
|
+
? { png: true, jpg: true, webp: { quality: 88, alphaQuality: 88 } }
|
|
22
|
+
: undefined,
|
|
14
23
|
}),
|
|
15
24
|
],
|
|
16
25
|
};
|
|
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
|
|
|
14
14
|
import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
|
|
15
15
|
import { downloadResourceToTranslate } from "@/lib/i18n";
|
|
16
16
|
import {
|
|
17
|
-
|
|
17
|
+
IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
|
|
18
18
|
useQueryIsFullModeScreen,
|
|
19
19
|
} from "@/lib/query/settings-query";
|
|
20
20
|
import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
|
|
@@ -172,7 +172,7 @@ export function FullScreenSettings() {
|
|
|
172
172
|
promise.finally(() => {
|
|
173
173
|
setLoading(false);
|
|
174
174
|
queryClient.invalidateQueries({
|
|
175
|
-
queryKey: [
|
|
175
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
176
176
|
});
|
|
177
177
|
});
|
|
178
178
|
}}
|
|
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
|
7
7
|
import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
|
|
8
8
|
import { useQueryCanGoBack } from "@/lib/query/narration-query";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
11
|
+
SAVES_USE_QUERY_KEY,
|
|
12
12
|
useQueryLastSave,
|
|
13
13
|
} from "@/lib/query/save-query";
|
|
14
14
|
import { AutoSettings } from "@/lib/stores/auto-settings-store";
|
|
@@ -105,8 +105,8 @@ export function QuickTools() {
|
|
|
105
105
|
className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
|
|
106
106
|
onClick={() => {
|
|
107
107
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
108
|
-
queryClient.setQueryData([
|
|
109
|
-
queryClient.setQueryData([
|
|
108
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
109
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
110
110
|
});
|
|
111
111
|
toast.promise(savePromise, {
|
|
112
112
|
loading: t("saving"),
|
|
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
5
|
import { useQueryInputValue } from "@/lib/query/narration-query";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
LAST_SAVE_USE_QUERY_KEY,
|
|
8
|
+
SAVES_USE_QUERY_KEY,
|
|
9
9
|
useQueryLastSave,
|
|
10
10
|
} from "@/lib/query/save-query";
|
|
11
11
|
import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
|
|
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
|
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
const savePromise = saveGameToIndexDB().then((save) => {
|
|
50
|
-
queryClient.setQueryData([
|
|
51
|
-
queryClient.setQueryData([
|
|
50
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
51
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
52
52
|
});
|
|
53
53
|
toast.promise(savePromise, {
|
|
54
54
|
loading: t("saving"),
|
|
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
|
|
|
2
2
|
import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
|
|
3
3
|
import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
|
|
4
4
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
5
|
-
import {
|
|
5
|
+
import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
|
|
6
6
|
import {
|
|
7
7
|
addRefreshSave,
|
|
8
8
|
deleteSaveFromIndexDB,
|
|
@@ -62,8 +62,8 @@ export function useSaveActions() {
|
|
|
62
62
|
onConfirm: () =>
|
|
63
63
|
deleteSaveFromIndexDB(id)
|
|
64
64
|
.then(() => {
|
|
65
|
-
queryClient.setQueryData([
|
|
66
|
-
queryClient.invalidateQueries({ queryKey: [
|
|
65
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
|
|
66
|
+
queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
|
|
67
67
|
toast.success(t("success_delete"));
|
|
68
68
|
return true;
|
|
69
69
|
})
|
|
@@ -95,8 +95,8 @@ export function useSaveActions() {
|
|
|
95
95
|
id,
|
|
96
96
|
name: tempSaveNameRef.current,
|
|
97
97
|
}).then((save) => {
|
|
98
|
-
queryClient.setQueryData([
|
|
99
|
-
queryClient.setQueryData([
|
|
98
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
99
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
100
100
|
});
|
|
101
101
|
toast.promise(savePromise, {
|
|
102
102
|
loading: t("saving"),
|
|
@@ -138,8 +138,8 @@ export function useSaveActions() {
|
|
|
138
138
|
id,
|
|
139
139
|
name: tempSaveNameRef.current,
|
|
140
140
|
}).then((save) => {
|
|
141
|
-
queryClient.setQueryData([
|
|
142
|
-
queryClient.setQueryData([
|
|
141
|
+
queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
|
|
142
|
+
queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
|
|
143
143
|
});
|
|
144
144
|
toast.promise(savePromise, {
|
|
145
145
|
loading: t("saving"),
|
|
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
|
|
|
3
3
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
|
|
7
7
|
export function useQueryCanGoBack() {
|
|
8
8
|
return useQuery({
|
|
9
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
9
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
|
|
10
10
|
queryFn: async () => stepHistory.canGoBack,
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
|
|
15
15
|
export function useQueryChoiceMenuOptions() {
|
|
16
16
|
const { t } = useTranslation(["narration"]);
|
|
17
17
|
return useQuery({
|
|
18
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
18
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
|
|
19
19
|
queryFn: async () =>
|
|
20
20
|
narration.choices?.map((option) => ({
|
|
21
21
|
...option,
|
|
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
|
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
const
|
|
30
|
+
const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
|
|
31
31
|
export function useQueryInputValue<T>() {
|
|
32
32
|
return useQuery({
|
|
33
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
33
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
|
|
34
34
|
queryFn: async () => ({
|
|
35
35
|
isRequired: narration.isRequiredInput,
|
|
36
36
|
type: narration.inputType,
|
|
@@ -44,13 +44,13 @@ type DialogueModel = {
|
|
|
44
44
|
text?: string;
|
|
45
45
|
character?: CharacterInterface;
|
|
46
46
|
};
|
|
47
|
-
const
|
|
47
|
+
const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
|
|
48
48
|
export function useQueryDialogue() {
|
|
49
49
|
const { t } = useTranslation(["narration"]);
|
|
50
50
|
const queryClient = useQueryClient();
|
|
51
51
|
|
|
52
52
|
return useQuery<DialogueModel>({
|
|
53
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
53
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
|
|
54
54
|
queryFn: async ({ queryKey }) => {
|
|
55
55
|
const dialogue = narration.dialogue;
|
|
56
56
|
let text = dialogue?.text;
|
|
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
|
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
const
|
|
92
|
+
const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
|
|
93
93
|
export function useQueryCanGoNext() {
|
|
94
94
|
return useQuery({
|
|
95
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
95
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
|
|
96
96
|
queryFn: async () => narration.canContinue && !narration.isRequiredInput,
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
const
|
|
100
|
+
const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
|
|
101
101
|
export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
|
|
102
102
|
const { t } = useTranslation(["narration"]);
|
|
103
103
|
const normalizedSearch = searchString?.toLowerCase().trim();
|
|
104
104
|
|
|
105
105
|
return useQuery({
|
|
106
|
-
queryKey: [INTERFACE_DATA_USE_QUERY_KEY,
|
|
106
|
+
queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
|
|
107
107
|
queryFn: async () => {
|
|
108
108
|
const promises = stepHistory.narrativeHistory.map(async (step) => {
|
|
109
109
|
const character = step.dialogue?.character;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
|
|
5
5
|
export function useQuerySaves({ id }: { id: number }) {
|
|
6
6
|
return useQuery({
|
|
7
|
-
queryKey: [
|
|
7
|
+
queryKey: [SAVES_USE_QUERY_KEY, id],
|
|
8
8
|
queryFn: async () => (await getSaveFromIndexDB(id)) || null,
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export const
|
|
12
|
+
export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
|
|
13
13
|
export function useQueryLastSave() {
|
|
14
14
|
return useQuery({
|
|
15
|
-
queryKey: [
|
|
15
|
+
queryKey: [LAST_SAVE_USE_QUERY_KEY],
|
|
16
16
|
queryFn: async () => (await getLastSaveFromIndexDB()) || null,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
2
|
import { getCurrentWindow } from "@tauri-apps/api/window";
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
|
|
5
5
|
|
|
6
6
|
export function useQueryIsFullModeScreen() {
|
|
7
7
|
return useQuery({
|
|
8
|
-
queryKey: [
|
|
8
|
+
queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
|
|
9
9
|
queryFn: async () => {
|
|
10
10
|
if (window.__TAURI__) {
|
|
11
11
|
return getCurrentWindow().isFullscreen();
|
|
@@ -41,3 +41,10 @@ serde = { version = "1", features = ["derive"] }
|
|
|
41
41
|
serde_json = "1"
|
|
42
42
|
steamworks = { version = "0.13", optional = true }
|
|
43
43
|
|
|
44
|
+
[profile.release]
|
|
45
|
+
opt-level = "z" # max runtime performance
|
|
46
|
+
lto = true # link-time optimization — removes dead code across crates
|
|
47
|
+
codegen-units = 1 # slower compile, smaller output
|
|
48
|
+
panic = "abort" # no stack unwinding machinery
|
|
49
|
+
strip = true # strip symbols from the binary
|
|
50
|
+
|
|
@@ -21,7 +21,7 @@ const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
|
|
|
21
21
|
const host = process.env.TAURI_DEV_HOST;
|
|
22
22
|
|
|
23
23
|
// https://vite.dev/config/
|
|
24
|
-
export default defineConfig({
|
|
24
|
+
export default defineConfig(({ mode }) => ({
|
|
25
25
|
plugins: [
|
|
26
26
|
assetpackPlugin(),
|
|
27
27
|
checker({
|
|
@@ -29,7 +29,7 @@ export default defineConfig({
|
|
|
29
29
|
tsconfigPath: "tsconfig.app.json",
|
|
30
30
|
},
|
|
31
31
|
}),
|
|
32
|
-
devtools(),
|
|
32
|
+
mode !== "production" && devtools(),
|
|
33
33
|
tanstackRouter({ target: "react", autoCodeSplitting: true }),
|
|
34
34
|
react(),
|
|
35
35
|
tailwindcss(),
|
|
@@ -136,7 +136,7 @@ export default defineConfig({
|
|
|
136
136
|
ignored: ["**/src-tauri/**"],
|
|
137
137
|
},
|
|
138
138
|
},
|
|
139
|
-
});
|
|
139
|
+
}));
|
|
140
140
|
|
|
141
141
|
function assetpackPlugin(): Plugin {
|
|
142
142
|
let mode: ResolvedConfig["command"];
|