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"
+ }
+ ]
+}