create-pixi-vn 2.0.2 → 2.0.4

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.
Files changed (128) hide show
  1. package/index.js +1 -1
  2. package/package.json +5 -4
  3. package/template-react-vite-muijoy/package-lock.json +4 -4
  4. package/template-react-vite-muijoy/package.json +1 -1
  5. package/template-react-vite-muijoy/src/assets/ink-manifest.gen.json +1 -0
  6. package/template-react-vite-muijoy/src/components/menus/main-menu.tsx +1 -2
  7. package/template-react-vite-muijoy/src/components/menus/save-menu/save-slots.tsx +2 -2
  8. package/template-react-vite-muijoy/src/components/scrrens/narration/narration-cards.tsx +1 -1
  9. package/template-react-vite-muijoy/src/components/ui/image.tsx +7 -38
  10. package/template-react-vite-muijoy/src/content/labels/start.label.ts +2 -4
  11. package/template-react-vite-muijoy/src/pixi-vn-keys.gen.d.ts +20 -0
  12. package/template-react-vite-muijoy/vite.config.ts +1 -0
  13. package/template-react-vite-muijoy-ink/package-lock.json +3 -3
  14. package/template-react-vite-muijoy-ink/package.json +2 -2
  15. package/template-react-vite-muijoy-ink/src/components/menus/save-menu/save-slots.tsx +2 -2
  16. package/template-react-vite-muijoy-ink/src/components/scrrens/narration/narration-cards.tsx +1 -1
  17. package/template-react-vite-muijoy-ink/src/components/ui/image.tsx +7 -38
  18. package/template-react-vite-muijoy-ink/src/pixi-vn-keys.gen.d.ts +22 -0
  19. package/template-react-vite-muijoy-ink/vite.config.ts +1 -0
  20. package/template-react-vite-muijoy-ink-tauri/package-lock.json +3 -3
  21. package/template-react-vite-muijoy-ink-tauri/package.json +2 -2
  22. package/template-react-vite-muijoy-ink-tauri/src/components/menus/save-menu/save-slots.tsx +2 -2
  23. package/template-react-vite-muijoy-ink-tauri/src/components/scrrens/narration/narration-cards.tsx +1 -1
  24. package/template-react-vite-muijoy-ink-tauri/src/components/ui/image.tsx +7 -38
  25. package/template-react-vite-muijoy-ink-tauri/src/pixi-vn-keys.gen.d.ts +22 -0
  26. package/template-react-vite-muijoy-ink-tauri/vite.config.ts +1 -0
  27. package/template-react-vite-muijoy-tauri/package-lock.json +4 -4
  28. package/template-react-vite-muijoy-tauri/package.json +1 -1
  29. package/template-react-vite-muijoy-tauri/src/assets/ink-manifest.gen.json +1 -0
  30. package/template-react-vite-muijoy-tauri/src/components/menus/main-menu.tsx +1 -2
  31. package/template-react-vite-muijoy-tauri/src/components/menus/save-menu/save-slots.tsx +2 -2
  32. package/template-react-vite-muijoy-tauri/src/components/scrrens/narration/narration-cards.tsx +1 -1
  33. package/template-react-vite-muijoy-tauri/src/components/ui/image.tsx +7 -38
  34. package/template-react-vite-muijoy-tauri/src/content/labels/start.label.ts +2 -4
  35. package/template-react-vite-muijoy-tauri/src/pixi-vn-keys.gen.d.ts +20 -0
  36. package/template-react-vite-muijoy-tauri/vite.config.ts +1 -0
  37. package/template-react-vite-muijoy-electron/.eslintrc.cjs +0 -29
  38. package/template-react-vite-muijoy-electron/.vscode/extensions.json +0 -9
  39. package/template-react-vite-muijoy-electron/.vscode/launch.json +0 -32
  40. package/template-react-vite-muijoy-electron/.vscode/settings.json +0 -49
  41. package/template-react-vite-muijoy-electron/README.md +0 -207
  42. package/template-react-vite-muijoy-electron/_gitignore +0 -107
  43. package/template-react-vite-muijoy-electron/forge.config.cts +0 -73
  44. package/template-react-vite-muijoy-electron/forge.env.d.ts +0 -1
  45. package/template-react-vite-muijoy-electron/index.html +0 -13
  46. package/template-react-vite-muijoy-electron/ionic.config.json +0 -7
  47. package/template-react-vite-muijoy-electron/package-lock.json +0 -16984
  48. package/template-react-vite-muijoy-electron/package.json +0 -85
  49. package/template-react-vite-muijoy-electron/public/apple-touch-icon.png +0 -0
  50. package/template-react-vite-muijoy-electron/public/favicon.ico +0 -0
  51. package/template-react-vite-muijoy-electron/public/mask-icon.svg +0 -890
  52. package/template-react-vite-muijoy-electron/public/pixi-vn.svg +0 -23
  53. package/template-react-vite-muijoy-electron/public/pwa-192x192.png +0 -0
  54. package/template-react-vite-muijoy-electron/public/pwa-512x512.png +0 -0
  55. package/template-react-vite-muijoy-electron/public/robots.txt +0 -3
  56. package/template-react-vite-muijoy-electron/src/App.css +0 -42
  57. package/template-react-vite-muijoy-electron/src/App.tsx +0 -16
  58. package/template-react-vite-muijoy-electron/src/AppRoutes.tsx +0 -66
  59. package/template-react-vite-muijoy-electron/src/Home.tsx +0 -27
  60. package/template-react-vite-muijoy-electron/src/Imports.tsx +0 -34
  61. package/template-react-vite-muijoy-electron/src/atoms/autoInfoState.ts +0 -50
  62. package/template-react-vite-muijoy-electron/src/atoms/dialogueCardHeightState.ts +0 -23
  63. package/template-react-vite-muijoy-electron/src/atoms/dialogueCardImageWidthState.ts +0 -23
  64. package/template-react-vite-muijoy-electron/src/atoms/hideInterfaceState.ts +0 -6
  65. package/template-react-vite-muijoy-electron/src/atoms/nextStepLoadingState.ts +0 -6
  66. package/template-react-vite-muijoy-electron/src/atoms/openGameSaveScreenState.ts +0 -6
  67. package/template-react-vite-muijoy-electron/src/atoms/openHistoryScreenState.ts +0 -6
  68. package/template-react-vite-muijoy-electron/src/atoms/openSettingsState.ts +0 -6
  69. package/template-react-vite-muijoy-electron/src/atoms/saveLoadAlertState.ts +0 -26
  70. package/template-react-vite-muijoy-electron/src/atoms/saveScreenPageState.ts +0 -23
  71. package/template-react-vite-muijoy-electron/src/atoms/skipEnabledState.ts +0 -6
  72. package/template-react-vite-muijoy-electron/src/atoms/typewriterDelayState.ts +0 -23
  73. package/template-react-vite-muijoy-electron/src/atoms/typewriterIsAnimatedState.ts +0 -6
  74. package/template-react-vite-muijoy-electron/src/components/ChoiceButton.tsx +0 -19
  75. package/template-react-vite-muijoy-electron/src/components/DragHandleDivider.tsx +0 -40
  76. package/template-react-vite-muijoy-electron/src/components/MenuButton.tsx +0 -37
  77. package/template-react-vite-muijoy-electron/src/components/ModalConfirmation.tsx +0 -70
  78. package/template-react-vite-muijoy-electron/src/components/ModalDialog.tsx +0 -103
  79. package/template-react-vite-muijoy-electron/src/components/NextButton.tsx +0 -94
  80. package/template-react-vite-muijoy-electron/src/components/SettingButton.tsx +0 -44
  81. package/template-react-vite-muijoy-electron/src/components/SliderResizer.tsx +0 -53
  82. package/template-react-vite-muijoy-electron/src/components/TextMenuButton.tsx +0 -41
  83. package/template-react-vite-muijoy-electron/src/components/Typewriter.tsx +0 -335
  84. package/template-react-vite-muijoy-electron/src/components/TypographyShadow.tsx +0 -15
  85. package/template-react-vite-muijoy-electron/src/i18n.ts +0 -29
  86. package/template-react-vite-muijoy-electron/src/index.css +0 -9
  87. package/template-react-vite-muijoy-electron/src/interceptors/EventInterceptor.tsx +0 -49
  88. package/template-react-vite-muijoy-electron/src/interceptors/SkipAutoInterceptor.tsx +0 -67
  89. package/template-react-vite-muijoy-electron/src/main.tsx +0 -39
  90. package/template-react-vite-muijoy-electron/src/models/Character.ts +0 -86
  91. package/template-react-vite-muijoy-electron/src/models/GameSaveData.ts +0 -9
  92. package/template-react-vite-muijoy-electron/src/pixi-vn.d.ts +0 -36
  93. package/template-react-vite-muijoy-electron/src/providers/ThemeProvider.tsx +0 -165
  94. package/template-react-vite-muijoy-electron/src/screens/ChoiceMenu.tsx +0 -130
  95. package/template-react-vite-muijoy-electron/src/screens/GameSaveScreen.tsx +0 -274
  96. package/template-react-vite-muijoy-electron/src/screens/HistoryScreen.tsx +0 -155
  97. package/template-react-vite-muijoy-electron/src/screens/LoadingScreen.tsx +0 -40
  98. package/template-react-vite-muijoy-electron/src/screens/MainMenu.tsx +0 -98
  99. package/template-react-vite-muijoy-electron/src/screens/NarrationScreen.tsx +0 -220
  100. package/template-react-vite-muijoy-electron/src/screens/QuickTools.tsx +0 -168
  101. package/template-react-vite-muijoy-electron/src/screens/Settings.tsx +0 -536
  102. package/template-react-vite-muijoy-electron/src/screens/modals/SaveLoadAlert.tsx +0 -135
  103. package/template-react-vite-muijoy-electron/src/screens/modals/TextInput.tsx +0 -61
  104. package/template-react-vite-muijoy-electron/src/use_query/useQueryInterface.ts +0 -73
  105. package/template-react-vite-muijoy-electron/src/use_query/useQueryLastSave.ts +0 -18
  106. package/template-react-vite-muijoy-electron/src/use_query/useQuerySaves.ts +0 -18
  107. package/template-react-vite-muijoy-electron/src/utilities/actions-utility.ts +0 -10
  108. package/template-react-vite-muijoy-electron/src/utilities/component-utility.ts +0 -25
  109. package/template-react-vite-muijoy-electron/src/utilities/indexedDB-utility.ts +0 -196
  110. package/template-react-vite-muijoy-electron/src/utilities/navigate-utility.ts +0 -18
  111. package/template-react-vite-muijoy-electron/src/utilities/save-utility.ts +0 -125
  112. package/template-react-vite-muijoy-electron/src/values/characters.ts +0 -11
  113. package/template-react-vite-muijoy-electron/src/values/translations/strings_en.json +0 -60
  114. package/template-react-vite-muijoy-electron/src/vite-env.d.ts +0 -4
  115. package/template-react-vite-muijoy-electron/src-electron/icons/icon.icns +0 -0
  116. package/template-react-vite-muijoy-electron/src-electron/icons/icon.ico +0 -0
  117. package/template-react-vite-muijoy-electron/src-electron/icons/icon.png +0 -0
  118. package/template-react-vite-muijoy-electron/src-electron/index.css +0 -7
  119. package/template-react-vite-muijoy-electron/src-electron/main.ts +0 -59
  120. package/template-react-vite-muijoy-electron/src-electron/preload.ts +0 -2
  121. package/template-react-vite-muijoy-electron/src-electron/renderer.ts +0 -31
  122. package/template-react-vite-muijoy-electron/tsconfig.json +0 -32
  123. package/template-react-vite-muijoy-electron/tsconfig.node.json +0 -11
  124. package/template-react-vite-muijoy-electron/vite.base.config.ts +0 -93
  125. package/template-react-vite-muijoy-electron/vite.config.ts +0 -54
  126. package/template-react-vite-muijoy-electron/vite.main.config.ts +0 -9
  127. package/template-react-vite-muijoy-electron/vite.preload.config.ts +0 -9
  128. package/template-react-vite-muijoy-electron/vite.renderer.config.ts +0 -9
