대시보드 배너/타이틀 중앙정렬 + 타일 UI 편집(드래그 이동/크기조절) + 로그인 유지 기능 추가
- 이름/부제, "스마트 관리 시스템 메뉴" 제목을 중앙 정렬 - 타일을 1x1~4x4 크기로 자유 배치할 수 있는 편집 모드 추가 (6x4 캔버스, 삼성 One UI 위젯 편집 방식) - 타일 배치는 계정별로 서버에 저장/복원 (dashboard_layout_controller.dart) - 설정 화면(톱니바퀴 아이콘) > "UI 편집" 진입점 추가 - shared_preferences로 로그인 유지 기능 추가 (비밀번호는 저장하지 않음) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
// 🔐 "로그인 유지" 기능. 로그인 성공 시 계정 정보를 기기에 저장해두고,
|
||||
// 다음 실행 때 로그인 화면을 건너뛰고 바로 대시보드로 들어가게 한다.
|
||||
// (서버에 별도 세션/토큰 개념이 없어서, 비밀번호는 저장하지 않고 신원 정보만 저장한다.)
|
||||
import 'dart:convert';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class SavedSession {
|
||||
final String userId;
|
||||
final String userName;
|
||||
final String role;
|
||||
final bool isDeviceMatched;
|
||||
|
||||
const SavedSession({
|
||||
required this.userId,
|
||||
required this.userName,
|
||||
required this.role,
|
||||
required this.isDeviceMatched,
|
||||
});
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'userId': userId,
|
||||
'userName': userName,
|
||||
'role': role,
|
||||
'isDeviceMatched': isDeviceMatched,
|
||||
};
|
||||
|
||||
factory SavedSession.fromJson(Map<String, dynamic> json) => SavedSession(
|
||||
userId: json['userId'] as String,
|
||||
userName: json['userName'] as String,
|
||||
role: json['role'] as String,
|
||||
isDeviceMatched: json['isDeviceMatched'] as bool? ?? true,
|
||||
);
|
||||
}
|
||||
|
||||
class SessionStore {
|
||||
static const _key = 'saved_session_v1';
|
||||
|
||||
static Future<void> save(SavedSession session) async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString(_key, jsonEncode(session.toJson()));
|
||||
} catch (_) {
|
||||
// 저장 실패해도 로그인 자체는 계속 진행 (로그인 유지만 안 될 뿐).
|
||||
}
|
||||
}
|
||||
|
||||
static Future<SavedSession?> load() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final raw = prefs.getString(_key);
|
||||
if (raw == null) return null;
|
||||
return SavedSession.fromJson(jsonDecode(raw));
|
||||
} catch (_) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static Future<void> clear() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.remove(_key);
|
||||
} catch (_) {
|
||||
// 무시 - 어차피 로그아웃 화면으로는 이동한다.
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user