forked from baron/baron-sso
세션정보 누락 해결.
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
import 'package:descope/descope.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
@@ -43,6 +42,55 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||
bool _isCodeSent = false;
|
||||
bool _isVerifying = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_nameFocus.addListener(_onNameFocusChange);
|
||||
_departmentFocus.addListener(_onDepartmentFocusChange);
|
||||
_phoneFocus.addListener(_onPhoneFocusChange);
|
||||
_phoneCodeFocus.addListener(_onPhoneCodeFocusChange);
|
||||
}
|
||||
|
||||
void _onNameFocusChange() {
|
||||
if (!mounted) return;
|
||||
if (!_nameFocus.hasFocus && _nameTouched) {
|
||||
final profile = ref.read(profileProvider).value ?? _cachedProfile;
|
||||
if (profile != null) _autoSaveIfEditing(profile, 'name');
|
||||
} else if (_nameFocus.hasFocus) {
|
||||
_nameTouched = true;
|
||||
}
|
||||
}
|
||||
|
||||
void _onDepartmentFocusChange() {
|
||||
if (!mounted) return;
|
||||
if (!_departmentFocus.hasFocus && _departmentTouched) {
|
||||
final profile = ref.read(profileProvider).value ?? _cachedProfile;
|
||||
if (profile != null) _autoSaveIfEditing(profile, 'department');
|
||||
} else if (_departmentFocus.hasFocus) {
|
||||
_departmentTouched = true;
|
||||
}
|
||||
}
|
||||
|
||||
void _onPhoneFocusChange() {
|
||||
if (!mounted) return;
|
||||
if (!_phoneFocus.hasFocus && _phoneTouched) {
|
||||
final profile = ref.read(profileProvider).value ?? _cachedProfile;
|
||||
if (profile != null) _handlePhoneFocusChange(profile);
|
||||
} else if (_phoneFocus.hasFocus) {
|
||||
_phoneTouched = true;
|
||||
}
|
||||
}
|
||||
|
||||
void _onPhoneCodeFocusChange() {
|
||||
if (!mounted) return;
|
||||
if (!_phoneCodeFocus.hasFocus && _phoneCodeTouched) {
|
||||
final profile = ref.read(profileProvider).value ?? _cachedProfile;
|
||||
if (profile != null) _handlePhoneFocusChange(profile);
|
||||
} else if (_phoneCodeFocus.hasFocus) {
|
||||
_phoneCodeTouched = true;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_nameController?.dispose();
|
||||
@@ -57,7 +105,6 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||
}
|
||||
|
||||
Future<void> _logout() async {
|
||||
Descope.sessionManager.clearSession();
|
||||
AuthTokenStore.clear();
|
||||
AuthNotifier.instance.notify();
|
||||
}
|
||||
@@ -532,40 +579,14 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Focus(
|
||||
child: TextField(
|
||||
controller: controller,
|
||||
focusNode: field == 'name' ? _nameFocus : _departmentFocus,
|
||||
onFocusChange: (hasFocus) {
|
||||
if (field == 'name') {
|
||||
if (hasFocus) {
|
||||
_nameTouched = true;
|
||||
return;
|
||||
}
|
||||
if (!_nameTouched) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (field == 'department') {
|
||||
if (hasFocus) {
|
||||
_departmentTouched = true;
|
||||
return;
|
||||
}
|
||||
if (!_departmentTouched) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!hasFocus) {
|
||||
_autoSaveIfEditing(profile, field);
|
||||
}
|
||||
},
|
||||
child: TextField(
|
||||
controller: controller,
|
||||
focusNode: field == 'name' ? _nameFocus : _departmentFocus,
|
||||
textInputAction: TextInputAction.done,
|
||||
onSubmitted: (_) => _autoSaveIfEditing(profile, field),
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(),
|
||||
hintText: label,
|
||||
),
|
||||
textInputAction: TextInputAction.done,
|
||||
onSubmitted: (_) => _autoSaveIfEditing(profile, field),
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(),
|
||||
hintText: label,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -605,35 +626,20 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Focus(
|
||||
child: TextField(
|
||||
controller: _phoneController,
|
||||
focusNode: _phoneFocus,
|
||||
onFocusChange: (hasFocus) {
|
||||
if (hasFocus) {
|
||||
_phoneTouched = true;
|
||||
return;
|
||||
}
|
||||
if (!_phoneTouched) {
|
||||
return;
|
||||
}
|
||||
if (!hasFocus) {
|
||||
_handlePhoneFocusChange(profile);
|
||||
}
|
||||
},
|
||||
child: TextField(
|
||||
controller: _phoneController,
|
||||
focusNode: _phoneFocus,
|
||||
keyboardType: TextInputType.phone,
|
||||
textInputAction: TextInputAction.done,
|
||||
onSubmitted: (_) => _autoSaveIfEditing(profile, 'phone'),
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(),
|
||||
hintText: '01012345678',
|
||||
suffixIcon: _isPhoneVerified
|
||||
? const Icon(Icons.check_circle, color: Colors.green)
|
||||
: null,
|
||||
),
|
||||
enabled: !_isPhoneVerified,
|
||||
keyboardType: TextInputType.phone,
|
||||
textInputAction: TextInputAction.done,
|
||||
onSubmitted: (_) => _autoSaveIfEditing(profile, 'phone'),
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(),
|
||||
hintText: '01012345678',
|
||||
suffixIcon: _isPhoneVerified
|
||||
? const Icon(Icons.check_circle, color: Colors.green)
|
||||
: null,
|
||||
),
|
||||
enabled: !_isPhoneVerified,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
@@ -655,30 +661,15 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Focus(
|
||||
child: TextField(
|
||||
controller: _codeController,
|
||||
focusNode: _phoneCodeFocus,
|
||||
onFocusChange: (hasFocus) {
|
||||
if (hasFocus) {
|
||||
_phoneCodeTouched = true;
|
||||
return;
|
||||
}
|
||||
if (!_phoneCodeTouched) {
|
||||
return;
|
||||
}
|
||||
if (!hasFocus) {
|
||||
_handlePhoneFocusChange(profile);
|
||||
}
|
||||
},
|
||||
child: TextField(
|
||||
controller: _codeController,
|
||||
focusNode: _phoneCodeFocus,
|
||||
keyboardType: TextInputType.number,
|
||||
textInputAction: TextInputAction.done,
|
||||
onSubmitted: (_) => _verifyCode(profile),
|
||||
decoration: const InputDecoration(
|
||||
border: OutlineInputBorder(),
|
||||
hintText: '인증번호 6자리',
|
||||
),
|
||||
keyboardType: TextInputType.number,
|
||||
textInputAction: TextInputAction.done,
|
||||
onSubmitted: (_) => _verifyCode(profile),
|
||||
decoration: const InputDecoration(
|
||||
border: OutlineInputBorder(),
|
||||
hintText: '인증번호 6자리',
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user