diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a28ca51..26b1ba3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,16 +27,16 @@ jobs: - name: Build Flutter macOS App run: flutter build macos --release - - # Step 4: Create the DMG file + # Step 3: Create the DMG file - name: Create DMG run: | mkdir -p dist - hdiutil create -volname "venera" -srcfolder build/macos/Build/Products/Release/venera.app -ov -format UDZO "dist/venera.dmg" + mkdir -p dist/dmg_contents + cp -R build/macos/Build/Products/Release/venera.app dist/dmg_contents/ + ln -s /Applications dist/dmg_contents/Applications + hdiutil create -volname "venera" -srcfolder dist/dmg_contents -ov -format UDZO "dist/venera.dmg" - - - # Step 8: Attach and upload artifacts (optional) + # Step 4: Attach and upload artifacts (optional) - name: Upload DMG uses: actions/upload-artifact@v3 with: diff --git a/lib/pages/accounts_page.dart b/lib/pages/accounts_page.dart index 8267e6c..121ad37 100644 --- a/lib/pages/accounts_page.dart +++ b/lib/pages/accounts_page.dart @@ -173,84 +173,88 @@ class _LoginPageState extends State<_LoginPage> { child: Container( padding: const EdgeInsets.all(16), constraints: const BoxConstraints(maxWidth: 400), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text("Login".tl, style: const TextStyle(fontSize: 24)), - const SizedBox(height: 32), - if (widget.config.cookieFields == null) - TextField( - decoration: InputDecoration( - labelText: "Username".tl, - border: const OutlineInputBorder(), - ), - enabled: widget.config.login != null, - onChanged: (s) { - username = s; - }, - ).paddingBottom(16), - if (widget.config.cookieFields == null) - TextField( - decoration: InputDecoration( - labelText: "Password".tl, - border: const OutlineInputBorder(), - ), - obscureText: true, - enabled: widget.config.login != null, - onChanged: (s) { - password = s; - }, - onSubmitted: (s) => login(), - ).paddingBottom(16), - for (var field in widget.config.cookieFields ?? []) - TextField( - decoration: InputDecoration( - labelText: field, - border: const OutlineInputBorder(), - ), - obscureText: true, - enabled: widget.config.validateCookies != null, - onChanged: (s) { - _cookies[field] = s; - }, - ).paddingBottom(16), - if (widget.config.login == null && - widget.config.cookieFields == null) - Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon(Icons.error_outline), - const SizedBox(width: 8), - Text("Login with password is disabled".tl), - ], - ) - else - Button.filled( - isLoading: loading, - onPressed: login, - child: Text("Continue".tl), - ), - const SizedBox(height: 24), - if (widget.config.loginWebsite != null) - TextButton( - onPressed: loginWithWebview, - child: Text("Login with webview".tl), - ), - const SizedBox(height: 8), - if (widget.config.registerWebsite != null) - TextButton( - onPressed: () => - launchUrlString(widget.config.registerWebsite!), - child: Row( + child: AutofillGroup( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text("Login".tl, style: const TextStyle(fontSize: 24)), + const SizedBox(height: 32), + if (widget.config.cookieFields == null) + TextField( + decoration: InputDecoration( + labelText: "Username".tl, + border: const OutlineInputBorder(), + ), + enabled: widget.config.login != null, + onChanged: (s) { + username = s; + }, + autofillHints: const [AutofillHints.username], + ).paddingBottom(16), + if (widget.config.cookieFields == null) + TextField( + decoration: InputDecoration( + labelText: "Password".tl, + border: const OutlineInputBorder(), + ), + obscureText: true, + enabled: widget.config.login != null, + onChanged: (s) { + password = s; + }, + onSubmitted: (s) => login(), + autofillHints: const [AutofillHints.password], + ).paddingBottom(16), + for (var field in widget.config.cookieFields ?? []) + TextField( + decoration: InputDecoration( + labelText: field, + border: const OutlineInputBorder(), + ), + obscureText: true, + enabled: widget.config.validateCookies != null, + onChanged: (s) { + _cookies[field] = s; + }, + ).paddingBottom(16), + if (widget.config.login == null && + widget.config.cookieFields == null) + Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.link), + const Icon(Icons.error_outline), const SizedBox(width: 8), - Text("Create Account".tl), + Text("Login with password is disabled".tl), ], + ) + else + Button.filled( + isLoading: loading, + onPressed: login, + child: Text("Continue".tl), ), - ), - ], + const SizedBox(height: 24), + if (widget.config.loginWebsite != null) + TextButton( + onPressed: loginWithWebview, + child: Text("Login with webview".tl), + ), + const SizedBox(height: 8), + if (widget.config.registerWebsite != null) + TextButton( + onPressed: () => + launchUrlString(widget.config.registerWebsite!), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.link), + const SizedBox(width: 8), + Text("Create Account".tl), + ], + ), + ), + ], + ), ), ), ), diff --git a/lib/pages/webview.dart b/lib/pages/webview.dart index c16c3b4..e31fd97 100644 --- a/lib/pages/webview.dart +++ b/lib/pages/webview.dart @@ -98,14 +98,14 @@ class _AppWebviewState extends State { 0), items: [ PopupMenuItem( - child: Text("Open in browser".tl), - onTap: () async => - launchUrlString((await controller?.getUrl())!.path), + child: Text("Open in browser".tl), + onTap: () async => + launchUrlString((await controller?.getUrl())!.toString()), ), PopupMenuItem( - child: Text("Copy link".tl), - onTap: () async => Clipboard.setData(ClipboardData( - text: (await controller?.getUrl())!.path)), + child: Text("Copy link".tl), + onTap: () async => Clipboard.setData(ClipboardData( + text: (await controller?.getUrl())!.toString())), ), PopupMenuItem( child: Text("Reload".tl),