diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2071b9e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요. + // 기존 특성에 대한 설명을 보려면 가리킵니다. + // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요. + "version": "0.2.0", + "configurations": [ + { + "name": "Flutter", + "request": "launch", + "type": "dart" + }, + { + "name": "Flutter (profile mode)", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "Flutter (release mode)", + "request": "launch", + "type": "dart", + "flutterMode": "release" + } + ] +} \ No newline at end of file diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 6f56801..0000000 --- a/android/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -**/*.keystore -**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index f56b525..0000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,72 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - namespace "com.example.suwon" - compileSdkVersion flutter.compileSdkVersion - ndkVersion flutter.ndkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.suwon" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index d1d507c..0000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/android/app/src/main/kotlin/com/example/suwon/MainActivity.kt b/android/app/src/main/kotlin/com/example/suwon/MainActivity.kt deleted file mode 100644 index 3cd393e..0000000 --- a/android/app/src/main/kotlin/com/example/suwon/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.suwon - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index f74085f..0000000 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4..0000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b7..0000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391..0000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d..0000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372e..0000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 06952be..0000000 --- a/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index cb1ef88..0000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index f7eb7f6..0000000 --- a/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index 94adc3a..0000000 --- a/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 3c472b9..0000000 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index 44e62bc..0000000 --- a/android/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -include ':app' - -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() - -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } - -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/assets/Exit.svg b/assets/Exit.svg new file mode 100644 index 0000000..1d96145 --- /dev/null +++ b/assets/Exit.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/asstes/Group.png b/assets/Group.png similarity index 100% rename from asstes/Group.png rename to assets/Group.png diff --git a/asstes/Icon_menu.svg b/assets/Icon_menu.svg similarity index 100% rename from asstes/Icon_menu.svg rename to assets/Icon_menu.svg diff --git a/assets/Report button.svg b/assets/Report button.svg new file mode 100644 index 0000000..8fd0751 --- /dev/null +++ b/assets/Report button.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/asstes/SUCHAT.png b/assets/SUCHAT.png similarity index 100% rename from asstes/SUCHAT.png rename to assets/SUCHAT.png diff --git a/assets/User.svg b/assets/User.svg new file mode 100644 index 0000000..212264e --- /dev/null +++ b/assets/User.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/asstes/Vector6.png b/assets/Vector6.png similarity index 100% rename from asstes/Vector6.png rename to assets/Vector6.png diff --git a/asstes/bubble.png b/assets/bubble.png similarity index 100% rename from asstes/bubble.png rename to assets/bubble.png diff --git a/asstes/bubble_main.PNG b/assets/bubble_main.PNG similarity index 100% rename from asstes/bubble_main.PNG rename to assets/bubble_main.PNG diff --git a/asstes/close.png b/assets/close.png similarity index 100% rename from asstes/close.png rename to assets/close.png diff --git a/asstes/feedback.svg b/assets/feedback.svg similarity index 100% rename from asstes/feedback.svg rename to assets/feedback.svg diff --git a/asstes/font/KCC-Chassam.otf b/assets/font/KCC-Chassam.otf similarity index 100% rename from asstes/font/KCC-Chassam.otf rename to assets/font/KCC-Chassam.otf diff --git a/asstes/font/KCC-Chassam.ttf b/assets/font/KCC-Chassam.ttf similarity index 100% rename from asstes/font/KCC-Chassam.ttf rename to assets/font/KCC-Chassam.ttf diff --git a/asstes/font/Pretendard-Light.ttf b/assets/font/Pretendard-Light.ttf similarity index 100% rename from asstes/font/Pretendard-Light.ttf rename to assets/font/Pretendard-Light.ttf diff --git a/asstes/font/Pretendard-Regular.ttf b/assets/font/Pretendard-Regular.ttf similarity index 100% rename from asstes/font/Pretendard-Regular.ttf rename to assets/font/Pretendard-Regular.ttf diff --git a/asstes/font/Pretendard-SemiBold.ttf b/assets/font/Pretendard-SemiBold.ttf similarity index 100% rename from asstes/font/Pretendard-SemiBold.ttf rename to assets/font/Pretendard-SemiBold.ttf diff --git a/asstes/logout.svg b/assets/logout.svg similarity index 100% rename from asstes/logout.svg rename to assets/logout.svg diff --git a/assets/offchatbt.svg b/assets/offchatbt.svg new file mode 100644 index 0000000..43a66b8 --- /dev/null +++ b/assets/offchatbt.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/onchatbt.svg b/assets/onchatbt.svg new file mode 100644 index 0000000..27b8150 --- /dev/null +++ b/assets/onchatbt.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/asstes/onclikmenu.svg b/assets/onclikmenu.svg similarity index 100% rename from asstes/onclikmenu.svg rename to assets/onclikmenu.svg diff --git a/asstes/policy.svg b/assets/policy.svg similarity index 100% rename from asstes/policy.svg rename to assets/policy.svg diff --git a/asstes/profile.svg b/assets/profile.svg similarity index 100% rename from asstes/profile.svg rename to assets/profile.svg diff --git a/asstes/vector.svg b/assets/vector.svg similarity index 100% rename from asstes/vector.svg rename to assets/vector.svg diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5ff8545..960c3b7 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -168,7 +168,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e42adcb..87131a0 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ LoginViewModel()), + ChangeNotifierProvider(create: (context) => LoginVM()), ChangeNotifierProvider( - create: (context) => SignupViewModel()), // 추가: SignupViewModel 제공 - ChangeNotifierProvider( - create: (context) => AccountRecoveryViewModel()), + create: (context) => SignupVM()), // 추가: SignupViewModel 제공 + ChangeNotifierProvider(create: (context) => AccountRecoveryVM()), + ChangeNotifierProvider(create: (context) => ChatViewModel()), ], child: MaterialApp( debugShowCheckedModeBanner: false, - home: NewLoignMain(), + home: LoginScreen(), ), ); } diff --git a/lib/models/chat_model.dart b/lib/models/chat_model.dart new file mode 100644 index 0000000..52c6db1 --- /dev/null +++ b/lib/models/chat_model.dart @@ -0,0 +1,23 @@ +class Message { + final String roomId; + final String sender; + final String contents; + + Message({required this.roomId, required this.sender, required this.contents}); + + factory Message.fromJson(Map json) { + return Message( + roomId: json['roomId'], + sender: json['sender'], + contents: json['contents'], + ); + } + + Map toJson() { + return { + 'roomId': roomId, + 'sender': sender, + 'contents': contents, + }; + } +} diff --git a/lib/models/user_model.dart b/lib/models/user_model.dart index a395fed..5376f71 100644 --- a/lib/models/user_model.dart +++ b/lib/models/user_model.dart @@ -1,11 +1,9 @@ class UserModel { - final String id; - final String password; - final String email; + final String account, password, email, nickname; - UserModel({ - required this.id, - required this.password, - required this.email, - }); + UserModel.fromJson(Map json) + : account = json["account"], + password = json["password"], + email = json["email"], + nickname = json["nickname"]; } diff --git a/lib/viewmodels/AccountRecovery_viewmodel.dart b/lib/viewmodels/AccountRecoveryVM.dart similarity index 94% rename from lib/viewmodels/AccountRecovery_viewmodel.dart rename to lib/viewmodels/AccountRecoveryVM.dart index 0b92b54..1b12018 100644 --- a/lib/viewmodels/AccountRecovery_viewmodel.dart +++ b/lib/viewmodels/AccountRecoveryVM.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; -class AccountRecoveryViewModel extends ChangeNotifier { +class AccountRecoveryVM extends ChangeNotifier { String _id = ''; String _password = ''; String _email = ''; String _validationCode = ''; - bool _idError = false; bool _pwError = false; bool _emailError = false; @@ -20,7 +19,6 @@ class AccountRecoveryViewModel extends ChangeNotifier { TextEditingController pwMatchController = TextEditingController(); TextEditingController ValidationCodeController = TextEditingController(); - bool get idError => _idError; bool get pwError => _pwError; bool get emailError => _emailError; @@ -78,7 +76,7 @@ class AccountRecoveryViewModel extends ChangeNotifier { bool validateEmail(String value) { final RegExp emailRegExp = - RegExp(r'^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$'); + RegExp(r'^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$'); _isEmailValid = emailRegExp.hasMatch(value); notifyListeners(); return _isEmailValid; @@ -90,11 +88,11 @@ class AccountRecoveryViewModel extends ChangeNotifier { // String email = _email; print('eamil: $email'); - } } + Future Search_PW() async { - if(validateEmail(_email)&& !_idError) { + if (validateEmail(_email) && !_idError) { // 이메일 및 ID 검증 // 인증코드 전송 및 검증 String id = _id; @@ -106,4 +104,4 @@ class AccountRecoveryViewModel extends ChangeNotifier { print('validationCode = $validationCode'); } } -} \ No newline at end of file +} diff --git a/lib/viewmodels/ChattingVM.dart b/lib/viewmodels/ChattingVM.dart new file mode 100644 index 0000000..5bf7efe --- /dev/null +++ b/lib/viewmodels/ChattingVM.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:stomp_dart_client/stomp.dart'; +import 'package:stomp_dart_client/stomp_config.dart'; +import 'package:stomp_dart_client/stomp_frame.dart'; +import 'dart:convert'; +import 'package:suwon/models/chat_model.dart'; + +class ChatViewModel extends ChangeNotifier { + StompClient? client; + String serverUrl = 'ws://43.202.91.160:8080/stomp'; + String sendEndpoint = '/pub/chat/message/1234'; + List chatMessages = []; + + ChatViewModel() { + client = StompClient( + config: StompConfig( + url: serverUrl, + onConnect: onConnect, + onWebSocketError: (dynamic error) => print(error.toString()), + ), + ); + } + + void initialize() { + client!.activate(); + } + + void onConnect(StompFrame frame) { + client!.subscribe( + destination: '/sub/chat/room/1234', + callback: (StompFrame frame) { + if (frame.body != null) { + Map jsonData = json.decode(frame.body!); + Message message = Message.fromJson(jsonData); + chatMessages.add(message); + notifyListeners(); // 수정된 부분: 새로운 메시지가 추가될 때마다 화면을 업데이트 + } + }, + ); + } + + void sendMessage(String message) { + client!.send( + destination: sendEndpoint, + body: json.encode( + Message(roomId: '1234', sender: 'your_name', contents: message) + .toJson()), + ); + + print(message); + notifyListeners(); + } +} diff --git a/lib/viewmodels/LoginVM.dart b/lib/viewmodels/LoginVM.dart new file mode 100644 index 0000000..1ef5df8 --- /dev/null +++ b/lib/viewmodels/LoginVM.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:suwon/models/user_model.dart'; + +class LoginVM extends ChangeNotifier { + String _loginResult = ''; + String get loginResult => _loginResult; + + // 사용자 ID 및 비밀번호를 저장하는 변수들 + String _userid = ''; + String _userpw = ''; + + // 사용자 ID를 업데이트하는 메서드 + void setUserid(String value) { + _userid = value; + } + + // 사용자 비밀번호를 업데이트하는 메서드 + void setUserpw(String value) { + _userpw = value; + } + + Future login() async { + try { + final apiUrl = Uri.parse('http://43.202.91.160:8080/member/sign-in'); + final requestBody = { + "account": _userid, + "password": _userpw, + }; + + final response = await http.post( + apiUrl, + headers: { + 'Content-Type': 'application/json', + }, + body: json.encode(requestBody), + ); + + if (response.statusCode == 200) { + final Map data = json.decode(response.body); + if (data['success'] != null && data['success']) { + _loginResult = '아이디 또는 비밀번호가 다릅니다'; + print('서버 응답 바디: ${response.body}'); + } else { + _loginResult = '로그인 성공'; + print('서버 응답 바디: ${response.body}'); + } + } else { + _loginResult = '서버 오류: ${response.statusCode}'; + } + } catch (error) { + _loginResult = '오류: $error'; + } + + // 상태가 변경되었음을 알림 + notifyListeners(); + } +} diff --git a/lib/viewmodels/SignupVM.dart b/lib/viewmodels/SignupVM.dart new file mode 100644 index 0000000..a4737ed --- /dev/null +++ b/lib/viewmodels/SignupVM.dart @@ -0,0 +1,177 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:suwon/models/user_model.dart'; +import 'dart:convert'; + +class SignupVM extends ChangeNotifier { + String id = ''; + String password = ''; + String email = ''; + String nickname = ''; + + bool btActivation = true; + bool _idError = false; + bool _pwError = false; + bool _emailError = false; + bool _pwMatch = false; + bool _isEmailValid = true; + bool _nicknameError = false; + + TextEditingController idController = TextEditingController(); + TextEditingController pwController = TextEditingController(); + TextEditingController emailController = TextEditingController(); + TextEditingController pwMatchController = TextEditingController(); + TextEditingController nicknameController = TextEditingController(); + TextEditingController mbtiController = TextEditingController(); + TextEditingController selfController = TextEditingController(); + + bool get idError => _idError; + bool get pwError => _pwError; + bool get emailError => _emailError; + bool get pwMatch => _pwMatch; + bool get isEmailValid => _isEmailValid; + bool _passwordVisible1 = true; + bool get passwordVisible1 => _passwordVisible1; + bool _passwordVisible2 = true; + bool get passwordVisible2 => _passwordVisible2; + bool get nicknameError => _nicknameError; + + void validateIdInput(String value) { + if (value.length >= 4 && value.length <= 16) { + _idError = false; + btActivation = false; + } else { + _idError = true; + } + notifyListeners(); + } + + void validatePwInput(String value) { + if (value.length >= 6 && value.length <= 20) { + _pwError = false; + btActivation = false; + } else { + _pwError = true; + } + notifyListeners(); + } + + void validatePwMatch(String value) { + if (pwController.text == value) { + _pwMatch = false; + btActivation = false; + } else { + _pwMatch = true; + } + notifyListeners(); + } + + void validateNickNameInput(String value) { + if (value.length < 9) { + _nicknameError = false; + btActivation = false; + } else { + _nicknameError = true; + } + notifyListeners(); + } + + void togglePasswordVisibility1() { + _passwordVisible1 = !_passwordVisible1; + notifyListeners(); + } + + void togglePasswordVisibility2() { + _passwordVisible2 = !_passwordVisible2; + notifyListeners(); + } + + void truebt(btActivation) { + if (_idError && _pwError && _pwMatch && _nicknameError == false) { + btActivation = false; + } else { + btActivation = true; + } + } + + bool validateEmail(String value) { + final RegExp emailRegExp = + RegExp(r'^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$'); + _isEmailValid = emailRegExp.hasMatch(value); + notifyListeners(); + return _isEmailValid; + } + + Future signup(UserModel userModel) async { + try { + // Convert UserModel to Map + Map userMap = { + "account": userModel.account, + "password": userModel.password, + "email": userModel.email, + "nickname": userModel.nickname, + }; + + // Encode Map to JSON String + String signupData = json.encode(userMap); + + // Make a POST request to your backend API + final response = await http.post( + Uri.parse("http://3.35.83.91:8080/member/sign-up"), + headers: { + 'Content-Type': 'application/json', + }, + body: signupData, + ); + + print(userMap); + + // 응답 상태 확인 + if (response.statusCode == 200) { + // 회원가입 성공 시, 필요한 경우 응답을 처리 + print('Signup successful'); + } else { + // 회원가입 실패 시, 에러 처리 + print('Signup failed - ${response.statusCode}: ${response.body}'); + } + } catch (error) { + // 회원가입 과정에서 발생하는 에러 처리 + print('Signup failed: $error'); + } + } + + //id 중복체크 + Future idcheck(UserModel userModel) async { + try { + // Convert UserModel to Map + Map userMap = { + "account": userModel.account, + }; + // Encode Map to JSON String + String signupData = json.encode(userMap); + + // Make a POST request to your backend API + final response = await http.post( + Uri.parse("http://43.202.91.160:8080/member/check-duplicate-id-signUp"), + headers: { + 'Content-Type': 'application/json', + }, + body: signupData, + ); + + print(userMap); + + // 응답 상태 확인 + if (response.statusCode == 200) { + // 회원가입 성공 시, 필요한 경우 응답을 처리 + print('사용 가능한 닉네임입니다.'); + } else { + // 회원가입 실패 시, 에러 처리 + print('이미 존재하는 닉네임 입니다. - ${response.statusCode}: ${response.body}'); + } + } catch (error) { + // 회원가입 과정에서 발생하는 에러 처리 + print('idcheck: $error'); + } + } +} diff --git a/lib/viewmodels/login_viewmodel.dart b/lib/viewmodels/login_viewmodel.dart deleted file mode 100644 index 42b2fba..0000000 --- a/lib/viewmodels/login_viewmodel.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; - -class LoginViewModel extends ChangeNotifier { - String _userid = ''; - String _userpw = ''; - - String get userid => _userid; - String get userpw => _userpw; - - void setUserid(String value) { - _userid = value; - notifyListeners(); - } - - void setUserpw(String value) { - _userpw = value; - notifyListeners(); - } - - Future login() async { - // 여기에서 실제 로그인 로직을 수행하고 결과를 반환합니다. - // 예를 들어, 서버와 통신하여 사용자 인증을 검증할 수 있습니다. - await Future.delayed(Duration(seconds: 2)); // 가상의 지연 시간 추가 - - // 가상의 로그인 결과 반환 - return _userid == 'userid' && _userpw == 'userpw'; - } -} diff --git a/lib/viewmodels/signup_viewmodel.dart b/lib/viewmodels/signup_viewmodel.dart deleted file mode 100644 index 2ad25bc..0000000 --- a/lib/viewmodels/signup_viewmodel.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'package:flutter/material.dart'; - -class SignupViewModel extends ChangeNotifier { - String _id = ''; - String _password = ''; - String _email = ''; - String _nickname = ''; - String _mbti = ''; - String _self = ''; //자기소개 - - bool _idError = false; - bool _pwError = false; - bool _emailError = false; - bool _pwMatch = false; - bool _isEmailValid = true; - bool _nicknameError = false; - - TextEditingController idController = TextEditingController(); - TextEditingController pwController = TextEditingController(); - TextEditingController emailController = TextEditingController(); - TextEditingController pwMatchController = TextEditingController(); - TextEditingController nicknameController = TextEditingController(); - TextEditingController mbtiController = TextEditingController(); - TextEditingController selfController = TextEditingController(); - - bool get idError => _idError; - bool get pwError => _pwError; - bool get emailError => _emailError; - bool get pwMatch => _pwMatch; - bool get isEmailValid => _isEmailValid; - bool _passwordVisible1 = true; - bool get passwordVisible1 => _passwordVisible1; - bool _passwordVisible2 = true; - bool get passwordVisible2 => _passwordVisible2; - bool get nicknameError => _nicknameError; - - void validateIdInput(String value) { - if (value.length >= 4 && value.length <= 16) { - _idError = false; - } else { - _idError = true; - } - notifyListeners(); - } - - void validatePwInput(String value) { - if (value.length >= 6 && value.length <= 20) { - _pwError = false; - } else { - _pwError = true; - } - notifyListeners(); - } - - void validatePwMatch(String value) { - if (pwController.text != value) { - _pwMatch = true; - } else { - _pwMatch = false; - } - notifyListeners(); - } - - void validateNickName(String value) { - if (value.length < 9) { - _nicknameError = false; - } else { - _nicknameError = true; - } - notifyListeners(); - } - - void togglePasswordVisibility1() { - _passwordVisible1 = !_passwordVisible1; - notifyListeners(); - } - - void togglePasswordVisibility2() { - _passwordVisible2 = !_passwordVisible2; - notifyListeners(); - } - - bool validateEmail(String value) { - final RegExp emailRegExp = - RegExp(r'^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$'); - _isEmailValid = emailRegExp.hasMatch(value); - notifyListeners(); - return _isEmailValid; - } - - Future signup() async { - if (validateEmail(_email) && !_idError && !_pwError && _pwMatch) { - // 회원가입 로직을 여기에 구현하면 됩니다. - // 예: API 호출, 데이터 저장 등 - String id = _id; - String password = _password; - String email = _email; - - print('id: $id'); - print('Password: $password'); - print('email: $email'); - } - } -} diff --git a/lib/views/Login_page_changePW.dart b/lib/views/ChangePasswordScreen.dart similarity index 92% rename from lib/views/Login_page_changePW.dart rename to lib/views/ChangePasswordScreen.dart index 37eba13..3dc087b 100644 --- a/lib/views/Login_page_changePW.dart +++ b/lib/views/ChangePasswordScreen.dart @@ -1,21 +1,19 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; -import 'package:suwon/viewmodels/AccountRecovery_viewmodel.dart'; +import 'package:suwon/viewmodels/AccountRecoveryVM.dart'; -import 'package:suwon/views/login_screen.dart'; +import 'package:suwon/views/LoginScreen.dart'; -import 'package:suwon/views/widgets/appbar.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; -class ChangePW extends StatelessWidget { +class ChangePasswordScreen extends StatelessWidget { final GlobalKey _formKey = GlobalKey(); @override Widget build(BuildContext context) { - final accountRecoveryViewModel = - Provider.of(context); + final accountRecoveryViewModel = Provider.of(context); return ScreenUtilInit( designSize: Size(390, 844), @@ -29,7 +27,7 @@ class ChangePW extends StatelessWidget { children: [ Container( margin: EdgeInsets.symmetric(horizontal: 20.w), - child: SuchatAppBar( + child: SuchatAppBarWidget( text: '비밀번호 변경', onPressed: () { accountRecoveryViewModel.pwController.clear(); @@ -37,7 +35,7 @@ class ChangePW extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => const NewLoignMain()), + builder: (context) => const LoginScreen()), ); }, ), @@ -93,7 +91,7 @@ class ChangePW extends StatelessWidget { : Icons.visibility, ), SizedBox(height: 48.h), - CustomButton( + CustomButtonWidget( text: '변경 완료', color: Colors.white, backgroundColor: Color(0xff2D64D8), diff --git a/lib/views/ChattingScreen.dart b/lib/views/ChattingScreen.dart new file mode 100644 index 0000000..4a5d2b9 --- /dev/null +++ b/lib/views/ChattingScreen.dart @@ -0,0 +1,208 @@ +import 'dart:html'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:provider/provider.dart'; +import 'package:suwon/views/HomeScreen.dart'; +import 'package:suwon/viewmodels/ChattingVM.dart'; + +class RandomChat extends StatefulWidget { + const RandomChat({Key? key}); + + @override + State createState() => _RandomChatState(); +} + +class _RandomChatState extends State { + late ChatViewModel viewModel; + final ScrollController _scrollController = ScrollController(); + + @override + void initState() { + super.initState(); + viewModel = Provider.of(context, listen: false); + viewModel.initialize(); + + viewModel.addListener(_scrollToEnd); // 새 메시지 추가 시 스크롤 + } + + @override + void dispose() { + _scrollController.dispose(); // 리소스 해제 + super.dispose(); + } + + void _scrollToEnd() { + if (_scrollController.hasClients) { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + duration: Duration(milliseconds: 300), + curve: Curves.easeOut, + ); + } + } + + @override + Widget build(BuildContext context) { + return ScreenUtilInit( + designSize: Size(390, 844), + builder: (context, child) => Scaffold( + resizeToAvoidBottomInset: true, + body: SizedBox( + height: 812.h, + child: Column( + children: [ + _Header(), + Expanded( + child: ListView.builder( + controller: _scrollController, + itemCount: viewModel.chatMessages.length, + itemBuilder: (context, index) { + final message = viewModel.chatMessages[index]; + return _ChatBubble(message: message.contents); + }, + ), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 24.w), + height: 58.h, + child: _CustomTextField(viewModel: viewModel), + ), + ], + ), + ), + ), + ); + } +} + +class _CustomTextField extends StatefulWidget { + final ChatViewModel viewModel; + + _CustomTextField({Key? key, required this.viewModel}) : super(key: key); + + @override + _CustomTextFieldState createState() => _CustomTextFieldState(); +} + +class _CustomTextFieldState extends State<_CustomTextField> { + final TextEditingController _textController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return TextField( + controller: _textController, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + hintText: '채팅을 시작하세요...', + hintStyle: TextStyle( + color: Color(0xff737373), + fontFamily: 'Pretendard-Regular', + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), + contentPadding: EdgeInsets.only(left: 17.w, top: 12, bottom: 12), + suffixIcon: GestureDetector( + onTap: () { + String message = _textController.text; + if (message.isNotEmpty) { + widget.viewModel.sendMessage(message); + _textController.clear(); + } + }, + child: SvgPicture.asset( + 'assets/onchatbt.svg', + width: 40.w, + height: 40.h, + ), + ), + ), + ); + } +} + +class _Header extends StatelessWidget { + @override + Widget build(BuildContext context) { + final chattingViewModel = Provider.of(context); + return Container( + height: 128.h, + alignment: Alignment.bottomCenter, + padding: EdgeInsets.only(right: 32.w, left: 32.w, bottom: 14.h), + color: Color(0xff4D76C8), + width: double.maxFinite, + child: Row( + children: [ + Container( + child: Row( + children: [ + SvgPicture.asset( + 'assets/User.svg', + width: 32.w, + height: 32.h, + ), + SizedBox(width: 12.w), + Text( + '닉네임', + style: TextStyle( + fontFamily: 'KCCChassam', + fontSize: 22.sp, + fontWeight: FontWeight.w400, + color: Colors.white, + ), + ), + ], + ), + ), + SizedBox(width: 130.w), + GestureDetector( + child: SvgPicture.asset( + 'assets/Report button.svg', + width: 40.w, + height: 40.h, + ), + ), + SizedBox(width: 12.w), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => HomeScreen()), + ); + }, + child: SvgPicture.asset( + 'assets/Exit.svg', + width: 38.w, + height: 38.h, + ), + ), + ], + ), + ); + } +} + +class _ChatBubble extends StatelessWidget { + final String message; + + const _ChatBubble({Key? key, required this.message}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(8), + margin: EdgeInsets.symmetric(vertical: 4), + decoration: BoxDecoration( + color: Colors.lightBlueAccent, + borderRadius: BorderRadius.circular(10), + ), + child: Text( + message, + style: TextStyle(color: Colors.black), + ), + ); + } +} diff --git a/lib/views/CustomDrawerScreen.dart b/lib/views/CustomDrawerScreen.dart new file mode 100644 index 0000000..05aac55 --- /dev/null +++ b/lib/views/CustomDrawerScreen.dart @@ -0,0 +1,189 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:suwon/views/EditProfileDrawerScreen.dart'; +import 'package:suwon/views/TermsConditionsDrawerScreen.dart'; +import 'package:suwon/views/FeedbackDrawerScreen.dart'; +import 'package:suwon/views/LoginScreen.dart'; +import 'package:suwon/views/widgets/CancelAndActionAlertDialogWidget.dart'; + +class CustomDrawerScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Drawer( + child: Container( + color: Colors.white, + child: ListView( + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + children: [ + Container( + height: 100.sp, + padding: EdgeInsets.only(right: 20.sp), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, // 가로 방향에서 맨 오른쪽 정렬 + children: [ + SizedBox(), + IconButton( + onPressed: () { + Navigator.of(context).pop(); + }, + icon: Image.asset( + 'assets/close.png', + scale: 4.sp, + ), + ) + ], + ), + ), + Container( + padding: EdgeInsets.all(0), + child: Column( + children: [ + Container( + alignment: Alignment.topLeft, + margin: EdgeInsets.zero, // 상단 여백 제거 + padding: EdgeInsets.only(left: 40.sp), + height: 120, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircleAvatar( + backgroundColor: Colors.white, + backgroundImage: AssetImage('assets/Group.png'), + ), + SizedBox(height: 8), + Text( + 'AnSungMin', + style: TextStyle( + color: Colors.black, + fontFamily: 'KCCChassam', + fontSize: 22, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w400, + ), + ), + Text( + '# ISTP', + style: TextStyle( + color: Color(0xff767676), + fontFamily: 'KCCChassam', + fontSize: 14, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], + ), + ), + Divider( + color: Color(0xFFEDEDED), + thickness: 1.0, + ), + SizedBox(height: 20), + ListTile_main( + text: '프로필 수정', + Menu_Icon: 'assets/profile.svg', + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => EditProfileDrawerScreen(), + ), + ); + }, + ), + SizedBox(height: 20), + ListTile_main( + text: '이용약관', + Menu_Icon: 'assets/policy.svg', + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => TermsConditionsDrawerScreen(), + ), + ); + }, + ), + SizedBox(height: 20), + ListTile_main( + text: ' 피드백', + Menu_Icon: 'assets/feedback.svg', + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FeedbackDrawerScreen(), + ), + ); + }, + ), + SizedBox(height: 20), + ListTile_main( + text: '로그아웃', + Menu_Icon: 'assets/logout.svg', + onTap: () { + CancelAndActionAlertDialogWidget( + title: "로그아웃 하시겠습니까?", + action: "로그아웃", + onAction: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LoginScreen()), + ); + }, + onCancel: () {}) + .show(context); + }), + ], + ), + ), + ); + } +} + +class ListTile_main extends StatelessWidget { + final String text; + final String Menu_Icon; + final VoidCallback onTap; + + const ListTile_main( + {required this.text, required this.Menu_Icon, required this.onTap}); + @override + Widget build(BuildContext context) { + return ListTile( + title: Row( + children: [ + SizedBox( + width: 20.sp, + ), + SvgPicture.asset(Menu_Icon), + SizedBox(width: 10.sp), + Text( + text, + style: TextStyle( + color: Colors.black, + fontFamily: 'Pretendard', + fontSize: 16.sp, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w400, + letterSpacing: -0.4.sp, + ), + ), // 제목 + SizedBox(width: 20.sp), + Image.asset( + 'assets/Vector6.png', + scale: 4.sp, + ) + ], + ), + onTap: onTap); + } +} diff --git a/lib/views/edit_profie.dart b/lib/views/EditProfileDrawerScreen.dart similarity index 92% rename from lib/views/edit_profie.dart rename to lib/views/EditProfileDrawerScreen.dart index 8a4b64a..b068bcf 100644 --- a/lib/views/edit_profie.dart +++ b/lib/views/EditProfileDrawerScreen.dart @@ -1,19 +1,19 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:suwon/views/Main_page.dart'; -import 'package:suwon/views/signup_creen.dart'; -import 'package:suwon/views/widgets/appbar.dart'; -import 'package:suwon/viewmodels/signup_viewmodel.dart'; +import 'package:suwon/views/HomeScreen.dart'; +import 'package:suwon/views/SignUpScreen.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/viewmodels/SignupVM.dart'; import 'package:provider/provider.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; -import 'package:suwon/views/widgets/font.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; -class EditProfile extends StatelessWidget { +class EditProfileDrawerScreen extends StatelessWidget { final GlobalKey _formKey = GlobalKey(); @override Widget build(BuildContext context) { - final signupViewModel = Provider.of(context); + final signupViewModel = Provider.of(context); return ScreenUtilInit( designSize: Size(390, 844), builder: (context, child) => Scaffold( @@ -27,7 +27,7 @@ class EditProfile extends StatelessWidget { Container( //상단바 margin: EdgeInsets.symmetric(horizontal: 20.w), - child: SuchatAppBar( + child: SuchatAppBarWidget( text: ' 프로필 설정', onPressed: () { signupViewModel.idController.clear(); @@ -35,7 +35,7 @@ class EditProfile extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => MainPage(), + builder: (context) => HomeScreen(), ), ); }, @@ -56,7 +56,7 @@ class EditProfile extends StatelessWidget { color: Color(0xFFFF0000), controller: signupViewModel.nicknameController, onChanged: (value) => - signupViewModel.validateNickName(value), + signupViewModel.validateNickNameInput(value), showErrorText: signupViewModel.nicknameError, errorText: '* 닉네임은 8자 이내로 작성 해주세요', hintText: '# NICKNAME', @@ -70,7 +70,7 @@ class EditProfile extends StatelessWidget { ), child: TextButton( onPressed: () {}, - child: TextFont.fontRegular( + child: TextFontWidget.fontRegular( color: Color(0xFFFFFFFF), fontSize: 14, text: '중복 확인')), diff --git a/lib/views/EmailAuthentication.dart b/lib/views/EmailAuthentication.dart new file mode 100644 index 0000000..32f8691 --- /dev/null +++ b/lib/views/EmailAuthentication.dart @@ -0,0 +1,132 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:suwon/models/user_model.dart'; +import 'package:suwon/viewmodels/SignupVM.dart'; +import 'package:provider/provider.dart'; +import 'package:suwon/views/LoginScreen.dart'; +import 'package:suwon/views/SignUpScreen.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/widgets/EmailTextFieldWidget.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; + +class EmailAuth extends StatelessWidget { + const EmailAuth({super.key}); + + @override + Widget build(BuildContext context) { + final signupViewModel = Provider.of(context); + return ScreenUtilInit( + designSize: Size(390, 844), + builder: (context, child) => Scaffold( + resizeToAvoidBottomInset: false, + body: Container( + margin: EdgeInsets.only(top: 88.h), + child: Form( + child: Column( + children: [ + Container( + //상단바 + margin: EdgeInsets.symmetric(horizontal: 20.w), + child: SuchatAppBarWidget( + text: ' 회원가입', + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => SignUpScreen(), + ), + ); + }, + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 32.w), + child: Column(children: [ + SizedBox( + width: double.maxFinite, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox(height: 35.h), + EmailTextFieldWidget( + controller: signupViewModel.emailController, + onChanged: (value) => + signupViewModel.isEmailValid), + SizedBox(height: 57.h), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextFontWidget.fontSemiBold( + text: '* 입력하신 메일로 ', + fontSize: 12.sp, + color: Color(0xFF989898), + ), + TextFontWidget.fontSemiBold( + text: '이메일 인증 URL ', + fontSize: 12.sp, + color: Color(0xff2d63d8), + ), + TextFontWidget.fontSemiBold( + text: '을 전송합니다', + fontSize: 12.sp, + color: Color(0xFF989898), + ), + ], + ), + SizedBox(height: 10.h), + CustomButtonWidget( + text: '인증메일 전송', + color: Colors.white, + backgroundColor: Color(0xff2d63d8), + onPressed: () async { + // 사용자 입력을 JSON 형식으로 변환합니다 + String jsonData = json.encode({ + "memberId": signupViewModel.idController.text, + "password": signupViewModel.pwController.text, + "email": signupViewModel.emailController.text, + "nickname": + signupViewModel.nicknameController.text, + }); + + // UserModel.fromJson 생성자를 사용하여 UserModel 객체를 만듭니다 + UserModel userModel = + UserModel.fromJson(json.decode(jsonData)); + + // UserModel 객체와 함께 signup 메서드를 호출합니다 + await signupViewModel.signup(userModel); + }, + ), + SizedBox( + height: 15.h, + ), + CustomButtonWidget( + text: '회원가입 완료', + color: Colors.white, + backgroundColor: Color(0xFF111111), + onPressed: () { + signupViewModel.idController.clear(); + signupViewModel.pwController.clear(); + signupViewModel.pwMatchController.clear(); + signupViewModel.emailController.clear(); + signupViewModel.nicknameController.clear(); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LoginScreen()), + ); + }), + ], + ), + ), + ]), + ), + ], + ), + ), + )), + ); + } +} diff --git a/lib/views/FeedbackDrawerScreen.dart b/lib/views/FeedbackDrawerScreen.dart new file mode 100644 index 0000000..18a5eb4 --- /dev/null +++ b/lib/views/FeedbackDrawerScreen.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:suwon/views/widgets/DrawerAppBarWidget.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; + +class FeedbackDrawerScreen extends StatelessWidget { + final GlobalKey _formKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return ScreenUtilInit( + designSize: Size(390, 844), + builder: (context, child) => Scaffold( + resizeToAvoidBottomInset: false, + body: Container( + margin: EdgeInsets.only(top: 88.h), + child: Form( + key: _formKey, + child: Column( + children: [ + Container( + //상단바 + margin: EdgeInsets.symmetric(horizontal: 20.w), + child: DrawerAppBarWidget( + text: '피드백', + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 32.w), + child: Column( + children: [ + SizedBox(height: 20.h), + TextField( + maxLength: 40, + maxLines: 9, // 여기에서 줄넘김 기능을 추가합니다. + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + hintText: '앱 사용 시 불편한 점 또는 건의 사항이 있다면 자유롭게 작성해 주세요', + hintStyle: TextStyle( + fontFamily: 'Pretendard-Regular', + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + counterText: '', + contentPadding: EdgeInsets.symmetric( + vertical: 20, horizontal: 12), + ), + ), + SizedBox(height: 24.h), + CustomButtonWidget( + text: "제출하기", + backgroundColor: Color(0xFF2D64D8), + onPressed: () {}, + color: Color(0xFFFFFFFF)) + ], + ), + ), + ], + ), + ), + )), + ); + } +} diff --git a/lib/views/HomeScreen.dart b/lib/views/HomeScreen.dart new file mode 100644 index 0000000..c2e22fd --- /dev/null +++ b/lib/views/HomeScreen.dart @@ -0,0 +1,214 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:suwon/views/CustomDrawerScreen.dart'; +import 'package:suwon/views/MatchingLoadingScreen.dart'; + +class HomeScreen extends StatelessWidget { + const HomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + final _scaffoldKey = GlobalKey(); + + return ScreenUtilInit( + designSize: Size(390, 844), + builder: (context, child) => Scaffold( + backgroundColor: Colors.white, + key: _scaffoldKey, + resizeToAvoidBottomInset: false, + appBar: AppBar( + toolbarHeight: 80.h, + centerTitle: false, + automaticallyImplyLeading: false, + elevation: 0.0, + backgroundColor: Colors.white, + title: Container( + width: 96.w, + height: 80.h, + padding: EdgeInsets.zero, + margin: EdgeInsets.zero, + child: Row( + children: [ + SizedBox( + width: 15.w, + ), + Image.asset( + 'assets/SUCHAT.png', + width: 76.w, + height: 20.h, + ) + ], + ), + ), + actions: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + child: IconButton( + onPressed: () { + _scaffoldKey.currentState?.openEndDrawer(); + }, + icon: SvgPicture.asset('assets/onclikmenu.svg', + width: 28.w, height: 20.h), + )), + SizedBox( + width: 25.w, + ), + ], + ), + ), + ], + ), + body: Column( + children: [ + Container( + child: Text( + '_배너', + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w400, + ), + ), + alignment: Alignment.center, + height: 55.h, + width: 390.w, + color: Color(0xffDBDBDB), + ), + Row( + children: [ + SizedBox( + width: 32.w, + ), + Container( + height: 335.h, + width: 358.w, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration(color: Colors.white), + child: Transform.scale( + scale: 1, + child: Transform.translate( + offset: const Offset(0, -60), + child: ClipRect( + child: Image.asset( + 'assets/bubble_main.PNG', + fit: BoxFit.fill, + ), + ), + ), + ), + ), + ], + ), + Container( + child: CustomButton_main( + text: '매칭 시작하기', + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MatchingLoadingScreen()), + ); + }, + ), + ), + SizedBox( + height: 24.h, + width: 360.w, + ), + Container( + child: Text( + '주의!! 욕설 및 상대방에게 불쾌함을 주는 채팅\n 적발 시 계정 이용이 제한됩니다 ', + style: TextStyle( + color: Color(0xff767676), + fontFamily: 'KCCChassam', + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w400, + fontSize: 14.sp, + letterSpacing: -0.4, + ), + ), + ), + SizedBox( + height: 120.h, + width: 390.w, + ), + Container( + height: 20.h, + width: 390.w, + child: Text( + '@copyright by Flag', + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xff767676), + fontFamily: 'Pretendard', + fontSize: 12.sp, + fontWeight: FontWeight.w400, + letterSpacing: 0.3, + ), + ), + ) + ], + ), + endDrawer: CustomDrawerScreen(), + )); + } +} + +class CustomButton_main extends StatelessWidget { + final String text; + final VoidCallback onPressed; + + const CustomButton_main({ + required this.text, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return Container( + height: 64.h, + width: 334.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25.r), + color: Color(0xff2D64D8), + ), + child: TextButton( + onPressed: onPressed, + child: Text( + text, + style: TextStyle( + color: Color(0xffffffff), + fontSize: 24.sp, + fontWeight: FontWeight.w400, + fontFamily: 'KCCChassam', + fontStyle: FontStyle.normal, + ), + ), + ), + ); + } +} + +class resign_Button extends StatelessWidget { + @override + Widget build(BuildContext context) { + return TextButton( + onPressed: () {}, + child: Text( + '회원 탈퇴하기 >', + style: TextStyle( + color: Color(0xff767676), + fontFamily: 'Pretendard', + fontSize: 12.sp, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w400, + letterSpacing: 0.3.sp, + ), + ), + style: TextButton.styleFrom(padding: EdgeInsets.zero), + ); + } +} diff --git a/lib/views/login_screen.dart b/lib/views/LoginScreen.dart similarity index 66% rename from lib/views/login_screen.dart rename to lib/views/LoginScreen.dart index d1c72c0..3770c7e 100644 --- a/lib/views/login_screen.dart +++ b/lib/views/LoginScreen.dart @@ -1,22 +1,26 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:suwon/views/Login_page_changePW.dart'; -import 'package:suwon/views/Login_page_searchID.dart'; -import 'package:suwon/views/Main_page.dart'; -import 'package:suwon/views/Signup_creen.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; +import 'package:suwon/views/ChangePasswordScreen.dart'; +import 'package:suwon/views/ChattingScreen.dart'; +import 'package:suwon/views/SearchIdScreen.dart'; +import 'package:suwon/views/HomeScreen.dart'; +import 'package:suwon/views/SignUpScreen.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; import 'package:provider/provider.dart'; -import 'package:suwon/viewmodels/login_viewmodel.dart'; -import 'package:suwon/views/widgets/font.dart'; +import 'package:suwon/viewmodels/LoginVM.dart'; +import 'package:suwon/views/widgets/NormalAlertDialogWidget.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; -import 'Login_page_searchPW.dart'; +import 'SearchPasswordScreen.dart'; -class NewLoignMain extends StatelessWidget { - const NewLoignMain({super.key}); +class LoginScreen extends StatelessWidget { + const LoginScreen({super.key}); @override Widget build(BuildContext context) { - final loginViewModel = Provider.of(context); + final loginViewModel = Provider.of(context); return ScreenUtilInit( designSize: Size(390, 844), builder: (context, child) => Scaffold( @@ -30,7 +34,7 @@ class NewLoignMain extends StatelessWidget { margin: EdgeInsets.only(left: 32.w), child: Image( fit: BoxFit.fill, - image: AssetImage('asstes/bubble.PNG'), + image: AssetImage('assets/bubble.PNG'), ), ), SizedBox(height: 32.h), @@ -40,38 +44,44 @@ class NewLoignMain extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ InputFD( - //ID 입력창 - onChanged: (value) => loginViewModel.setUserid(value), - hintText: 'ID'), + // ID 입력창 + onChanged: (value) => loginViewModel.setUserid(value), + hintText: 'ID', + ), SizedBox( height: 10.h, ), InputFD( - // PW 입력창 - onChanged: (value) => loginViewModel.setUserpw(value), - hintText: 'PW', - obscureText: true), + // PW 입력창 + onChanged: (value) => loginViewModel.setUserpw(value), + hintText: 'PW', + obscureText: true, + ), SizedBox(height: 24.h), - CustomButton( + CustomButtonWidget( // 로그인 버튼 text: '로그인', color: Colors.white, backgroundColor: Color(0xff2d63d8), onPressed: () async { - /*bool success = await loginViewModel.login(); - if (success) { + await loginViewModel.login(); + // 로그인 결과에 따른 처리를 추가할 수 있음 + print(loginViewModel.loginResult); + + // 예제로 홈 화면으로 이동하는 부분 추가 + if (loginViewModel.loginResult == '로그인 성공') { Navigator.push( context, - MaterialPageRoute(builder: (context) => MainPage()), + MaterialPageRoute( + builder: (context) => HomeScreen()), ); } else { - // 로그인 실패 처리 + NormalAlertDialogWidget( + title: '알림', + message: 'ID 혹은 비밀번호가 올바르지 않습니다.', + onClose: () {}) + .show(context); } - */ - Navigator.push( - context, - MaterialPageRoute(builder: (context) => MainPage()), - ); }), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -81,24 +91,24 @@ class NewLoignMain extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => const SearchID()), + builder: (context) => const SearchIdScreen()), ); }, - child: TextFont.fontRegular( + child: TextFontWidget.fontRegular( text: '아이디 찾기', fontSize: 14.sp, color: Color(0xFF232323))), - TextFont.fontRegular( + TextFontWidget.fontRegular( text: '/', fontSize: 16.sp, color: Color(0xFFBFBFBF)), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( - builder: (context) => SearchPW()), + builder: (context) => RandomChat()), ); }, - child: TextFont.fontRegular( + child: TextFontWidget.fontRegular( text: '비밀번호 찾기', fontSize: 14.sp, color: Color(0xFF232323))), @@ -116,7 +126,7 @@ class NewLoignMain extends StatelessWidget { thickness: 1, color: Colors.grey, )), - TextFont.fontRegular( + TextFontWidget.fontRegular( text: '계정이 없으신가요?', fontSize: 14.sp, color: Color(0xFF767676)), @@ -131,7 +141,7 @@ class NewLoignMain extends StatelessWidget { SizedBox( height: 18.h, ), - CustomButton( + CustomButtonWidget( text: '회원가입', color: Colors.white, backgroundColor: Color(0xFF111111), @@ -139,7 +149,7 @@ class NewLoignMain extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => SignupScreen()), + builder: (context) => SignUpScreen()), ); }), ], diff --git a/lib/views/Main_page.dart b/lib/views/Main_page.dart deleted file mode 100644 index a420f17..0000000 --- a/lib/views/Main_page.dart +++ /dev/null @@ -1,450 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:suwon/views/widgets/cancel_and_action_alert_dialog.dart'; -import 'package:suwon/views/edit_profie.dart'; -import 'package:suwon/views/login_screen.dart'; -import 'package:suwon/views/matching_loding.dart'; - -class MainPage extends StatelessWidget { - const MainPage({super.key}); - - @override - Widget build(BuildContext context) { - final _scaffoldKey = GlobalKey(); - - return ScreenUtilInit( - designSize: Size(390, 844), - builder: (context, child) => Scaffold( - key: _scaffoldKey, - resizeToAvoidBottomInset: false, - appBar: AppBar( - elevation: 0.0, - backgroundColor: Colors.white, - title: Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox(width: 20.sp), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'asstes/SUCHAT.png', - width: 74.sp, - height: 20.sp, - fit: BoxFit.fill, - ) - ], - ) - ], - ), - ), - centerTitle: false, - automaticallyImplyLeading: false, - actions: [ - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - child: IconButton( - onPressed: () { - _scaffoldKey.currentState?.openEndDrawer(); - }, - icon: SvgPicture.asset( - 'asstes/Icon_menu.svg', - ), - ), - ) - ], - ), - SizedBox( - width: 28.sp, - ) - ], - ), - ) - ], - ), - endDrawer: Drawer( - backgroundColor: Colors.white, - width: 250.sp, - child: Container( - height: 800.sp, - width: double.infinity, - child: ListView( - physics: const NeverScrollableScrollPhysics(), - padding: EdgeInsets.only(top: 0), - children: [ - Column( - children: [ - Container( - height: 85.sp, - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - SizedBox( - width: 190.sp, - ), - IconButton( - onPressed: () {}, - icon: Image.asset( - 'asstes/close.png', - scale: 4.sp, - ), - ) - ], - ), - ), - UserAccountsDrawerHeader( - decoration: BoxDecoration(color: Colors.white), - margin: EdgeInsets.zero, - currentAccountPicture: CircleAvatar( - backgroundColor: Colors.white, - backgroundImage: AssetImage('asstes/Group.png'), - ), - currentAccountPictureSize: Size(49.sp, 49.sp), - accountName: Text( - 'AnSungMin', - style: TextStyle( - color: Colors.black, - fontFamily: 'KCCChassam', - fontSize: 22.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - ), - ), - accountEmail: Text( - '# ISTP', - style: TextStyle( - color: Color(0xff767676), - fontFamily: 'KCCChassam', - fontSize: 14.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - ), - ), - ), - Container( - height: 400.sp, - width: double.infinity, - decoration: BoxDecoration( - border: Border( - top: BorderSide( - color: Color(0xffEDEDED), - width: 1.sp, - ), - bottom: BorderSide( - color: Color(0xffEDEDED), - width: 1.sp, - ), - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox( - height: 59.sp, - ), - ListTile( - leading: SvgPicture.asset('asstes/profile.svg'), - title: Text( - '프로필 수정', - style: TextStyle( - color: Colors.black, - fontFamily: 'Pretendard', - fontSize: 16.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - letterSpacing: -0.4.sp, - ), - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => EditProfile(), - ), - ); - }, - trailing: Image.asset( - 'asstes/Vector6.png', - scale: 4.sp, - ), - ), - ListTile( - leading: SvgPicture.asset('asstes/policy.svg'), - title: Text( - '이용약관', - style: TextStyle( - color: Colors.black, - fontFamily: 'Pretendard', - fontSize: 16.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - letterSpacing: -0.4.sp, - ), - ), - onTap: () {}, - trailing: Image.asset( - 'asstes/Vector6.png', - scale: 4.sp, - ), - ), - ListTile( - leading: SvgPicture.asset('asstes/feedback.svg'), - title: Text( - '피드백', - style: TextStyle( - color: Colors.black, - fontFamily: 'Pretendard', - fontSize: 16.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - letterSpacing: -0.4.sp, - ), - ), - onTap: () {}, - trailing: Image.asset( - 'asstes/Vector6.png', - scale: 4.sp, - ), - ), - ListTile( - leading: SvgPicture.asset('asstes/logout.svg'), - title: Padding( - padding: EdgeInsets.zero, - child: Text( - '로그아웃', - style: TextStyle( - color: Colors.black, - fontFamily: 'Pretendard', - fontSize: 16.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - letterSpacing: -0.4.sp, - ), - ), - ), - onTap: () { - CancelAndActionAlertDialog( - title: "로그아웃 하시겠습니까?", - action: "로그아웃", - onAction: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - NewLoignMain()), - ); - }, - onCancel: () {}) - .show(context); - }, - trailing: Image.asset( - 'asstes/Vector6.png', - scale: 4.sp, - ), - ), - SizedBox( - height: 100.sp, - ) - ], - ), - ), - Container( - height: 150.sp, - width: double.infinity, - color: Color(0xffEDEDED), - child: Row( - children: [ - SizedBox( - width: 32.sp, - ), - Column( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15.sp, - ), - Image.asset( - 'asstes/SUCHAT.png', - scale: 3.sp, - ), - SizedBox( - height: 12.sp, - ), - Text( - 'Copyright 2023.\nFlag inc. all rights reserved.', - style: TextStyle( - color: Color(0xff767676), - fontFamily: 'Pretendard', - fontSize: 10.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - letterSpacing: 0.25.sp, - ), - ), - TextButton( - onPressed: () {}, - child: Text( - '회원 탈퇴하기 >', - style: TextStyle( - color: Color(0xff767676), - fontFamily: 'Pretendard', - fontSize: 12.sp, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - letterSpacing: 0.3.sp, - ), - ), - style: TextButton.styleFrom( - padding: EdgeInsets.zero), - ) - ], - ) - ], - ) - ], - ), - ) - ], - ) - ], - ), - )), - body: Container( - color: Colors.white, - child: Column( - children: [ - SizedBox( - height: 18.sp, - ), - Container( - child: Container( - child: Text( - '_배너', - style: TextStyle( - fontSize: 18.sp, - fontWeight: FontWeight.w400, - ), - ), - alignment: Alignment.center, - height: 55.sp, - width: 390.sp, - color: Color(0xffDBDBDB), - ), - ), - Container( - height: 331.h, - width: double.infinity, - clipBehavior: Clip.hardEdge, - decoration: BoxDecoration(color: Colors.white), - child: Transform.scale( - scale: 1.sp, - child: Transform.translate( - offset: const Offset(25, -60), - child: Image.asset( - 'asstes/bubble_main.PNG', - scale: 1.sp, - fit: BoxFit.fill, - ), - ), - ), - ), - Container( - child: CustomButton_main( - text: '매칭 시작하기', - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MatchingLoading()), - ); - }, - ), - ), - SizedBox( - height: 24.sp, - width: double.infinity, - ), - Container( - child: Text( - '주의!! 욕설 및 상대방에게 불쾌함을 주는 채팅\n 적발 시 계정 이용이 제한됩니다 ', - style: TextStyle( - color: Color(0xff767676), - fontFamily: 'KCCChassam', - fontStyle: FontStyle.normal, - fontWeight: FontWeight.w400, - fontSize: 14.sp, - letterSpacing: -0.4.sp, - ), - ), - ), - SizedBox( - height: 120.sp, - width: double.infinity, - ), - Container( - height: 20.sp, - width: double.infinity, - child: Text( - '@copyright by Flag', - textAlign: TextAlign.center, - style: TextStyle( - color: Color(0xff767676), - fontFamily: 'Pretendard', - fontSize: 12.sp, - fontWeight: FontWeight.w400, - letterSpacing: 0.3.sp, - ), - ), - ) - ], - ), - ), - ), - ); - } -} - -class CustomButton_main extends StatelessWidget { - final String text; - final VoidCallback onPressed; - - const CustomButton_main({ - required this.text, - required this.onPressed, - }); - - @override - Widget build(BuildContext context) { - return Container( - height: 64.sp, - width: 334.sp, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25.w), - color: Color(0xff2D64D8), - ), - child: TextButton( - onPressed: onPressed, - child: Text( - text, - style: TextStyle( - color: Color(0xffffffff), - fontSize: 24.sp, - fontWeight: FontWeight.w400, - fontFamily: 'KCCChassam', - fontStyle: FontStyle.normal, - ), - ), - ), - ); - } -} diff --git a/lib/views/matching_loding.dart b/lib/views/MatchingLoadingScreen.dart similarity index 87% rename from lib/views/matching_loding.dart rename to lib/views/MatchingLoadingScreen.dart index 69ffd4e..e56150f 100644 --- a/lib/views/matching_loding.dart +++ b/lib/views/MatchingLoadingScreen.dart @@ -2,17 +2,18 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:suwon/views/Main_page.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; +import 'package:suwon/views/ChattingScreen.dart'; +import 'package:suwon/views/HomeScreen.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; -class MatchingLoading extends StatefulWidget { - const MatchingLoading({Key? key}) : super(key: key); +class MatchingLoadingScreen extends StatefulWidget { + const MatchingLoadingScreen({Key? key}) : super(key: key); @override _MatchingLoadingState createState() => _MatchingLoadingState(); } -class _MatchingLoadingState extends State { +class _MatchingLoadingState extends State { StreamController dotStreamController = StreamController(); int numDots = 0; @@ -89,13 +90,13 @@ class _MatchingLoadingState extends State { fontsize: 16.sp, ), SizedBox(height: 60.h), - CustomButton( + CustomButtonWidget( text: '매칭 중단하기', backgroundColor: Color(0xff111111), onPressed: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => MainPage()), + MaterialPageRoute(builder: (context) => RandomChat()), ); }, color: Color(0xffFFFFFF), diff --git a/lib/views/Login_page_searchID.dart b/lib/views/SearchIdScreen.dart similarity index 85% rename from lib/views/Login_page_searchID.dart rename to lib/views/SearchIdScreen.dart index 2504818..e1ab2f2 100644 --- a/lib/views/Login_page_searchID.dart +++ b/lib/views/SearchIdScreen.dart @@ -1,22 +1,21 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:suwon/viewmodels/AccountRecovery_viewmodel.dart'; -import 'package:suwon/viewmodels/signup_viewmodel.dart'; -import 'package:suwon/views/login_screen.dart'; -import 'package:suwon/views/widgets/appbar.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; -import 'package:suwon/views/widgets/emailfield.dart'; +import 'package:suwon/viewmodels/AccountRecoveryVM.dart'; +import 'package:suwon/viewmodels/SignupVM.dart'; +import 'package:suwon/views/LoginScreen.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/widgets/EmailTextFieldWidget.dart'; import 'package:provider/provider.dart'; -class SearchID extends StatelessWidget { - const SearchID({super.key}); +class SearchIdScreen extends StatelessWidget { + const SearchIdScreen({super.key}); @override Widget build(BuildContext context) { final GlobalKey _formKey = GlobalKey(); - final accountRecoveryViewModel = - Provider.of(context); + final accountRecoveryViewModel = Provider.of(context); return ScreenUtilInit( designSize: Size(390, 844), @@ -31,14 +30,14 @@ class SearchID extends StatelessWidget { Container( //상단바 margin: EdgeInsets.symmetric(horizontal: 20.w), - child: SuchatAppBar( + child: SuchatAppBarWidget( text: '아이디 찾기', onPressed: () { accountRecoveryViewModel.emailController.clear(); Navigator.push( context, MaterialPageRoute( - builder: (context) => const NewLoignMain()), + builder: (context) => const LoginScreen()), ); }, ), @@ -55,7 +54,7 @@ class SearchID extends StatelessWidget { SizedBox( height: 42.h, ), - EmailFD( + EmailTextFieldWidget( controller: accountRecoveryViewModel.emailController, onChanged: (value) => @@ -102,7 +101,7 @@ class SearchID extends StatelessWidget { SizedBox( height: 12.h, ), - CustomButton( + CustomButtonWidget( text: '확인메일 전송', color: Colors.white, backgroundColor: Color(0xff2D64D8), @@ -111,7 +110,7 @@ class SearchID extends StatelessWidget { SizedBox( height: 12.h, ), - CustomButton( + CustomButtonWidget( text: '로그인 하러가기', color: Colors.white, backgroundColor: Color(0xff111111), @@ -119,7 +118,7 @@ class SearchID extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => NewLoignMain(), + builder: (context) => LoginScreen(), ), ); }, diff --git a/lib/views/Login_page_searchPW.dart b/lib/views/SearchPasswordScreen.dart similarity index 89% rename from lib/views/Login_page_searchPW.dart rename to lib/views/SearchPasswordScreen.dart index 0eafa27..0968583 100644 --- a/lib/views/Login_page_searchPW.dart +++ b/lib/views/SearchPasswordScreen.dart @@ -1,22 +1,20 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; -import 'package:suwon/viewmodels/AccountRecovery_viewmodel.dart'; -import 'package:suwon/views/login_screen.dart'; -import 'package:suwon/views/widgets/appbar.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; -import 'package:suwon/views/widgets/emailfield.dart'; -import 'package:suwon/views/widgets/idfield.dart'; +import 'package:suwon/viewmodels/AccountRecoveryVM.dart'; +import 'package:suwon/views/LoginScreen.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/widgets/EmailTextFieldWidget.dart'; +import 'package:suwon/views/widgets/IdTextFieldWidget.dart'; -class SearchPW extends StatelessWidget { +class SearchPasswordScreen extends StatelessWidget { final GlobalKey _formKey = GlobalKey(); - SearchPW({super.key}); + SearchPasswordScreen({super.key}); @override Widget build(BuildContext context) { - final accountRecoveryViewModel = - Provider.of(context); + final accountRecoveryViewModel = Provider.of(context); return ScreenUtilInit( designSize: Size(390, 844), @@ -30,7 +28,7 @@ class SearchPW extends StatelessWidget { children: [ Container( margin: EdgeInsets.symmetric(horizontal: 20.w), - child: SuchatAppBar( + child: SuchatAppBarWidget( text: '비밀번호 찾기', onPressed: () { accountRecoveryViewModel.idController.clear(); @@ -40,7 +38,7 @@ class SearchPW extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => const NewLoignMain()), + builder: (context) => const LoginScreen()), ); }, ), @@ -53,7 +51,7 @@ class SearchPW extends StatelessWidget { SizedBox( height: 42.h, ), - IdFD( + IdTextFieldWidget( controller: accountRecoveryViewModel.idController, onChanged: (value) => accountRecoveryViewModel @@ -61,7 +59,7 @@ class SearchPW extends StatelessWidget { SizedBox( height: 21.h, ), - EmailFD( + EmailTextFieldWidget( controller: accountRecoveryViewModel.emailController, onChanged: (value) => @@ -110,7 +108,7 @@ class SearchPW extends StatelessWidget { SizedBox( height: 12.h, ), - CustomButton( + CustomButtonWidget( text: '인증코드 전송', color: Colors.white, backgroundColor: Color(0xff2D64D8), diff --git a/lib/views/setprofile.dart b/lib/views/SetProfileScreen.dart similarity index 93% rename from lib/views/setprofile.dart rename to lib/views/SetProfileScreen.dart index a85c009..f90a3be 100644 --- a/lib/views/setprofile.dart +++ b/lib/views/SetProfileScreen.dart @@ -1,18 +1,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:suwon/views/signup_creen.dart'; -import 'package:suwon/views/widgets/appbar.dart'; -import 'package:suwon/viewmodels/signup_viewmodel.dart'; +import 'package:suwon/views/SignUpScreen.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/viewmodels/SignupVM.dart'; import 'package:provider/provider.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; -import 'package:suwon/views/widgets/font.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; -class SetProfile extends StatelessWidget { +class SetProfileScreen extends StatelessWidget { final GlobalKey _formKey = GlobalKey(); @override Widget build(BuildContext context) { - final signupViewModel = Provider.of(context); + final signupViewModel = Provider.of(context); return ScreenUtilInit( designSize: Size(390, 844), builder: (context, child) => Scaffold( @@ -26,7 +26,7 @@ class SetProfile extends StatelessWidget { Container( //상단바 margin: EdgeInsets.symmetric(horizontal: 20.w), - child: SuchatAppBar( + child: SuchatAppBarWidget( text: ' 프로필 설정', onPressed: () { signupViewModel.idController.clear(); @@ -34,7 +34,7 @@ class SetProfile extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => SignupScreen(), + builder: (context) => SignUpScreen(), ), ); }, @@ -54,7 +54,7 @@ class SetProfile extends StatelessWidget { color: Color(0xFFFF0000), controller: signupViewModel.nicknameController, onChanged: (value) => - signupViewModel.validateNickName(value), + signupViewModel.validateNickNameInput(value), showErrorText: signupViewModel.nicknameError, errorText: '* 닉네임은 8자 이내로 작성 해주세요', hintText: '# NICKNAME', @@ -68,7 +68,7 @@ class SetProfile extends StatelessWidget { ), child: TextButton( onPressed: () {}, - child: TextFont.fontRegular( + child: TextFontWidget.fontRegular( color: Color(0xFFFFFFFF), fontSize: 14, text: '중복 확인')), @@ -86,7 +86,7 @@ class SetProfile extends StatelessWidget { SizedBox(height: 12.h), Self(controller: signupViewModel.selfController), SizedBox(height: 48.h), - CustomButton( + CustomButtonWidget( text: '시작하기', color: Colors.white, backgroundColor: Color(0xFF2D64D8), diff --git a/lib/views/signup_done.dart b/lib/views/SignUpDoneScreen.dart similarity index 92% rename from lib/views/signup_done.dart rename to lib/views/SignUpDoneScreen.dart index 4820a06..392ee46 100644 --- a/lib/views/signup_done.dart +++ b/lib/views/SignUpDoneScreen.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:suwon/views/widgets/normal_alert_dialog.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; -import 'package:suwon/views/login_screen.dart'; +import 'package:suwon/views/widgets/NormalAlertDialogWidget.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/LoginScreen.dart'; -class SignUpDone extends StatefulWidget { - const SignUpDone({super.key}); +class SignUpDoneScreen extends StatefulWidget { + const SignUpDoneScreen({super.key}); @override _SignUpDoneState createState() => _SignUpDoneState(); } -class _SignUpDoneState extends State { +class _SignUpDoneState extends State { bool showCheck = false; @override @@ -90,7 +90,7 @@ class _SignUpDoneState extends State { ), ], ), - CustomButton( + CustomButtonWidget( text: '로그인', color: Colors.black, border: Border.all(width: 1, color: Color(0xFF2D64D8)), @@ -99,7 +99,7 @@ class _SignUpDoneState extends State { Navigator.push( context, MaterialPageRoute( - builder: (context) => NewLoignMain(), + builder: (context) => LoginScreen(), ), ); }, @@ -107,11 +107,11 @@ class _SignUpDoneState extends State { SizedBox( height: 12.h, ), - CustomButton( + CustomButtonWidget( text: '메일 재발송', backgroundColor: Color(0xFF111111), onPressed: () { - NormalAlertDialog( + NormalAlertDialogWidget( title: "알림", message: "포털 메일이 재발송되었습니다.", onClose: () { diff --git a/lib/views/signup_creen.dart b/lib/views/SignUpScreen.dart similarity index 68% rename from lib/views/signup_creen.dart rename to lib/views/SignUpScreen.dart index 4d3283e..97402c7 100644 --- a/lib/views/signup_creen.dart +++ b/lib/views/SignUpScreen.dart @@ -1,20 +1,23 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:suwon/views/login_screen.dart'; -import 'package:suwon/views/signup_done.dart'; -import 'package:suwon/views/widgets/appbar.dart'; -import 'package:suwon/viewmodels/signup_viewmodel.dart'; +import 'package:suwon/views/EmailAuthentication.dart'; +import 'package:suwon/views/LoginScreen.dart'; +import 'package:suwon/views/SignUpDoneScreen.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/viewmodels/SignupVM.dart'; import 'package:provider/provider.dart'; -import 'package:suwon/views/widgets/csbutton.dart'; -import 'package:suwon/views/widgets/emailfield.dart'; -import 'package:suwon/views/widgets/font.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/widgets/EmailTextFieldWidget.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; -class SignupScreen extends StatelessWidget { +class SignUpScreen extends StatelessWidget { final GlobalKey _formKey = GlobalKey(); + SignUpScreen({super.key}); + @override Widget build(BuildContext context) { - final signupViewModel = Provider.of(context); + final signupViewModel = Provider.of(context); return ScreenUtilInit( designSize: Size(390, 844), builder: (context, child) => Scaffold( @@ -28,7 +31,7 @@ class SignupScreen extends StatelessWidget { Container( //상단바 margin: EdgeInsets.symmetric(horizontal: 20.w), - child: SuchatAppBar( + child: SuchatAppBarWidget( text: ' 회원가입', onPressed: () { signupViewModel.idController.clear(); @@ -38,7 +41,7 @@ class SignupScreen extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => NewLoignMain(), + builder: (context) => LoginScreen(), ), ); }, @@ -52,8 +55,29 @@ class SignupScreen extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - IdInputFD(), - SizedBox(height: 44.h), + SizedBox(height: 40.h), + IdInputFD( + labelText: '아이디', + hintText: '아이디 입력 (4~16자)', + controller: signupViewModel.idController, + showErrorText: signupViewModel.idError, + errorText: '* 4자 이상 16자 이내로 작성해 주세요', + onChanged: (value) => + signupViewModel.validateIdInput(value), + onPressed: () {}, + ), + SizedBox(height: 40.h), + IdInputFD( + labelText: '닉네임', + hintText: '닉네임 입력', + controller: signupViewModel.nicknameController, + showErrorText: signupViewModel.nicknameError, + errorText: '8자 이내로 작성해 주세요', + onChanged: (value) => + signupViewModel.validateNickNameInput(value), + onPressed: () {}, + ), + SizedBox(height: 40.h), PwInputFD( labelText: '비밀번호', showErrorText: signupViewModel.pwError, @@ -87,30 +111,27 @@ class SignupScreen extends StatelessWidget { ? Icons.visibility_off : Icons.visibility, ), - SizedBox(height: 46.h), - EmailFD( - controller: signupViewModel.emailController, - onChanged: (value) => - signupViewModel.isEmailValid), - SizedBox(height: 57.h), - CustomButton( - text: '회원가입', + SizedBox(height: 60.h), + CustomButtonWidget( + text: '다음', color: Colors.white, - backgroundColor: Color(0xFF111111), - onPressed: () { - Navigator.push( + backgroundColor: signupViewModel.btActivation + ? Colors.grey + : Color(0xFF111111), + onPressed: () async {}), + + /* Navigator.push( context, MaterialPageRoute( - builder: (context) => SignUpDone()), - ); - }), + builder: (context) => EmailAuth()), + );*/ SizedBox( height: 14.h, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - TextFont.fontSemiBold( + TextFontWidget.fontSemiBold( text: '회원가입 시 ', fontSize: 12.sp, color: Color(0xFF989898), @@ -119,13 +140,13 @@ class SignupScreen extends StatelessWidget { onTap: () { // 버튼이 클릭되었을 때 실행될 코드 }, - child: TextFont.fontSemiBold( + child: TextFontWidget.fontSemiBold( text: '서비스 이용약관', fontSize: 12.sp, color: Color(0xFF2D64D8), ), ), - TextFont.fontSemiBold( + TextFontWidget.fontSemiBold( text: ' 및 ', fontSize: 12.sp, color: Color(0xFF989898), @@ -134,7 +155,7 @@ class SignupScreen extends StatelessWidget { onTap: () { // 버튼이 클릭되었을 때 실행될 코드 }, - child: TextFont.fontSemiBold( + child: TextFontWidget.fontSemiBold( text: '개인정보 처리방침', fontSize: 12.sp, color: Color(0xFF2D64D8), @@ -142,7 +163,7 @@ class SignupScreen extends StatelessWidget { ), ], ), - TextFont.fontSemiBold( + TextFontWidget.fontSemiBold( text: '하신 것으로 간주됩니다', fontSize: 12.sp, color: Color(0xFF989898), @@ -161,37 +182,63 @@ class SignupScreen extends StatelessWidget { } class IdInputFD extends StatelessWidget { + final String labelText; + final String hintText; + final TextEditingController controller; + final Function(String) onChanged; + final bool showErrorText; + final String errorText; + final VoidCallback? onPressed; + + IdInputFD({ + required this.labelText, + required this.hintText, + required this.controller, + required this.onChanged, + required this.showErrorText, + required this.errorText, + this.onPressed, + }); + + // 에러 메시지 위젯 + Widget errorTextWidget() { + if (showErrorText) { + return Text( + errorText, + style: TextStyle(color: Colors.red), + ); + } else { + return Container(); // 에러가 없으면 빈 컨테이너 반환 + } + } + @override Widget build(BuildContext context) { - final signupViewModel = Provider.of(context); return Column( children: [ Row( children: [ SizedBox(width: 8.w), Text( - '아이디', + labelText, style: TextStyle( - fontFamily: 'Pretendard-Regular', - fontSize: 16.sp, - fontWeight: FontWeight.w400), + fontFamily: 'Pretendard-Regular', + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), ), SizedBox( width: 12.w, ), - if (signupViewModel.idError) - Text( - '* 4자 이상 16자 이내로 작성해 주세요', - style: TextStyle(color: Colors.red), - ), + errorTextWidget(), // 에러 메시지 위젯 추가 ], ), SizedBox(height: 8.h), SizedBox( height: 50.h, child: TextFormField( - controller: signupViewModel.idController, - onChanged: (value) => signupViewModel.validateIdInput(value), + controller: controller, + onChanged: onChanged, decoration: InputDecoration( border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), @@ -200,7 +247,7 @@ class IdInputFD extends StatelessWidget { fontFamily: 'Pretendard-Light', fontSize: 14.sp, ), - hintText: '아이디 입력 (4~16자)', + hintText: hintText, contentPadding: EdgeInsets.only(top: 10, bottom: 17, left: 10, right: 10), suffix: Container( @@ -211,9 +258,13 @@ class IdInputFD extends StatelessWidget { color: Color(0xFF2D64D8), ), child: TextButton( - onPressed: () {}, - child: TextFont.fontRegular( - color: Color(0xFFFFFFFF), fontSize: 14, text: '중복 확인')), + onPressed: onPressed ?? () {}, // onPressed가 null이 아닐 때만 사용 + child: TextFontWidget.fontRegular( + color: Color(0xFFFFFFFF), + fontSize: 14, + text: '중복 확인', + ), + ), ), ), ), diff --git a/lib/views/TermsConditionsDrawerScreen.dart b/lib/views/TermsConditionsDrawerScreen.dart new file mode 100644 index 0000000..614aada --- /dev/null +++ b/lib/views/TermsConditionsDrawerScreen.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:suwon/views/widgets/DrawerAppBarWidget.dart'; + +class TermsConditionsDrawerScreen extends StatelessWidget { + final GlobalKey _formKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return ScreenUtilInit( + designSize: Size(390, 844), + builder: (context, child) => Scaffold( + resizeToAvoidBottomInset: false, + body: Container( + margin: EdgeInsets.only(top: 88.h), + child: Form( + key: _formKey, + child: Column( + children: [ + Container( + //상단바 + margin: EdgeInsets.symmetric(horizontal: 20.w), + child: DrawerAppBarWidget( + text: '이용약관', + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + ], + ), + ), + )), + ); + } +} diff --git a/lib/views/widgets/cancel_and_action_alert_dialog.dart b/lib/views/widgets/CancelAndActionAlertDialogWidget.dart similarity index 92% rename from lib/views/widgets/cancel_and_action_alert_dialog.dart rename to lib/views/widgets/CancelAndActionAlertDialogWidget.dart index 6188789..2c3642d 100644 --- a/lib/views/widgets/cancel_and_action_alert_dialog.dart +++ b/lib/views/widgets/CancelAndActionAlertDialogWidget.dart @@ -1,12 +1,12 @@ import 'package:flutter/cupertino.dart'; -class CancelAndActionAlertDialog { +class CancelAndActionAlertDialogWidget { final String title; final String action; final VoidCallback onCancel; final VoidCallback onAction; - CancelAndActionAlertDialog({ + CancelAndActionAlertDialogWidget({ required this.title, required this.action, required this.onCancel, diff --git a/lib/views/widgets/csbutton.dart b/lib/views/widgets/CustomButtonWidget.dart similarity index 88% rename from lib/views/widgets/csbutton.dart rename to lib/views/widgets/CustomButtonWidget.dart index 5b6b268..6d61e9f 100644 --- a/lib/views/widgets/csbutton.dart +++ b/lib/views/widgets/CustomButtonWidget.dart @@ -1,19 +1,21 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -class CustomButton extends StatelessWidget { +class CustomButtonWidget extends StatelessWidget { final String text; final Color backgroundColor; final VoidCallback onPressed; final Border? border; final Color color; + final bool? isEnabled; - const CustomButton({ + const CustomButtonWidget({ required this.text, required this.backgroundColor, required this.onPressed, required this.color, this.border, + this.isEnabled, }); @override diff --git a/lib/views/widgets/DrawerAppBarWidget.dart b/lib/views/widgets/DrawerAppBarWidget.dart new file mode 100644 index 0000000..0c1f8dc --- /dev/null +++ b/lib/views/widgets/DrawerAppBarWidget.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class DrawerAppBarWidget extends StatelessWidget { + final String text; + final VoidCallback onPressed; + + const DrawerAppBarWidget({ + required this.text, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + double iconScale = 4.sp; + double iconButtonPadding = 40.sp; + + return Container( + width: double.maxFinite, + height: 40.h, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 아이콘 맨 오른쪽 정렬 위해서 왼쪽에 더미공간 추가 + SizedBox( + width: iconScale + iconButtonPadding, + height: iconScale + iconButtonPadding, + ), + Container( + alignment: Alignment.center, + child: Text( + text, + style: TextStyle( + fontFamily: 'Pretendard-Regular', + fontSize: 18.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + IconButton( + onPressed: onPressed, + icon: Image.asset( + 'assets/close.png', + scale: iconScale, + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/widgets/emailfield.dart b/lib/views/widgets/EmailTextFieldWidget.dart similarity index 87% rename from lib/views/widgets/emailfield.dart rename to lib/views/widgets/EmailTextFieldWidget.dart index 6dc668c..0eeaaa5 100644 --- a/lib/views/widgets/emailfield.dart +++ b/lib/views/widgets/EmailTextFieldWidget.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:suwon/views/widgets/font.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; -class EmailFD extends StatelessWidget { +class EmailTextFieldWidget extends StatelessWidget { final TextEditingController? controller; final ValueChanged? onChanged; - const EmailFD({ + const EmailTextFieldWidget({ required this.controller, required this.onChanged, }); @@ -34,7 +34,7 @@ class EmailFD extends StatelessWidget { fontWeight: FontWeight.w400, color: Color(0xFF989898), ), - suffix: TextFont.fontRegular( + suffix: TextFontWidget.fontRegular( text: '@ suwon.ac.kr', fontSize: 16, color: Color(0xFF000000)), diff --git a/lib/views/widgets/idfield.dart b/lib/views/widgets/IdTextFieldWidget.dart similarity index 89% rename from lib/views/widgets/idfield.dart rename to lib/views/widgets/IdTextFieldWidget.dart index f377490..cbb338e 100644 --- a/lib/views/widgets/idfield.dart +++ b/lib/views/widgets/IdTextFieldWidget.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:suwon/views/widgets/font.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; -class IdFD extends StatelessWidget { +class IdTextFieldWidget extends StatelessWidget { final TextEditingController? controller; final ValueChanged? onChanged; - const IdFD({ + const IdTextFieldWidget({ required this.controller, required this.onChanged, -}); + }); @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/normal_alert_dialog.dart b/lib/views/widgets/NormalAlertDialogWidget.dart similarity index 92% rename from lib/views/widgets/normal_alert_dialog.dart rename to lib/views/widgets/NormalAlertDialogWidget.dart index 0280c60..209ad5c 100644 --- a/lib/views/widgets/normal_alert_dialog.dart +++ b/lib/views/widgets/NormalAlertDialogWidget.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; -class NormalAlertDialog { +class NormalAlertDialogWidget { final String title; final String message; final VoidCallback onClose; - NormalAlertDialog({ + NormalAlertDialogWidget({ required this.title, required this.message, required this.onClose, diff --git a/lib/views/widgets/appbar.dart b/lib/views/widgets/SuchatAppBarWidget.dart similarity index 95% rename from lib/views/widgets/appbar.dart rename to lib/views/widgets/SuchatAppBarWidget.dart index 6c50e1f..e3ff747 100644 --- a/lib/views/widgets/appbar.dart +++ b/lib/views/widgets/SuchatAppBarWidget.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -class SuchatAppBar extends StatelessWidget { +class SuchatAppBarWidget extends StatelessWidget { final String text; final VoidCallback onPressed; - const SuchatAppBar({ + const SuchatAppBarWidget({ required this.text, required this.onPressed, }); diff --git a/lib/views/widgets/font.dart b/lib/views/widgets/TextFontWidget.dart similarity index 97% rename from lib/views/widgets/font.dart rename to lib/views/widgets/TextFontWidget.dart index 6c93f7e..ae651a6 100644 --- a/lib/views/widgets/font.dart +++ b/lib/views/widgets/TextFontWidget.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -class TextFont { +class TextFontWidget { static Widget fontRegular({ required String text, required double fontSize, diff --git a/pubspec.lock b/pubspec.lock index 0b95113..73718ad 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,18 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.18.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -99,14 +107,30 @@ packages: description: flutter source: sdk version: "0.0.0" - js: + http: + dependency: "direct main" + description: + name: http + sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba + url: "https://pub.dev" + source: hosted + version: "1.2.0" + http_parser: dependency: transitive description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "4.0.2" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: "0aa7409f6c82acfab96853b8b0c7503de49918cbe705a57cfdeb477756b4521b" + url: "https://pub.dev" + source: hosted + version: "4.1.0" lints: dependency: transitive description: @@ -119,26 +143,26 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" nested: dependency: transitive description: @@ -188,26 +212,34 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stomp_dart_client: + dependency: "direct main" + description: + name: stomp_dart_client + sha256: "10ecb6255a95eec78c3b064512fc8700cd2af9506cedafe3694e9662773dd1d5" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.0.3" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -228,10 +260,18 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "1.3.2" vector_graphics: dependency: transitive description: @@ -264,6 +304,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" xml: dependency: transitive description: @@ -273,5 +329,5 @@ packages: source: hosted version: "6.3.0" sdks: - dart: ">=3.0.3 <4.0.0" + dart: ">=3.2.0 <4.0.0" flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 940e218..d3a5333 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: suwon description: flag project # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: "none" # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=3.0.3 <4.0.0' + sdk: ">=3.0.3 <4.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -30,11 +30,18 @@ environment: dependencies: flutter_svg: ^2.0.7 flutter_screenutil: ^5.8.4 - + flutter: sdk: flutter + provider: ^6.0.5 + + http: ^1.2.0 + + stomp_dart_client: ^1.0.3 + json_annotation: ^4.0.1 + # The following adds the Cupertino Icons font to your application. @@ -57,7 +64,6 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. @@ -65,9 +71,9 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - - asstes/bubble.PNG - - asstes/SUCHAT.png - - asstes/ + - assets/bubble.PNG + - assets/SUCHAT.png + - assets/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware @@ -83,19 +89,19 @@ flutter: fonts: - family: KCCChassam fonts: - - asset: asstes/font/KCC-Chassam.ttf + - asset: assets/font/KCC-Chassam.ttf style: normal - family: Pretendard-Light fonts: - - asset: asstes/font/Pretendard-Light.ttf + - asset: assets/font/Pretendard-Light.ttf style: normal - family: Pretendard-SemiBold fonts: - - asset: asstes/font/Pretendard-SemiBold.ttf + - asset: assets/font/Pretendard-SemiBold.ttf style: normal - family: Pretendard-Regular fonts: - - asset: asstes/font/Pretendard-Regular.ttf + - asset: assets/font/Pretendard-Regular.ttf style: normal # diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/web/icons/Icon-maskable-512.png differ diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..d92431e --- /dev/null +++ b/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + toon_flix + + + + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..a56629f --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "suwon", + "short_name": "suwon", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +}