Skip to content

Commit 4418cdc

Browse files
TinyKittenclaude
andauthored
チューニング設定の全項目をAsyncStorageで永続化し、テレメトリ有効時の確認アラートを削除 (#5587)
https://claude.ai/code/session_01JR8c8hRFxj73aLTZkFHmcR Co-authored-by: Claude <noreply@anthropic.com>
1 parent 7f87ca5 commit 4418cdc

File tree

3 files changed

+94
-44
lines changed

3 files changed

+94
-44
lines changed

src/components/Permitted.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,10 @@ const PermittedLayout: React.FC<Props> = ({ children }: Props) => {
306306
ttsEnabledLanguagesStr,
307307
telemetryEnabledStr,
308308
devOverlayEnabledStr,
309+
headerTransitionIntervalStr,
310+
headerTransitionDelayStr,
311+
bottomTransitionIntervalStr,
312+
untouchableModeEnabledStr,
309313
] = await Promise.all([
310314
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.PREVIOUS_THEME),
311315
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.ENABLED_LANGUAGES),
@@ -314,6 +318,10 @@ const PermittedLayout: React.FC<Props> = ({ children }: Props) => {
314318
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.TTS_ENABLED_LANGUAGES),
315319
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.TELEMETRY_ENABLED),
316320
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.DEV_OVERLAY_ENABLED),
321+
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.HEADER_TRANSITION_INTERVAL),
322+
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.HEADER_TRANSITION_DELAY),
323+
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.BOTTOM_TRANSITION_INTERVAL),
324+
AsyncStorage.getItem(ASYNC_STORAGE_KEYS.UNTOUCHABLE_MODE_ENABLED),
317325
]);
318326

319327
if (prevThemeKey) {
@@ -371,6 +379,39 @@ const PermittedLayout: React.FC<Props> = ({ children }: Props) => {
371379
devOverlayEnabled: devOverlayEnabledStr === 'true',
372380
}));
373381
}
382+
if (headerTransitionIntervalStr) {
383+
const parsed = Number(headerTransitionIntervalStr);
384+
if (!Number.isNaN(parsed)) {
385+
setTuning((prev) => ({
386+
...prev,
387+
headerTransitionInterval: parsed,
388+
}));
389+
}
390+
}
391+
if (headerTransitionDelayStr) {
392+
const parsed = Number(headerTransitionDelayStr);
393+
if (!Number.isNaN(parsed)) {
394+
setTuning((prev) => ({
395+
...prev,
396+
headerTransitionDelay: parsed,
397+
}));
398+
}
399+
}
400+
if (bottomTransitionIntervalStr) {
401+
const parsed = Number(bottomTransitionIntervalStr);
402+
if (!Number.isNaN(parsed)) {
403+
setTuning((prev) => ({
404+
...prev,
405+
bottomTransitionInterval: parsed,
406+
}));
407+
}
408+
}
409+
if (untouchableModeEnabledStr) {
410+
setTuning((prev) => ({
411+
...prev,
412+
untouchableModeEnabled: untouchableModeEnabledStr === 'true',
413+
}));
414+
}
374415
};
375416

376417
loadSettings();

