diff --git a/locales/ara.json b/locales/ara.json index f66a526e3..7e26832a4 100644 --- a/locales/ara.json +++ b/locales/ara.json @@ -239,7 +239,15 @@ "header": "تفاصيل {{vcLabel}}", "acceptRequest": "قبول الطلب واستلام {{vcLabel}}", "acceptRequestAndVerify": "قبول الطلب والتحقق", - "reject": "رفض" + "reject": "رفض", + "discard": "ينبذ", + "goToReceivedVCTab": "منظر تلقى {{vcLabel}}", + "errors": { + "savingFailed": { + "title": "فشل ل يحفظ {{vcLabel}}", + "message": "شئ ما ذهب خطأ بينما إنقاذ {{vcLabel}} ل ال محل." + } + } }, "RequestScreen": { "bluetoothDenied": "الرجاء تمكين Bluetooth لتتمكن من طلب{{vcLabel}}", diff --git a/locales/en.json b/locales/en.json index e33f57953..6d01ff766 100644 --- a/locales/en.json +++ b/locales/en.json @@ -244,7 +244,15 @@ "header": "{{vcLabel}} details", "save": "Save {{vcLabel}}", "verifyAndSave": "Verify and save", - "discard": "Discard" + "reject": "Reject", + "discard": "Discard", + "goToReceivedVCTab": "View Received {{vcLabel}}", + "errors": { + "savingFailed": { + "title": "Failed to save {{vcLabel}}", + "message": "Something went wrong while saving {{vcLabel}} to the store." + } + } }, "RequestScreen": { "bluetoothDenied": "Please enable Bluetooth to be able to request {{vcLabel}}", diff --git a/locales/fil.json b/locales/fil.json index 3dea2bf07..a2693b702 100644 --- a/locales/fil.json +++ b/locales/fil.json @@ -235,7 +235,15 @@ "ReceiveVcScreen": { "header": "Mga detalye ng {{vcLabel}}", "acceptRequest": "Tanggapin ang kahilingan at tumanggap ng {{vcLabel}}", - "reject": "Tanggihan" + "reject": "Tanggihan", + "discard": "Itapon", + "goToReceivedVCTab": "Tingnan ang mga Natanggap na {{vcLabel}}", + "errors": { + "savingFailed": { + "title": "Nabigong i-save ang {{vcLabel}}", + "message": "Nagkaproblema habang nagse-save ng {{vcLabel}} sa tindahan." + } + } }, "RequestScreen": { "bluetoothDenied": "Mangyaring paganahin ang Bluetooth upang makahiling ng {{vcLabel}}", diff --git a/locales/hin.json b/locales/hin.json index 7e00f088c..6ff81138b 100644 --- a/locales/hin.json +++ b/locales/hin.json @@ -239,7 +239,15 @@ "header": "{{vcLabel}} विवरण", "acceptRequest": "अनुरोध स्वीकार करें और {{vcLabel}} प्राप्त करें", "acceptRequestAndVerify": "अनुरोध स्वीकार करें और सत्यापित करें", - "reject": "अस्वीकार" + "reject": "अस्वीकार", + "discard": "खारिज करना", + "goToReceivedVCTab": "प्राप्त {{vcLabel}} देखें", + "errors": { + "savingFailed": { + "title": "{{vcLabel}} सहेजने में विफल", + "message": "{{vcLabel}} को स्टोर में सेव करते समय कोई गड़बड़ी हुई." + } + } }, "RequestScreen": { "bluetoothDenied": "कृपया ब्लूटूथ को सक्षम करें ताकि वह {{vcLabel}} का अनुरोध कर सके", diff --git a/locales/kan.json b/locales/kan.json index 10fd29e0d..0686ec06a 100644 --- a/locales/kan.json +++ b/locales/kan.json @@ -239,7 +239,15 @@ "header": "{{vcLabel}} ವಿವರಗಳು", "acceptRequest": "ವಿನಂತಿಯನ್ನು ಸ್ವೀಕರಿಸಿ ಮತ್ತು {{vcLabel}} ಸ್ವೀಕರಿಸಿ", "acceptRequestAndVerify": "ವಿನಂತಿಯನ್ನು ಸ್ವೀಕರಿಸಿ ಮತ್ತು ಪರಿಶೀಲಿಸಿ", - "reject": "ತಿರಸ್ಕರಿಸಿ" + "reject": "ತಿರಸ್ಕರಿಸಿ", + "discard": "ತಿರಸ್ಕರಿಸು", + "goToReceivedVCTab": "ಸ್ವೀಕರಿಸಿದ {{vcLabel}} ವೀಕ್ಷಿಸಿ", + "errors": { + "savingFailed": { + "title": "{{vcLabel}} ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ", + "message": "ಸ್ಟೋರ್‌ನಲ್ಲಿ {{vcLabel}} ಉಳಿಸುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ." + } + } }, "RequestScreen": { "bluetoothDenied": "ವಿನಂತಿಸಲು ಬ್ಲೂಟೂತ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ{{vcLabel}}", diff --git a/locales/tam.json b/locales/tam.json index 40d573343..0f238f689 100644 --- a/locales/tam.json +++ b/locales/tam.json @@ -239,7 +239,15 @@ "header": "{{vcLabel}} விவரங்கள்", "acceptRequest": "கோரிக்கையை ஏற்று {{vcLabel}} ஐப் பெறவும்", "acceptRequestAndVerify": "கோரிக்கையை ஏற்று சரிபார்க்கவும்", - "reject": "நிராகரிக்கவும்" + "reject": "நிராகரிக்கவும்", + "discard": "நிராகரிக்கவும்", + "goToReceivedVCTab": "பெறப்பட்ட {{vcLabel}}களைப் பார்க்கவும் ", + "errors": { + "savingFailed": { + "title": "{{vcLabel}}ஐ சேமிப்பதில் தோல்வி", + "message": "கடையில் {{vcLabel}}ஐ சேமிக்கும் போது ஏதோ தவறு ஏற்பட்டது." + } + } }, "RequestScreen": { "bluetoothDenied": "{{vcLabel}}ஐக் கோர புளூடூத்தை இயக்கவும்", diff --git a/machines/openIdBle/request.ts b/machines/openIdBle/request.ts index 2e70f39d2..e17ed9873 100644 --- a/machines/openIdBle/request.ts +++ b/machines/openIdBle/request.ts @@ -51,6 +51,7 @@ const model = createModel( events: { ACCEPT: () => ({}), ACCEPT_AND_VERIFY: () => ({}), + GO_TO_RECEIVED_VC_TAB: () => ({}), REJECT: () => ({}), CANCEL: () => ({}), DISMISS: () => ({}), @@ -66,6 +67,7 @@ const model = createModel( BLUETOOTH_DISABLED: () => ({}), STORE_READY: () => ({}), STORE_RESPONSE: (response: unknown) => ({ response }), + STORE_ERROR: () => ({}), RECEIVE_DEVICE_INFO: (info: DeviceInfo) => ({ info }), RECEIVED_VCS_UPDATED: () => ({}), VC_RESPONSE: (response: unknown) => ({ response }), @@ -81,7 +83,7 @@ const model = createModel( export const RequestEvents = model.events; export const requestMachine = - /** @xstate-layout N4IgpgJg5mDOIC5QCcwEcCucAuBiAygMIBKAoqQHID6AQgDICqxA2gAwC6ioADgPawBLbAN4A7LiAAeiAOwA2ABwA6AKwBmAJwBGDazmaF6rQBoQAT0QBaDTIAsSgExrNttXLk61rgL7fTqTBwCEnJqADEAeUIGfDZOJBA+QWExCWkEFVYZJW0ZNQVbTIc5eRLTCwRrO0cvVgU61gcHVizff3QsWDx8AHUASQAVQgAJKgAFYgiBqIi6OIkkoRFxBPS1VjUlGVZbLJUtNwPbBTlyqxUFBxqvJsMHBQV8tpAAzuwlAGMACzAPgGsBKIoDQADZYbC8XjYL74MDIABuAg+YE+P3+gKguHoDFI0ymo0oAEF6KQACLzBKLFIrUDpfRyJSNWwaTLHdaKBRnSr5Bn7DROBxaeQaOS2GQqZ6vHCo34AoGg8GQ6GwhFIlHfWUYrGMXERfFUUl9fDEuhkik8fhLVKrRD1FRKWxyHZaHQPBzaU7mKzMq5yDT+rIu5lOhQySUdaUa9HysFgCFQmFwxHIpRSrpa7G6-VEknkjgLS3UtKIF37Gq2LQOQpuNQycVcyzHbKKOvHFQqOT7BRacOBLoy6PA2Px5VJtWpiPpoHanF4gajQ3G3PmxKF5bFhBaVz2x5b1hCpxqLSeiqWfSsGp6Zr+mQijS9t4DuVDxUJlXJlFgUQAQwARiDIFwFcqXXG1N0aDQlC3dsVA0dkmwbKstCUfQeRZdwClsBwJT8F5J3ef9X2hUkvwEQCAHEpgiKh8FxAY+gocjYnzSk12tWkSw8bI4Nve4xR2GQTC9So2RQ-kty0epHQ8VgcPaPt3g+ADv2QDFCDEURfmpXBCAiCgKFIQh6L0g1SHwAZJgATTNFiLWSUCOIQDRbHsODHQg45qwcRCL0MR4NkKFRtlgtwH0jZTVKBdTRE0j5tMkLpv2wFFvwAM2S5AAApSTMiyIksqh6IAWVICIGAGABKXA00UiK1I0rTlmAtiaSkRA-SuC5xSw2SVBchQNAbHQlDUC52U7P0dDgsL+wAd2-JYgTCXhkGi2LtN0-TDIGGz4jsq1WvSLQWiuR0gtcI9nD6oSKjUJwoLu-J9i3R0ZveebFqgZbVoauLllwRdNoMozmvs9i2s3O77GKPrWDg-ctFglQuXdBk7s7cUqx9OQnDepRuFQbgVIxAZeFISRvm-IEwD6URUt4XAyEIUg+gANVIUzWb6ZmqAYyJQYOjcRXtFlb3FR53HdGQuSCi95DqNwVHdZz-TxsAKa+KmoAxEiP1p+ncFIAANEZCUYjnST00gBaLMCNEeRwcZKcVZLgoKuRdRolG7eRqxxuHbDVjWtZ1sA9bp3glEBMZkF4KBUFgWBcAS7AkpS9K4UyoHtr6EzitK8qqpqpR1cpoFQ-D+mo9EGO44T2AbYciHjskxwAsKYoxRu20HgdHGdEyYKRTkIOy+1oFdbVfXI+EABbMBeAwPBCDN5m5ls1cwcO9rZJQ5xK0yTINjcLk3YdJXOy7vRRvvXDi4+4QlpW1mPgBo1s5BjeQPBo7NEgiadjYWZPbRQHt7j2gcK2LulxEb6Dxg-DE30X64FZoQKgTMWbszzHtTegs7b2wdJJE48gvCSTyB7GQ9xvZHiKEfC4fV4ELUfl9Z+Hxq613jnAJOKc05KDShlTK+BhiEmIAxcihU+glTKpVaq+ElAIKfsgF+7DY6cMTo3H+JYNi+SFHBNwlx9ijQ9i5bIst6GUNkpQxhn0kFsLngvJeOlV6kHXjg7+28EBOgvDsfux1RoFD9B7TIyF6i1gGvyXYPo8YfCpsiEEIItQ8OSnwjOWUV4UDXhIqRhdZEKU+LEsA8SMQaI8e6C8StXCOhsFkfQ2EuTOE2O6I8zsxQyAeAoPGqBERgFmlqQkhBmZjAGCUjcNwch+lGu2J0-pqwo1kvYNpfUThVjtLfeSj4ulkV6dOfpgyBhUDNqSKg7NRFhEsiMsCToQk6HFOod0pZBrCWaHWLY-tmRZGKAcTpYctlajIAAKW2hcxyx1uxQTFLkOCihpJzJefIZo7zKEeGKN87p2zMTpLXsCiG2hlADT2HYe2WFLiwuyPCnYugkWVhHnfORmyekYiUPCOEAhUpmAxH0CAX5hDYDMLgMI-SOas0JHQPo2CCxbw3BCrYfU8jtlGsyLCKNCgXl0EKZkoZMiXDUKi35QImUsrZRyrlogeV8oFTzBiwrRXitYpKsCgk5a6CVh2W8Y1ORPJVTkfchLNV1FxrSvJ9L0UGtUkaoEnLuVCD5Zilx2KjrXyghU5w+hAonkQE0Zw3rdi6GWaWOSeEg0-IZfqwE8JvwJIgJG010a374CKkaZibiWoblbA6AadhxQ2HFJJFG0KoL1EUJ2Qw7Y1mFo2cWkNzKw3sqBKzbguAIBiBRGW3gfwUTF2DYy6drLZ1QHnQgVdMTqRxHjSWdQF5dhNGOPcLIrS+3umoYJKGThthhkDROtF27DV7vnbgOEsdkD4xBElemyBZ4TiLV+-VO7w37u4Ie0Q8JeDHqahwM9m4jCOCaLBF0bT8geoqIebIEKvAskgdBXVJaoB8I+MibgzDINvAxMQX4YABDMogC-JOqD0FmTGHpWiGHMYoSCoYGwIpJLuyefbSCrS6jijcMOgtm7J2Mu-HRsADHGU1RY2xjjkBuMoLQWQfAAmKBCa0M2+1ILKzZERp7SsCMbC2BRrJh0dYFPqHcPQqjIaNP0cY7poE5MBBTn3a-cyEQyB8bM4J62X8W1gUHefMUSm7D6GcvUpwF5KwsjhnxHQYo-Pqc09p-V89kDjygLTD4vBZ4YmQVFmLpnzNCcSzZiGKXCj8XUM5BThHECjQOFBFkW5CWUKPCV-VAWtOMYJlpr8EA9PIgM1xyL0wWv8fixhl0fpRMDSVq7TIjzbo5agu6E7hXnLvvWdKLdM2yuMa6CtRrG3osc1aztjreDbP7eHfyWC-J8hVnqYY0b+wxTMkmz2D9921OPcC4BRcDb8BNolb9rrrhXkWL0CO5wp2hvdmUBscWCn5DqBU3ShHNHUAACstLI6NKj9HdrMdHTFg9C4lYDjdjqcJAeVxLgnB0B1UM4o8bLdgHVmKjOIB1pZ7t9sVwWR3Q7L1HG0thJYW4n6RoLQ4L9Y6c8UQvAuXwASDVDHttHJVk6lWLwfo321ORsJSwntlB5BzS9NysO7v9kBBp4QzLrdN3SHkSC4oxaVIrErNQDYHiQUejcuG3Zr7RLRM+BUcYlSJlVMiUPmiMiihGphWsd7RSwQbJQ7I2E4IwMeJkOBcP+xRiz8OXP75xxt4xIXjxyLS8uXLxlwohPKiZZlVCh4HY1V+-HZGTPGJs8jjzx+JjOBe9s5tziwo3scOyUgdhRo3k3cT67fowweu4YZ81DGIiq-xxfj-ABCAfeNzHWaFsHQCNoJCjug2XYZCPHIMCnMpOfYuQiHPBMEiUQMiV-LfMPEsR0TYJ0Y4P0HGQwW8ePN3dsbxFuRoY6LCQUW7efVvOqKKX6bfdxIWeob2OGC4OGXQOGeQIaMsS+I8B4cUUUaSaxZhb6NaRqcGagu2dYRkSlZ1FyCsElYSfkLYA-IKLweoFkdQPGBbImSKKAUmcmMeGmCON-O2PqKCDwFuWVAoV3CoIg71SBPIOwBQ-YUeTWcuCeH5ZEaefQxyR4FXA-OwQwHQbCLXCoQSZQY8CsCnF0TQfcBwkOZwyuSOaOVReudwrrWg51SBNsPw6TCoO4FCUULwNAuoKQqIpwqASeVwiOJQexRebAJI9IAaZQFZYbLCUaW8U+Lwc+YoSBTg28ZyXgxBVhGo20WsGoS-NVQHZwMBDwRkZXAadYR4bVXoxRZReIuuLhAYhAafYYmffcMY7AioA4FkVQZXVsYofuBYlhJROxAQeeKotYgaBkY8bsRQYoI8ArIJFoOg-IZpZ9V6FvRSApIpIENYtwSCFuShJsE4AoMfF0E4EaYjdXVwFFX4icaDKANY90VyCZGCaZZydQD2EUWvS-IwC+DCabGjAQCAACNYg4dsB0Y4GwNPXNXYjNAUbNIMSSV9UKJEh7GjWDPdatM1NY2Wb2Q3dQR0eoNpVzJ5a8UTXYB4R0KseQUk6uctStfk6NNYrg8Fa8HwwSPbFGWCPFQKLCEUB4Y8KnKDPVHkn9RrbgKki+LYOsSBRoGCH2ZVNpVQUhPQHYK6HVLkmnWjQLTffabfcPHYUTRZCTDwTAlGEhb2KMrAkoUI30-3d4bkgMubHTfCFbdjTjbjDUuFVwOsW8IgusMfcBZCNwZ5d0bCJwc0z9S09M8rWnLMkLSQMLZhF+DUwwEaK8MUdsUMd0QbBAWYpPI8MhUfWCQOP0lExsxjSrarWrerN7LsiBYXLIf0PyTIobO6VVf1GfQSJoBwJU2bJs-GQmJbbMtbTshAovIMK4BzB4ruWocwobOoUc6E2wlkHo6chsk857CEDQ684MxAzcSSZCP2IUOGEoGsepHc71AxJ3SsJoY8p7SAFcqYzXLCLC5Q+pf2HIC6ShA+bCHGJU+nOXKkzoh03UhpNVOwOZfbD5AaTo7YSBJUn8REKAJKEmXgYYerMAW4uoOgp2bCAxGBepbQTqQshU+occyXMLGXdaNCm8jxLcfQLYasgoFodgrkSWVQS7JzLwJGW+XwIAA */ + /** @xstate-layout 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-TVAYfRqda4a23LS5QDcM-ZwTQQNWwT5dcwlNEbzYNfk1-IiHkKAVqYUYWYYUnMADajmI9XYESw0dKGynKisbZAZOHRCHEEqvTFa9-GRL-U4u6tJFwLYXpS0dYAtS7IbDEbUHYAoFHFEYNc6zGli7fXfHGgQQ-UeRgiG-GucLEBso6F+EhZGd3R6tKXRZoYKhmudLGlm-fNmyAHVJmoa2Skav3ImrEEmhyEocmjLbYQZa2Rqpw-iDGNAjAr6W65W+6i4rYAsQyFoaEk0c2VQAsH3YqZiZiOgiWRg6osAVglTX06wYdXko2UQ60PECQ3wXwIAA */ model.createMachine( { predictableActionArguments: true, @@ -151,6 +153,7 @@ export const requestMachine = }, enabled: { always: { + // eslint-disable-next-line sonarjs/no-duplicate-string target: '#request.clearingConnection', }, }, @@ -271,7 +274,7 @@ export const requestMachine = target: 'disconnected', }, VC_RECEIVED: { - target: 'reviewing', + target: 'reviewing.accepting', actions: 'setIncomingVc', }, }, @@ -380,9 +383,18 @@ export const requestMachine = }, }, }, + on: { + STORE_ERROR: { + target: '#request.reviewing.savingFailed', + }, + }, }, accepted: { - entry: ['sendVcReceived', 'logReceived'], + entry: [ + 'sendVcReceived', + 'setReceiveLogTypeRegular', + 'logReceived', + ], invoke: { src: 'sendVcResponse', data: { @@ -393,6 +405,9 @@ export const requestMachine = DISMISS: { target: 'navigatingToHome', }, + GO_TO_RECEIVED_VC_TAB: { + target: 'navigatingToHome', + }, }, }, rejected: { @@ -409,7 +424,33 @@ export const requestMachine = }, }, }, - navigatingToHome: {}, + navigatingToHome: { + invoke: { + src: 'disconnect', + }, + }, + savingFailed: { + initial: 'idle', + entry: ['setReceiveLogTypeDiscarded', 'logReceived'], + invoke: { + src: 'sendVcResponse', + data: { + status: 'REJECTED', + }, + }, + states: { + idle: {}, + viewingVc: {}, + }, + on: { + DISMISS: { + target: '.viewingVc', + }, + GO_TO_RECEIVED_VC_TAB: { + target: 'navigatingToHome', + }, + }, + }, }, on: { ACCEPT: { @@ -859,6 +900,14 @@ export function selectIsAccepted(state: State) { return state.matches('reviewing.accepted'); } +export function selectIsAccepting(state: State) { + return state.matches('reviewing.accepting'); +} + +export function selectIsSavingFailedInIdle(state: State) { + return state.matches('reviewing.savingFailed.idle'); +} + export function selectIsRejected(state: State) { return state.matches('reviewing.rejected'); } diff --git a/machines/openIdBle/request.typegen.ts b/machines/openIdBle/request.typegen.ts index 19e9b206b..575bab80f 100644 --- a/machines/openIdBle/request.typegen.ts +++ b/machines/openIdBle/request.typegen.ts @@ -24,7 +24,9 @@ export interface Typegen0 { 'invokeSrcNameMap': { advertiseDevice: 'done.invoke.request.waitingForConnection:invocation[0]'; checkBluetoothService: 'done.invoke.request.checkingBluetoothService.checking:invocation[0]'; - disconnect: 'done.invoke.request.clearingConnection:invocation[0]'; + disconnect: + | 'done.invoke.request.clearingConnection:invocation[0]' + | 'done.invoke.request.reviewing.navigatingToHome:invocation[0]'; exchangeDeviceInfo: 'done.invoke.request.exchangingDeviceInfo:invocation[0]'; monitorConnection: 'done.invoke.request:invocation[0]'; receiveVc: 'done.invoke.request.waitingForVc:invocation[0]'; @@ -32,7 +34,8 @@ export interface Typegen0 { sendDisconnect: 'done.invoke.request.cancelling:invocation[0]'; sendVcResponse: | 'done.invoke.request.reviewing.accepted:invocation[0]' - | 'done.invoke.request.reviewing.rejected:invocation[0]'; + | 'done.invoke.request.reviewing.rejected:invocation[0]' + | 'done.invoke.request.reviewing.savingFailed:invocation[0]'; verifyVp: 'done.invoke.request.reviewing.verifyingVp:invocation[0]'; }; 'missingImplementations': { @@ -57,7 +60,7 @@ export interface Typegen0 { | 'CONNECTION_DESTROYED' | 'DISMISS' | 'xstate.after(DESTROY_TIMEOUT)#request.clearingConnection'; - logReceived: 'CANCEL' | 'REJECT' | 'STORE_RESPONSE'; + logReceived: 'CANCEL' | 'REJECT' | 'STORE_ERROR' | 'STORE_RESPONSE'; mergeIncomingVc: 'STORE_RESPONSE'; openSettings: 'GOTO_SETTINGS'; prependReceivedVc: 'VC_RESPONSE'; @@ -76,12 +79,13 @@ export interface Typegen0 { | 'ACCEPT' | 'DISMISS' | 'FACE_VALID' + | 'VC_RECEIVED' | 'done.invoke.request.reviewing.verifyingVp:invocation[0]'; requestReceiverInfo: 'CONNECTED'; sendVcReceived: 'STORE_RESPONSE'; setIncomingVc: 'VC_RECEIVED'; - setReceiveLogTypeDiscarded: 'CANCEL' | 'REJECT'; - setReceiveLogTypeRegular: 'ACCEPT'; + setReceiveLogTypeDiscarded: 'CANCEL' | 'REJECT' | 'STORE_ERROR'; + setReceiveLogTypeRegular: 'ACCEPT' | 'STORE_RESPONSE'; setReceiveLogTypeUnverified: 'FACE_INVALID'; setReceiveLogTypeVerified: 'FACE_VALID'; setReceiverInfo: 'RECEIVE_DEVICE_INFO'; @@ -103,13 +107,13 @@ export interface Typegen0 { | 'DISMISS' | 'xstate.after(DESTROY_TIMEOUT)#request.clearingConnection'; checkBluetoothService: 'SCREEN_FOCUS' | 'SWITCH_PROTOCOL'; - disconnect: '' | 'DISMISS'; + disconnect: '' | 'DISMISS' | 'GO_TO_RECEIVED_VC_TAB'; exchangeDeviceInfo: 'RECEIVE_DEVICE_INFO'; monitorConnection: 'xstate.init'; receiveVc: 'EXCHANGE_DONE'; requestBluetooth: 'BLUETOOTH_DISABLED'; sendDisconnect: 'CANCEL'; - sendVcResponse: 'CANCEL' | 'REJECT' | 'STORE_RESPONSE'; + sendVcResponse: 'CANCEL' | 'REJECT' | 'STORE_ERROR' | 'STORE_RESPONSE'; verifyVp: never; }; 'matchesStates': @@ -139,6 +143,9 @@ export interface Typegen0 { | 'reviewing.invalidIdentity' | 'reviewing.navigatingToHome' | 'reviewing.rejected' + | 'reviewing.savingFailed' + | 'reviewing.savingFailed.idle' + | 'reviewing.savingFailed.viewingVc' | 'reviewing.verifyingIdentity' | 'reviewing.verifyingVp' | 'waitingForConnection' @@ -155,6 +162,7 @@ export interface Typegen0 { | 'invalidIdentity' | 'navigatingToHome' | 'rejected' + | 'savingFailed' | 'verifyingIdentity' | 'verifyingVp' | { @@ -164,6 +172,7 @@ export interface Typegen0 { | 'requestingExistingVc' | 'requestingReceivedVcs' | 'storingVc'; + savingFailed?: 'idle' | 'viewingVc'; }; waitingForVc?: 'inProgress' | 'timeout'; }; diff --git a/machines/request.ts b/machines/request.ts index ee2fb534f..e05cfb669 100644 --- a/machines/request.ts +++ b/machines/request.ts @@ -54,6 +54,7 @@ const model = createModel( ACCEPT: () => ({}), ACCEPT_AND_VERIFY: () => ({}), REJECT: () => ({}), + GO_TO_RECEIVED_VC_TAB: () => ({}), CANCEL: () => ({}), DISMISS: () => ({}), VC_RECEIVED: (vc: VC) => ({ vc }), diff --git a/screens/Request/ReceiveVcScreen.strings.json b/screens/Request/ReceiveVcScreen.strings.json index fbce0dd75..6bf421dae 100644 --- a/screens/Request/ReceiveVcScreen.strings.json +++ b/screens/Request/ReceiveVcScreen.strings.json @@ -2,5 +2,13 @@ "header": "{{vcLabel}} details", "save": "Save {{vcLabel}}", "verifyAndSave": "Verify and save", - "discard": "Discard" -} \ No newline at end of file + "reject": "Reject", + "discard": "Discard", + "goToReceivedVCTab": "View Received {{vcLabel}}", + "errors": { + "savingFailed": { + "title": "Failed to save {{vcLabel}}", + "message": "Something went wrong while saving {{vcLabel}} to the store." + } + } +} diff --git a/screens/Request/ReceiveVcScreen.tsx b/screens/Request/ReceiveVcScreen.tsx index a8e46029b..f86361049 100644 --- a/screens/Request/ReceiveVcScreen.tsx +++ b/screens/Request/ReceiveVcScreen.tsx @@ -8,10 +8,15 @@ import { VcDetails } from '../../components/VcDetails'; import { useReceiveVcScreen } from './ReceiveVcScreenController'; import { VerifyIdentityOverlay } from '../VerifyIdentityOverlay'; import { MessageOverlay } from '../../components/MessageOverlay'; +import { isBLEEnabled } from '../../lib/smartshare'; +import { useOverlayVisibleAfterTimeout } from '../../shared/hooks/useOverlayVisibleAfterTimeout'; export const ReceiveVcScreen: React.FC = () => { const { t } = useTranslation('ReceiveVcScreen'); const controller = useReceiveVcScreen(); + const savingOverlayVisible = useOverlayVisibleAfterTimeout( + controller.isAccepting + ); return ( @@ -31,31 +36,43 @@ export const ReceiveVcScreen: React.FC = () => { /> - {controller.incomingVc.shouldVerifyPresence ? ( -