feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add re request perm logic - #685

Merged
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms
Jan 20, 2026
Merged

feat: add re request perm logic#685
coodos merged 8 commits into
mainfrom
fix(eid-w)/reprompt-for-missing-camera-perms

Conversation

@sosweetham

@sosweethamsosweetham commented Jan 19, 2026

Copy link
Copy Markdown
Member

Description of change

adds a go back button and a open settings button to open the page to allow camera permissions on scan page fallback which is used when the perm is not given

Issue Number

Closes#637
Closes#669

Type of change

  • Fix (a change which fixes an issue)

How the change has been tested

Manual

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Unified camera permission flow with a reusable permission dialog and manager for consistent behavior in Scan QR, selfie, and passport flows.
    • New actions to open app settings and retry permission checks from relevant screens.
  • Chores

    • Added mobile permission to allow opening app settings from the scanner.
    • App identifier updated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 19, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds a camera-permission manager, a permission dialog UI, and permission-aware flows across scan, passport, and selfie features; updates Tauri mobile capabilities and the app identifier.

Changes

Cohort / File(s)Summary
Tauri config & capabilities
infrastructure/eid-wallet/src-tauri/capabilities/mobile.json, infrastructure/eid-wallet/src-tauri/tauri.conf.json
Added permission barcode-scanner:allow-open-app-settings and changed app identifier from foundation.metastate.eid-walletcom.kodski.eid-wallet.
Scan QR page & logic
infrastructure/eid-wallet/src/routes/(app)/scan-qr/+page.svelte, infrastructure/eid-wallet/src/routes/(app)/scan-qr/scanLogic.ts
Introduced cameraPermissionDenied store; added actions retryPermission and handleOpenSettings; startScan now checks native permission and surfaces a permission-denied dialog instead of proceeding when denied.
Camera permission manager
infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts, infrastructure/eid-wallet/src/lib/utils/index.ts
New createCameraPermissionManager exposing permissionState and methods checkAndRequestPermission, retryPermission, openSettings; re-exported from utils index.
Permission dialog UI
infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte, .../index.ts, src/lib/ui/index.ts
New Drawer-based CameraPermissionDialog component with Open Settings and optional Go Back actions; added re-exports to UI index.
Passport & Selfie flows
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte, infrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte
Replaced inline permission checks with the permission manager; added dialog display logic and Open Settings wiring; request flows now consult manager before obtaining camera streams.

Sequence Diagram

sequenceDiagram
participant User
participant UI as App UI
participant PM as CameraPermissionManager
participant OS as Mobile OS
participant Camera as Camera API
User->>UI: Trigger camera flow (Scan / Passport / Selfie)
UI->>PM: checkAndRequestPermission()
PM->>OS: checkPermissions / requestPermissions
alt granted
OS-->>PM: granted
PM-->>UI: true
UI->>Camera: getMainCameraStream / getFrontCameraStream
Camera-->>UI: stream
else denied
OS-->>PM: denied
PM-->>UI: false
UI->>UI: show CameraPermissionDialog
opt User opens settings
User->>UI: Open Settings
UI->>PM: openSettings()
PM->>OS: openAppSettings()
end
opt User retries
User->>UI: Retry
UI->>PM: retryPermission()
PM->>OS: checkPermissions
end
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Fix/final UI fixes #301 — modifies scan-qr permission handling and startScan logic (closely related to the scan permission flow changes).

Suggested reviewers

  • coodos
  • ananyayaya129

Poem