src/components/TuningSettings.tsx

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -141,31 +141,40 @@ const TuningSettings: React.FC = () => {
141141
const parseNumberFromText = (prev: number, text: string) =>
142142
Number.isNaN(Number(text)) ? prev : Number(text);
143143

144-
const handleHeaderIntervalChange = (text: string) =>
144+
const handleHeaderIntervalChange = (text: string) => {
145+
const value = parseNumberFromText(settings.headerTransitionInterval, text);
145146
setSettings((prev) => ({
146147
...prev,
147-
headerTransitionInterval: parseNumberFromText(
148-
prev.headerTransitionInterval,
149-
text
150-
),
148+
headerTransitionInterval: value,
151149
}));
152-
const handleHeaderDelayChange = (text: string) =>
150+
AsyncStorage.setItem(
151+
ASYNC_STORAGE_KEYS.HEADER_TRANSITION_INTERVAL,
152+
String(value)
153+
);
154+
};
155+
const handleHeaderDelayChange = (text: string) => {
156+
const value = parseNumberFromText(settings.headerTransitionDelay, text);
153157
setSettings((prev) => ({
154158
...prev,
155-
headerTransitionDelay: parseNumberFromText(
156-
prev.headerTransitionDelay,
157-
text
158-
),
159+
headerTransitionDelay: value,
159160
}));
161+
AsyncStorage.setItem(
162+
ASYNC_STORAGE_KEYS.HEADER_TRANSITION_DELAY,
163+
String(value)
164+
);
165+
};
160166

161-
const handleBottomDelayChange = (text: string) =>
167+
const handleBottomDelayChange = (text: string) => {
168+
const value = parseNumberFromText(settings.bottomTransitionInterval, text);
162169
setSettings((prev) => ({
163170
...prev,
164-
bottomTransitionInterval: parseNumberFromText(
165-
prev.bottomTransitionInterval,
166-
text
167-
),
171+
bottomTransitionInterval: value,
168172
}));
173+
AsyncStorage.setItem(
174+
ASYNC_STORAGE_KEYS.BOTTOM_TRANSITION_INTERVAL,
175+
String(value)
176+
);
177+
};
169178

170179
const [voicePickerState, setVoicePickerState] = useState<{
171180
current: string;
@@ -199,44 +208,40 @@ const TuningSettings: React.FC = () => {
199208
AsyncStorage.setItem(ASYNC_STORAGE_KEYS.TTS_EN_VOICE_NAME, voice);
200209
};
201210

202-
const toggleDevOverlayEnabled = () =>
211+
const toggleDevOverlayEnabled = () => {
212+
const nextValue = !settings.devOverlayEnabled;
203213
setSettings((prev) => ({
204214
...prev,
205-
devOverlayEnabled: !prev.devOverlayEnabled,
215+
devOverlayEnabled: nextValue,
206216
}));
217+
AsyncStorage.setItem(
218+
ASYNC_STORAGE_KEYS.DEV_OVERLAY_ENABLED,
219+
String(nextValue)
220+
);
221+
};
207222

208-
const toggleUntouchableModeEnabled = () =>
223+
const toggleUntouchableModeEnabled = () => {
224+
const nextValue = !settings.untouchableModeEnabled;
209225
setSettings((prev) => ({
210226
...prev,
211-
untouchableModeEnabled: !prev.untouchableModeEnabled,
227+
untouchableModeEnabled: nextValue,
212228
}));
229+
AsyncStorage.setItem(
230+
ASYNC_STORAGE_KEYS.UNTOUCHABLE_MODE_ENABLED,
231+
String(nextValue)
232+
);
233+
};
213234

214235
const toggleTelemetryEnabled = () => {
215-
if (settings.telemetryEnabled) {
216-
AsyncStorage.setItem(ASYNC_STORAGE_KEYS.TELEMETRY_ENABLED, 'false');
217-
setSettings((prev) => ({
218-
...prev,
219-
telemetryEnabled: !prev.telemetryEnabled,
220-
}));
221-
return;
222-
}
223-
224-
Alert.alert(translate('notice'), translate('telemetrySettingWillPersist'), [
225-
{
226-
text: 'OK',
227-
onPress: () => {
228-
AsyncStorage.setItem(ASYNC_STORAGE_KEYS.TELEMETRY_ENABLED, 'true');
229-
setSettings((prev) => ({
230-
...prev,
231-
telemetryEnabled: !prev.telemetryEnabled,
232-
}));
233-
},
234-
},
235-
{
236-
text: translate('cancel'),
237-
style: 'cancel',
238-
},
239-
]);
236+
const nextValue = !settings.telemetryEnabled;
237+
setSettings((prev) => ({
238+
...prev,
239+
telemetryEnabled: nextValue,
240+
}));
241+
AsyncStorage.setItem(
242+
ASYNC_STORAGE_KEYS.TELEMETRY_ENABLED,
243+
String(nextValue)
244+
);
240245
};
241246

242247
return (

src/constants/asyncStorage.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ export const ASYNC_STORAGE_KEYS = {
2020
DEV_OVERLAY_ENABLED: '@TrainLCD:devOverlayEnabled',
2121
TTS_JA_VOICE_NAME: '@TrainLCD:ttsJaVoiceName',
2222
TTS_EN_VOICE_NAME: '@TrainLCD:ttsEnVoiceName',
23+
HEADER_TRANSITION_INTERVAL: '@TrainLCD:headerTransitionInterval',
24+
HEADER_TRANSITION_DELAY: '@TrainLCD:headerTransitionDelay',
25+
BOTTOM_TRANSITION_INTERVAL: '@TrainLCD:bottomTransitionInterval',
26+
UNTOUCHABLE_MODE_ENABLED: '@TrainLCD:untouchableModeEnabled',
2327
WALKTHROUGH_COMPLETED: '@TrainLCD:walkthroughCompleted',
2428
ROUTE_SEARCH_WALKTHROUGH_COMPLETED:
2529
'@TrainLCD:routeSearchWalkthroughCompleted',

0 commit comments

Comments
 (0)