From 2a9ab0ddc50b2c4e89781451a392209b90a55490 Mon Sep 17 00:00:00 2001 From: chan Date: Tue, 16 Jun 2026 16:49:14 +0900 Subject: [PATCH] =?UTF-8?q?userfront:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=8B=9C=20=EA=B8=B0=EB=B3=B8=20=EA=B0=9C=EC=9D=B8?= =?UTF-8?q?(Personal)=20=ED=85=8C=EB=84=8C=ED=8A=B8=20=EA=B0=80=EC=9E=85,?= =?UTF-8?q?=20=EA=B8=B0=EC=97=85=20=EC=86=8C=EC=86=8D=EC=9D=80=20=EB=B3=84?= =?UTF-8?q?=EB=8F=84=20=EB=AC=B8=EC=9D=98=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=95=88=EB=82=B4=20=EC=B9=B4=EB=93=9C=EB=A1=9C=20=EA=B0=9C?= =?UTF-8?q?=ED=8E=B8=20(#1183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/presentation/signup_screen.dart | 139 +++++++++++++----- 1 file changed, 99 insertions(+), 40 deletions(-) diff --git a/userfront/lib/features/auth/presentation/signup_screen.dart b/userfront/lib/features/auth/presentation/signup_screen.dart index 20afee5f..e0b9cd37 100644 --- a/userfront/lib/features/auth/presentation/signup_screen.dart +++ b/userfront/lib/features/auth/presentation/signup_screen.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'package:userfront/i18n.dart'; import '../../../core/i18n/locale_utils.dart'; import '../../../core/services/auth_proxy_service.dart'; @@ -1788,24 +1789,88 @@ Matters not expressly provided in this Policy are governed by the Company's inte crossAxisAlignment: CrossAxisAlignment.stretch, children: [ if (_affiliationType == 'AFFILIATE') ...[ - const SizedBox(height: 14), - DropdownButtonFormField( - key: ValueKey(_companyCode ?? 'none'), - initialValue: _companyCode, - decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.profile.company', + const SizedBox(height: 16), + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .primaryContainer + .withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Theme.of(context) + .colorScheme + .primary + .withValues(alpha: 0.25), ), - border: const OutlineInputBorder(), ), - items: _tenants.map((t) { - return DropdownMenuItem( - value: t['slug'], - child: Text(t['name'] ?? t['slug']), - ); - }).toList(), - onChanged: (val) => - setState(() => _companyCode = val), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Icon( + Icons.business, + color: Theme.of(context) + .colorScheme + .primary, + size: 24, + ), + const SizedBox(width: 10), + Expanded( + child: Text( + '기업 소속 가입 안내', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 15, + color: Theme.of(context) + .colorScheme + .primary, + ), + ), + ), + ], + ), + const SizedBox(height: 12), + Text( + '기업/가족사 소속 회원은 바로 가입하는 대신 별도 문의를 통해 가입 및 워크스페이스 연동이 진행됩니다.\n\n아래 버튼을 눌러 담당자에게 가입 문의 이메일을 보내거나 baroncs@baroncs.co.kr로 직접 문의해 주시기 바랍니다.', + style: TextStyle( + fontSize: 13, + height: 1.5, + color: _signupInk + .withValues(alpha: 0.8), + ), + ), + const SizedBox(height: 16), + FilledButton.icon( + onPressed: () async { + final Uri emailUri = Uri( + scheme: 'mailto', + path: 'baroncs@baroncs.co.kr', + query: Uri.encodeFull( + 'subject=[Baron SSO] 기업 소속 가입 및 연동 문의', + ), + ); + if (await canLaunchUrl(emailUri)) { + await launchUrl(emailUri); + } + }, + icon: const Icon(Icons.mail_outline, + size: 18), + label: const Text('기업 소속 문의하기'), + style: FilledButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(8), + ), + padding: const EdgeInsets.symmetric( + vertical: 12), + ), + ), + ], + ), ), ], ], @@ -1814,30 +1879,26 @@ Matters not expressly provided in this Policy are governed by the Company's inte ], ), ), - const SizedBox(height: 18), - _buildProfileFieldGroup( - title: _affiliationType == 'AFFILIATE' - ? tr('ui.userfront.signup.profile.department') - : tr( + if (_affiliationType == 'GENERAL') ...[ + const SizedBox(height: 18), + _buildProfileFieldGroup( + title: tr( + 'ui.userfront.signup.profile.department_optional', + ), + description: '선택 입력 항목입니다.', + isDesktop: isDesktop, + child: TextFormField( + controller: _deptController, + onChanged: (_) => setState(() {}), + decoration: InputDecoration( + labelText: tr( 'ui.userfront.signup.profile.department_optional', ), - description: _affiliationType == 'AFFILIATE' - ? '가족사 사용자는 부서명을 입력해주세요.' - : '선택 입력 항목입니다.', - isDesktop: isDesktop, - child: TextFormField( - controller: _deptController, - onChanged: (_) => setState(() {}), - decoration: InputDecoration( - labelText: _affiliationType == 'AFFILIATE' - ? tr('ui.userfront.signup.profile.department') - : tr( - 'ui.userfront.signup.profile.department_optional', - ), - border: const OutlineInputBorder(), + border: const OutlineInputBorder(), + ), ), ), - ), + ], ], ), ), @@ -2317,10 +2378,8 @@ Matters not expressly provided in this Policy are governed by the Company's inte if (_affiliationType == 'GENERAL') { canGoNext = nameOk; } else { - // AFFILIATE 필수: 이름 + 가족사 선택 + 부서명 - final companyOk = _companyCode != null; - final deptOk = _deptController.text.trim().isNotEmpty; - canGoNext = nameOk && companyOk && deptOk; + // 기업 소속(AFFILIATE)인 경우 직접 가입 대신 문의로 안내하므로 다음 단계 진행을 차단합니다. + canGoNext = false; } }