@@ -1,536 +0,0 @@
1
- import AutoModeIcon from '@mui/icons-material/AutoMode';
2
- import DarkModeIcon from '@mui/icons-material/DarkMode';
3
- import DownloadIcon from '@mui/icons-material/Download';
4
- import ExitToAppIcon from '@mui/icons-material/ExitToApp';
5
- import FastForwardIcon from '@mui/icons-material/FastForward';
6
- import FileUploadIcon from '@mui/icons-material/FileUpload';
7
- import FolderOpenIcon from '@mui/icons-material/FolderOpen';
8
- import FullscreenIcon from '@mui/icons-material/Fullscreen';
9
- import FullscreenExitIcon from '@mui/icons-material/FullscreenExit';
10
- import HdrAutoIcon from '@mui/icons-material/HdrAuto';
11
- import HistoryIcon from '@mui/icons-material/History';
12
- import LightModeIcon from '@mui/icons-material/LightMode';
13
- import ModeNightIcon from '@mui/icons-material/ModeNight';
14
- import SaveIcon from '@mui/icons-material/Save';
15
- import SaveAsIcon from '@mui/icons-material/SaveAs';
16
- import VisibilityOffIcon from '@mui/icons-material/VisibilityOff';
17
- import WbIncandescentIcon from '@mui/icons-material/WbIncandescent';
18
- import { Box, Button, DialogContent, DialogTitle, Divider, Drawer, FormControl, FormHelperText, FormLabel, IconButton, ModalClose, RadioGroup, Sheet, Slider, Stack, ToggleButtonGroup, Tooltip, Typography, useColorScheme } from "@mui/joy";
19
- import { Theme, useColorScheme as useColorSchemeMaterial, useMediaQuery } from '@mui/material';
20
- import { useQueryClient } from '@tanstack/react-query';
21
- import { useSnackbar } from 'notistack';
22
- import { useEffect, useState } from 'react';
23
- import { Hue, useColor } from "react-color-palette";
24
- import "react-color-palette/css";
25
- import { useTranslation } from 'react-i18next';
26
- import { useLocation } from 'react-router-dom';
27
- import { useRecoilState, useSetRecoilState } from 'recoil';
28
- import { autoInfoState } from '../atoms/autoInfoState';
29
- import { hideInterfaceState } from '../atoms/hideInterfaceState';
30
- import { openGameSaveScreenState } from '../atoms/openGameSaveScreenState';
31
- import { openHistoryScreenState } from '../atoms/openHistoryScreenState';
32
- import { openSettingsState } from '../atoms/openSettingsState';
33
- import { saveLoadAlertState } from '../atoms/saveLoadAlertState';
34
- import { skipEnabledState } from '../atoms/skipEnabledState';
35
- import { typewriterDelayState } from '../atoms/typewriterDelayState';
36
- import ModalDialogCustom from '../components/ModalDialog';
37
- import SettingButton from '../components/SettingButton';
38
- import { useEditColorProvider } from '../providers/ThemeProvider';
39
- import { INTERFACE_DATA_USE_QUEY_KEY } from '../use_query/useQueryInterface';
40
- import useQueryLastSave, { LAST_SAVE_USE_QUEY_KEY } from '../use_query/useQueryLastSave';
41
- import { SAVES_USE_QUEY_KEY } from '../use_query/useQuerySaves';
42
- import { gameEnd } from '../utilities/actions-utility';
43
- import { useMyNavigate } from '../utilities/navigate-utility';
44
- import { downloadGameSave, loadGameSaveFromFile, putSaveIntoIndexDB } from '../utilities/save-utility';
45
-
46
- export default function Settings() {
47
- const [open, setOpen] = useRecoilState(openSettingsState);
48
- const { mode, setMode } = useColorScheme();
49
- const { setMode: setModeMaterial } = useColorSchemeMaterial();
50
- const { primaryColor, setPrimaryColor, setSolidColor, solidColor } = useEditColorProvider()
51
- const [tempColor, setTempColor] = useColor(primaryColor);
52
- const navigate = useMyNavigate();
53
- const location = useLocation();
54
- const [openYouSure, setOpenYouSure] = useState(false)
55
- const [typewriterDelay, setTypewriterDelay] = useRecoilState(typewriterDelayState)
56
- const [fullScreenEnabled, setFullScreenEnabled] = useState(false)
57
- const { t } = useTranslation(["ui"]);
58
- const [skip, setSkip] = useRecoilState(skipEnabledState)
59
- const [auto, setAuto] = useRecoilState(autoInfoState)
60
- const setOpenHistory = useSetRecoilState(openHistoryScreenState);
61
- const setOpenLoadAlert = useSetRecoilState(saveLoadAlertState);
62
- const [hideInterface, setHideInterface] = useRecoilState(hideInterfaceState);
63
- const openSaveScreen = useSetRecoilState(openGameSaveScreenState);
64
- const queryClient = useQueryClient()
65
- const { enqueueSnackbar } = useSnackbar();
66
- const {
67
- data: lastSave = null,
68
- } = useQueryLastSave()
69
- const smScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm'));
70
-
71
- useEffect(() => {
72
- window.addEventListener('keydown', onkeydown);
73
- return () => {
74
- window.removeEventListener('keydown', onkeydown);
75
- };
76
- }, []);
77
-
78
- useEffect(() => {
79
- // Debouncing
80
- let timeout = setTimeout(() => {
81
- setPrimaryColor(tempColor.hex)
82
- }, 50);
83
-
84
- return () => {
85
- clearTimeout(timeout)
86
- }
87
- }, [tempColor]);
88
-
89
- function onkeydown(event: KeyboardEvent) {
90
- if (event.code == 'Escape') {
91
- setOpen((prev) => !prev)
92
- }
93
- }
94
-
95
- return (
96
- <>
97
- <Drawer
98
- // size={'lg'}
99
- variant="plain"
100
- open={open}
101
- onClose={() => setOpen(false)}
102
- sx={{
103
- '& .MuiDrawer-content': {
104
- width: smScreen ? '100%' : 600,
105
- maxWidth: '100%',
106
- },
107
- }}
108
- slotProps={{
109
- content: {
110
- sx: {
111
- bgcolor: 'transparent',
112
- p: { md: 3, sm: 0 },
113
- boxShadow: 'none',
114
- },
115
- },
116
- }}
117
- >
118
- <Sheet
119
- sx={{
120
- borderRadius: 'md',
121
- p: 2,
122
- display: 'flex',
123
- flexDirection: 'column',
124
- gap: 2,
125
- height: '100%',
126
- overflow: 'auto',
127
- }}
128
- >
129
- <DialogTitle>{t("settings")}</DialogTitle>
130
- <ModalClose />
131
- <Divider sx={{ mt: 'auto' }} />
132
- <DialogContent sx={{ gap: 2 }}>
133
- <FormControl>
134
- <RadioGroup>
135
- <Box
136
- sx={{
137
- display: 'grid',
138
- gridTemplateColumns: 'repeat(auto-fill, minmax(140px, 1fr))',
139
- gap: 1.5,
140
- }}
141
- >
142
- <SettingButton
143
- checked={skip}
144
- onClick={() => setSkip((prev) => !prev)}
145
- >
146
- <FastForwardIcon />
147
- <Typography level="title-md">{t("skip")}</Typography>
148
- <Typography
149
- sx={{
150
- position: 'absolute',
151
- top: 10,
152
- right: 10,
153
- }}
154
- level="body-md"
155
- >
156
- Press Space
157
- </Typography>
158
- </SettingButton>
159
- <SettingButton
160
- checked={auto.enabled}
161
- onClick={() => setAuto((prev) => ({
162
- ...prev,
163
- enabled: !prev.enabled
164
- }))}
165
- >
166
- <HdrAutoIcon />
167
- <Typography level="title-md">{t("auto_forward_time_restricted")}</Typography>
168
- </SettingButton>
169
- <SettingButton
170
- onClick={() => {
171
- setOpenHistory(true)
172
- setOpen(false)
173
- }}
174
- >
175
- <HistoryIcon />
176
- <Typography level="title-md">{t("history")}</Typography>
177
- <Typography
178
- sx={{
179
- position: 'absolute',
180
- top: 10,
181
- right: 10,
182
- }}
183
- level="body-md"
184
- >
185
- Shift+H
186
- </Typography>
187
- </SettingButton>
188
- <SettingButton
189
- onClick={() => {
190
- putSaveIntoIndexDB()
191
- .then((save) => {
192
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
193
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
194
- enqueueSnackbar(t("success_save"), { variant: 'success' })
195
- })
196
- .catch(() => {
197
- enqueueSnackbar(t("fail_save"), { variant: 'error' })
198
- })
199
- }}
200
- >
201
- <SaveAsIcon />
202
- <Typography level="title-md">{t("quick_save")}</Typography>
203
- <Typography
204
- sx={{
205
- position: 'absolute',
206
- top: 10,
207
- right: 10,
208
- }}
209
- level="body-md"
210
- >
211
- Shift+S
212
- </Typography>
213
- </SettingButton>
214
- <SettingButton
215
- onClick={() => {
216
- lastSave && setOpenLoadAlert({ open: true, data: lastSave, type: 'load' })
217
- setOpen(false)
218
- }}
219
- disabled={!lastSave}
220
- >
221
- <FileUploadIcon />
222
- <Typography level="title-md">{t("load_last_save")}</Typography>
223
- <Typography
224
- sx={{
225
- position: 'absolute',
226
- top: 10,
227
- right: 10,
228
- }}
229
- level="body-md"
230
- >
231
- Shift+L
232
- </Typography>
233
- </SettingButton>
234
- <SettingButton
235
- onClick={() => {
236
- openSaveScreen(true)
237
- setOpen(false)
238
- }}
239
- >
240
- <SaveIcon />
241
- <Typography level="title-md">{t(`${t("save")}/${t("load")}`)}</Typography>
242
- </SettingButton>
243
- <SettingButton
244
- onClick={() => downloadGameSave()}
245
- >
246
- <DownloadIcon />
247
- <Typography level="title-md">{t("save_to_file")}</Typography>
248
- </SettingButton>
249
- <SettingButton
250
- onClick={() => loadGameSaveFromFile(navigate, () => {
251
- queryClient.invalidateQueries({ queryKey: [INTERFACE_DATA_USE_QUEY_KEY] })
252
- enqueueSnackbar(t("success_load"), { variant: 'success' })
253
- setOpen(false)
254
- })}
255
- >
256
- <FolderOpenIcon />
257
- <Typography level="title-md">{t("load_from_file")}</Typography>
258
- </SettingButton>
259
- <SettingButton
260
- checked={hideInterface}
261
- onClick={() => setHideInterface((prev) => !prev)}
262
- >
263
- <VisibilityOffIcon />
264
- <Typography level="title-md">{t("hide_ui")}</Typography>
265
- <Typography
266
- sx={{
267
- position: 'absolute',
268
- top: 10,
269
- right: 10,
270
- }}
271
- level="body-md"
272
- >
273
- Shift+V
274
- </Typography>
275
- </SettingButton>
276
- </Box>
277
- </RadioGroup>
278
- </FormControl>
279
- <Typography level="title-md" fontWeight="bold">
280
- {t("dialogues")}
281
- </Typography>
282
- <Box>
283
- <FormLabel sx={{ typography: 'title-sm' }}>
284
- {t("text_speed")}
285
- </FormLabel>
286
- <FormHelperText sx={{ typography: 'body-sm' }}>
287
- {t("text_speed_description")}
288
- </FormHelperText>
289
- </Box>
290
- <Box
291
- sx={{
292
- paddingX: 3,
293
- }}
294
- >
295
- <Slider
296
- defaultValue={typewriterDelay}
297
- getAriaValueText={(value) => `${value}ms`}
298
- step={10}
299
- marks={[
300
- {
301
- value: 0,
302
- label: t('off'),
303
- },
304
- {
305
- value: 200,
306
- label: '200ms',
307
- },
308
- ]}
309
- valueLabelDisplay="on"
310
- max={200}
311
- min={0}
312
- valueLabelFormat={(index) => {
313
- if (index === 0) return t('off')
314
- return `${index}ms`
315
- }}
316
-
317
- onChange={(_, value) => {
318
- setTypewriterDelay(value as number || 0)
319
- }}
320
- />
321
- </Box>
322
- <Box>
323
- <FormLabel sx={{ typography: 'title-sm' }}>
324
- {t("auto_forward_time")}
325
- </FormLabel>
326
- <FormHelperText sx={{ typography: 'body-sm' }}>
327
- {t("auto_forward_time_description", { autoName: t("auto_forward_time_restricted"), textSpeedName: t("text_speed") })}
328
- </FormHelperText>
329
- </Box>
330
- <Box
331
- sx={{
332
- paddingX: 3,
333
- }}
334
- >
335
- <Slider
336
- defaultValue={auto.time}
337
- getAriaValueText={(value) => `${value}s`}
338
- step={1}
339
- marks={[
340
- {
341
- value: 1,
342
- label: '1s',
343
- },
344
- {
345
- value: 10,
346
- label: '10s',
347
- },
348
- ]}
349
- valueLabelDisplay="on"
350
- max={10}
351
- min={1}
352
- disabled={!auto}
353
- valueLabelFormat={(index) => index + "s"}
354
- onChange={(_, value) => {
355
- if (value)
356
- setAuto((prev) => ({
357
- ...prev,
358
- time: value as number
359
- }))
360
- }}
361
- />
362
- </Box>
363
-
364
- <Typography level="title-md" fontWeight="bold">
365
- {t("display")}
366
- </Typography>
367
- <Box>
368
- <FormLabel sx={{ typography: 'title-sm' }}>
369
- {t("fullscreen")}
370
- </FormLabel>
371
- <FormHelperText sx={{ typography: 'body-sm' }}>
372
- {t("fullscreen_description")}
373
- </FormHelperText>
374
- </Box>
375
- <Button
376
- onClick={() => {
377
- if (fullScreenEnabled) {
378
- document.exitFullscreen()
379
- setFullScreenEnabled(false)
380
- } else {
381
- document.documentElement.requestFullscreen()
382
- setFullScreenEnabled(true)
383
- }
384
- }}
385
- startDecorator={fullScreenEnabled ? <FullscreenExitIcon /> : <FullscreenIcon />}
386
- >
387
- {fullScreenEnabled ? t('exit_fullscreen') : t('enter_fullscreen')}
388
- </Button>
389
-
390
- <Box>
391
- <FormLabel sx={{ typography: 'title-sm' }}>
392
- {t("theme_mode")}
393
- </FormLabel>
394
- <FormHelperText sx={{ typography: 'body-sm' }}>
395
- {t("theme_mode_description")}
396
- </FormHelperText>
397
- </Box>
398
- <ToggleButtonGroup
399
- value={mode}
400
- onChange={(_, newValue) => {
401
- if (newValue) {
402
- setMode(newValue)
403
- setModeMaterial(newValue)
404
- }
405
- }}
406
- >
407
- <Tooltip title="Light Mode">
408
- <IconButton value="light">
409
- <LightModeIcon />
410
- </IconButton>
411
- </Tooltip>
412
- <Tooltip title="System Mode">
413
- <IconButton value="system">
414
- <AutoModeIcon />
415
- </IconButton>
416
- </Tooltip>
417
- <Tooltip title="Dark Mode">
418
- <IconButton value="dark">
419
- <DarkModeIcon />
420
- </IconButton>
421
- </Tooltip>
422
- </ToggleButtonGroup>
423
-
424
- <Box>
425
- <FormLabel sx={{ typography: 'title-sm' }}>
426
- {t("primary_color")}
427
- </FormLabel>
428
- <FormHelperText sx={{ typography: 'body-sm' }}>
429
- {t("primary_color_description")}
430
- </FormHelperText>
431
- </Box>
432
- <Box
433
- sx={{
434
- paddingX: 3,
435
- }}
436
- >
437
- <Hue
438
- color={tempColor}
439
- onChange={(color) => setTempColor(color)}
440
- />
441
- </Box>
442
-
443
- <Box>
444
- <FormLabel sx={{ typography: 'title-sm' }}>
445
- {t("solid_color")}
446
- </FormLabel>
447
- <FormHelperText sx={{ typography: 'body-sm' }}>
448
- {t("solid_color_description")}
449
- </FormHelperText>
450
- </Box>
451
- <ToggleButtonGroup
452
- value={solidColor}
453
- onChange={(_, newValue) => {
454
- if (newValue)
455
- setSolidColor(newValue)
456
- }}
457
- >
458
- <Tooltip title="White">
459
- <IconButton value="white">
460
- <WbIncandescentIcon />
461
- </IconButton>
462
- </Tooltip>
463
- <Tooltip title="Black">
464
- <IconButton value="black">
465
- <ModeNightIcon />
466
- </IconButton>
467
- </Tooltip>
468
- </ToggleButtonGroup>
469
- <ToggleButtonGroup
470
- color="primary"
471
- variant="solid"
472
- >
473
- <Button>{t("example")}</Button>
474
- </ToggleButtonGroup>
475
- </DialogContent>
476
- {location.pathname !== '/' && <>
477
- <Divider sx={{ mt: 'auto' }} />
478
- <Stack
479
- direction="row"
480
- justifyContent="space-between"
481
- useFlexGap
482
- spacing={1}
483
- >
484
- <Button
485
- variant="outlined"
486
- color="danger"
487
- startDecorator={<ExitToAppIcon />}
488
- onClick={() => setOpenYouSure(true)}
489
- >
490
- {t("return_main_menu")}
491
- </Button>
492
- </Stack>
493
- </>}
494
- </Sheet>
495
- </Drawer>
496
-
497
- <ModalDialogCustom
498
- open={openYouSure}
499
- setOpen={setOpenYouSure}
500
- color='danger'
501
- head={<Typography level="h4"
502
- startDecorator={<ExitToAppIcon />}
503
- >
504
- {t("attention")}
505
- </Typography>}
506
- actions={<>
507
- <Button
508
- key={'exit'}
509
- color='danger'
510
- variant="outlined"
511
- onClick={() => {
512
- gameEnd(navigate)
513
- setOpen(false)
514
- setOpenYouSure(false)
515
- }}
516
- startDecorator={<ExitToAppIcon />}
517
- >
518
- {t("exit")}
519
- </Button>
520
- <Button
521
- key={'cancel'}
522
- color="neutral"
523
- variant="plain"
524
- onClick={() => setOpenYouSure(false)}
525
- >
526
- {t("cancel")}
527
- </Button>
528
- </>}
529
- >
530
- <Typography>
531
- {t("you_sure_to_return_main_menu")}
532
- </Typography>
533
- </ModalDialogCustom>
534
- </>
535
- );
536
- }
@@ -1,135 +0,0 @@
1
- import CloudDownloadIcon from '@mui/icons-material/CloudDownload';
2
- import { Input, Typography } from '@mui/joy';
3
- import { useQueryClient } from '@tanstack/react-query';
4
- import { useSnackbar } from 'notistack';
5
- import { useEffect, useState } from 'react';
6
- import { useTranslation } from 'react-i18next';
7
- import { useRecoilState, useSetRecoilState } from 'recoil';
8
- import { openGameSaveScreenState } from '../../atoms/openGameSaveScreenState';
9
- import { saveLoadAlertState } from '../../atoms/saveLoadAlertState';
10
- import ModalConfirmation from '../../components/ModalConfirmation';
11
- import { INTERFACE_DATA_USE_QUEY_KEY } from '../../use_query/useQueryInterface';
12
- import useQueryLastSave, { LAST_SAVE_USE_QUEY_KEY } from '../../use_query/useQueryLastSave';
13
- import { SAVES_USE_QUEY_KEY } from '../../use_query/useQuerySaves';
14
- import { useMyNavigate } from '../../utilities/navigate-utility';
15
- import { deleteSaveFromIndexDB, loadSave, putSaveIntoIndexDB } from '../../utilities/save-utility';
16
-
17
- export default function SaveLoadAlert() {
18
- const navigate = useMyNavigate();
19
- const [alertData, setAlertData] = useRecoilState(saveLoadAlertState);
20
- const { t } = useTranslation(["ui"]);
21
- const { enqueueSnackbar } = useSnackbar();
22
- const queryClient = useQueryClient()
23
- const [tempSaveName, setTempSaveName] = useState<string>("")
24
- const openGameSaveScreen = useSetRecoilState(openGameSaveScreenState);
25
- const {
26
- data: lastSave = null,
27
- } = useQueryLastSave()
28
-
29
- useEffect(() => {
30
- window.addEventListener('keydown', onkeydown);
31
- return () => {
32
- window.removeEventListener('keydown', onkeydown);
33
- };
34
- }, []);
35
-
36
- useEffect(() => {
37
- if (alertData.open && (alertData.type == "save" || alertData.type == "overwrite_save")) {
38
- setTempSaveName(alertData.deafultName || "")
39
- }
40
- }, [alertData])
41
-
42
- function onkeydown(event: KeyboardEvent) {
43
- if (event.code == 'KeyS' && event.shiftKey) {
44
- putSaveIntoIndexDB()
45
- .then((save) => {
46
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
47
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save)
48
- enqueueSnackbar(t("success_save"), { variant: 'success' })
49
- })
50
- .catch(() => {
51
- enqueueSnackbar(t("fail_save"), { variant: 'error' })
52
- })
53
- }
54
- else if (event.code == 'KeyL' && event.shiftKey) {
55
- setAlertData((prev) => {
56
- if (!prev.open || !lastSave) {
57
- return { ...prev, open: false }
58
- }
59
- return { open: true, data: lastSave, type: 'load' }
60
- })
61
- }
62
- }
63
-
64
- return (
65
- <ModalConfirmation
66
- open={alertData.open}
67
- setOpen={() => setAlertData((prev) => { return { ...prev, open: false } })}
68
- color="primary"
69
- head={<Typography level="h4"
70
- startDecorator={<CloudDownloadIcon />}
71
- >
72
- {alertData.type == "load" && t("load")}
73
- {alertData.type == "delete" && t("delete")}
74
- {(alertData.type == "save" || alertData.type == "overwrite_save") && t("save")}
75
- </Typography>}
76
- onConfirm={() => {
77
- if (!alertData.open) {
78
- return false
79
- }
80
- switch (alertData.type) {
81
- case "load":
82
- return loadSave(alertData.data, navigate)
83
- .then(() => {
84
- queryClient.invalidateQueries({ queryKey: [INTERFACE_DATA_USE_QUEY_KEY] })
85
- enqueueSnackbar(t("success_load"), { variant: 'success' })
86
- openGameSaveScreen(false)
87
- return true
88
- })
89
- .catch((e) => {
90
- enqueueSnackbar(t("fail_load"), { variant: 'error' })
91
- console.error(e)
92
- return false
93
- })
94
- case "delete":
95
- return deleteSaveFromIndexDB(alertData.data)
96
- .then(() => {
97
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, alertData.data], null);
98
- queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUEY_KEY] })
99
- enqueueSnackbar(t("success_delete"), { variant: 'success' })
100
- return true
101
- })
102
- .catch((e) => {
103
- enqueueSnackbar(t("fail_delete"), { variant: 'error' })
104
- console.error(e)
105
- return false
106
- })
107
- case "save":
108
- case "overwrite_save":
109
- return putSaveIntoIndexDB({ id: alertData.data, name: tempSaveName })
110
- .then((save) => {
111
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
112
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save)
113
- enqueueSnackbar(t("success_save"), { variant: 'success' })
114
- return true
115
- })
116
- .catch((e) => {
117
- enqueueSnackbar(t("fail_save"), { variant: 'error' })
118
- console.error(e)
119
- return false
120
- })
121
- }
122
- }}
123
- >
124
- <Typography>
125
- {alertData.type == "load" && t("you_sure_to_load_save", { name: alertData.data.name || `${t("save_slot")} ${alertData.data.id}` })}
126
- {alertData.type == "delete" && t("you_sure_to_delete_save", { name: `${t("save_slot")} ${alertData.data}` })}
127
- {(alertData.type == "save" || alertData.type == "overwrite_save") && t("save_as")}
128
- </Typography>
129
- {(alertData.type == "save" || alertData.type == "overwrite_save") && <Input
130
- value={tempSaveName}
131
- onChange={(e) => setTempSaveName(e.target.value)}
132
- />}
133
- </ModalConfirmation>
134
- );
135
- }