🐰 I hopped where camera shadows play,
A gentle drawer shows the missing way.
“Open Settings” shines a guiding light,
Retry or go back — the scan takes flight. 📸✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (2 warnings, 1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe PR includes an unrelated Tauri app identifier change from 'foundation.metastate.eid-wallet' to 'com.kodski.eid-wallet' and a barcode-scanner permission addition not directly tied to the camera permission UX fix.Separate the identifier and barcode-scanner permission changes into a distinct PR; keep this PR focused solely on camera permission UX improvements.
Docstring Coverage⚠️ WarningDocstring coverage is 40.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check❓ InconclusiveThe title 'feat: add re request perm logic' is vague and uses abbreviated terminology that doesn't clearly describe the feature.Clarify the title with complete words and specific functionality, e.g., 'feat: add camera permission retry and settings access for QR scan'.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedThe implementation successfully addresses issue #637 by adding camera permission UI flow, retry logic, and settings access to inform users and enable permission granting.
Description check✅ PassedThe PR description covers all required template sections with appropriate detail for a fix addressing camera permission UX, though the description text is somewhat informal.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodoscoodos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosweetham we need to address the same problem in the KYC Pages as well when a user is doing KYC they may reject the camera prompt

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@infrastructure/eid-wallet/src/lib/ui/CameraPermissionDialog/CameraPermissionDialog.svelte`:
- Around line 22-34: The handleSwipe function is currently always passed to
<Drawer> allowing local isOpen toggles even when dismissible is false or
onOpenChange is absent; either remove handleSwipe entirely or guard wiring so
swipe only changes state when dismissible is true and onOpenChange exists.
Update the component to conditionally pass handleSwipe (or make handleSwipe
no-op) based on the dismissible prop and presence of onOpenChange, ensuring you
reference the handleSwipe function, the isOpen variable, the onOpenChange
callback, and the Drawer component when making the change.
In `@infrastructure/eid-wallet/src/lib/utils/cameraPermission.ts`:
- Around line 66-74: The computed isDenied boolean is currently set to
!isGranted which incorrectly treats non-granted states like "prompt" as denied;
change the calculation to isDenied = permissions === "denied" and update the
permissionState.set call to use that value (keeping status, isGranted, isDenied,
isChecking fields) so the stored state accurately represents the denied state;
also update any type/signature for the permission state if necessary and
run/adjust any code or tests that reference permissionState.isDenied (e.g.,
retryPermission) to ensure behavior remains correct.
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/selfie.svelte:
- Around line 49-51: Make handleOpenSettings() async and after awaiting
openSettings(), re-invoke requestCameraPermission() to re-check and update the
camera permission state when the user returns from system settings; update the
handleOpenSettings() functions in both selfie.svelte (handleOpenSettings) and
passport.svelte (handleOpenSettings) so they await openSettings() and then call
requestCameraPermission() to refresh the UI/permission dialog accordingly.
♻️ Duplicate comments (2)
infrastructure/eid-wallet/src/routes/(auth)/verify/steps/passport.svelte (2)

87-107: Same guard needed for permission-check errors as in the selfie flow.


111-113: Same missing retry/re-check after opening settings as in the selfie flow.

Also applies to: 448-453

Comment threadinfrastructure/eid-wallet/src/lib/utils/cameraPermission.ts
Comment threadinfrastructure/eid-wallet/src/routes/(auth)/verify/steps/selfie.svelte Outdated
Comment threadinfrastructure/eid-wallet/src-tauri/tauri.conf.json

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@infrastructure/eid-wallet/src/routes/`(auth)/verify/steps/passport.svelte:
- Around line 88-105: The call to checkAndRequestPermission() in
requestCameraPermission can throw and currently isn't caught; wrap the call in a
try/catch inside requestCameraPermission (before attempting getMainCameraStream)
so any thrown error will set permissionGranted.set(false), set
showPermissionDialog = true (and optionally log the error) and return,
preventing the function from rejecting and leaving the UI broken; keep the
existing try/catch around getMainCameraStream unchanged and ensure
requestCameraPermission handles both permission rejections and thrown errors
from checkAndRequestPermission().

…thub.com:MetaState-Prototype-Project/prototype into fix(eid-w)/reprompt-for-missing-camera-perms
@sosweetham

Copy link
Copy Markdown
MemberAuthor

@coodos

@coodos
coodos merged commit cefb6ed into mainJan 20, 2026
4 checks passed
@coodos
coodos deleted the fix(eid-w)/reprompt-for-missing-camera-perms branch January 20, 2026 09:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Permissions issue in eid wallet [Bug] [in-app] User unaware that camera permission is missing for QR scan

2 participants

@sosweetham@coodos