diff --git a/assets/icons/eazy_passport.svg b/assets/icons/eazy_passport.svg
new file mode 100644
index 0000000..84141b6
--- /dev/null
+++ b/assets/icons/eazy_passport.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/express_passport.svg b/assets/icons/express_passport.svg
new file mode 100644
index 0000000..cb8669c
--- /dev/null
+++ b/assets/icons/express_passport.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/guidebook.svg b/assets/icons/guidebook.svg
new file mode 100644
index 0000000..f09943a
--- /dev/null
+++ b/assets/icons/guidebook.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/regular_passport.svg b/assets/icons/regular_passport.svg
new file mode 100644
index 0000000..895cdc5
--- /dev/null
+++ b/assets/icons/regular_passport.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/waiting_for_payment.svg b/assets/icons/waiting_for_payment.svg
new file mode 100644
index 0000000..c7805af
--- /dev/null
+++ b/assets/icons/waiting_for_payment.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/placeholderImageSlider.jpg b/assets/images/placeholderImageSlider.jpg
new file mode 100644
index 0000000..f8265fc
Binary files /dev/null and b/assets/images/placeholderImageSlider.jpg differ
diff --git a/assets/styles/Colors.tsx b/assets/styles/Colors.tsx
index d3df5a3..9de4813 100644
--- a/assets/styles/Colors.tsx
+++ b/assets/styles/Colors.tsx
@@ -35,7 +35,7 @@ const Colors = StyleSheet.create({
color: '#4F97AB',
},
secondary50: {
- color: '#7BB1C0,',
+ color: '#7BB1C0',
},
secondary60: {
color: '#A7CBD5',
diff --git a/declarations.d.ts b/declarations.d.ts
new file mode 100644
index 0000000..e5bbc76
--- /dev/null
+++ b/declarations.d.ts
@@ -0,0 +1,6 @@
+declare module '*.svg' {
+ import React from 'react';
+ import {SvgProps} from 'react-native-svg';
+ const content: React.FC;
+ export default content;
+}
diff --git a/metro.config.js b/metro.config.js
index ba95bf4..2be3cec 100644
--- a/metro.config.js
+++ b/metro.config.js
@@ -1,11 +1,24 @@
const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
+const defaultConfig = getDefaultConfig(__dirname);
+const {assetExts, sourceExts} = defaultConfig.resolver;
+
/**
* Metro configuration
* https://reactnative.dev/docs/metro
*
- * @type {import('@react-native/metro-config').MetroConfig}
+ * @type {import('metro-config').MetroConfig}
*/
-const config = {};
+const config = {
+ transformer: {
+ babelTransformerPath: require.resolve(
+ 'react-native-svg-transformer/react-native',
+ ),
+ },
+ resolver: {
+ assetExts: assetExts.filter(ext => ext !== 'svg'),
+ sourceExts: [...sourceExts, 'svg'],
+ },
+};
-module.exports = mergeConfig(getDefaultConfig(__dirname), config);
+module.exports = mergeConfig(defaultConfig, config);
diff --git a/package-lock.json b/package-lock.json
index 0871936..409e370 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,12 +12,15 @@
"@react-navigation/elements": "^2.3.8",
"@react-navigation/native": "^7.1.6",
"@react-navigation/native-stack": "^7.3.10",
+ "dayjs": "^1.11.13",
"react": "19.0.0",
"react-native": "0.78.0",
"react-native-element-dropdown": "^2.12.4",
"react-native-paper": "^5.13.2",
"react-native-safe-area-context": "^5.4.0",
"react-native-screens": "^4.10.0",
+ "react-native-svg": "^15.11.2",
+ "react-native-svg-transformer": "^1.5.0",
"react-native-vector-icons": "^10.2.0"
},
"devDependencies": {
@@ -2266,12 +2269,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@jest/core/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/@jest/core/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -3205,11 +3202,6 @@
"react": ">= 18.2.0"
}
},
- "node_modules/@react-navigation/core/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
- },
"node_modules/@react-navigation/elements": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.3.8.tgz",
@@ -3230,18 +3222,6 @@
}
}
},
- "node_modules/@react-navigation/elements/node_modules/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
- "engines": {
- "node": ">=12.5.0"
- }
- },
"node_modules/@react-navigation/native": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.6.tgz",
@@ -3324,6 +3304,296 @@
"@sinonjs/commons": "^3.0.0"
}
},
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@svgr/core/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
+ "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "dependencies": {
+ "cosmiconfig": "^8.1.3",
+ "deepmerge": "^4.3.1",
+ "svgo": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -3426,12 +3696,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@types/jest/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -3871,8 +4135,7 @@
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
"node_modules/array-buffer-byte-length": {
"version": "1.0.2",
@@ -4257,6 +4520,11 @@
"readable-stream": "^3.4.0"
}
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ },
"node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
@@ -4435,7 +4703,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
"engines": {
"node": ">=6"
}
@@ -4449,9 +4716,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001714",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz",
- "integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==",
+ "version": "1.0.30001715",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz",
+ "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==",
"funding": [
{
"type": "opencollective",
@@ -4650,12 +4917,15 @@
"dev": true
},
"node_modules/color": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
- "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
"dependencies": {
- "color-convert": "^1.9.3",
- "color-string": "^1.6.0"
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
}
},
"node_modules/color-convert": {
@@ -4683,19 +4953,6 @@
"simple-swizzle": "^0.2.2"
}
},
- "node_modules/color/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- },
"node_modules/colorette": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
@@ -4877,6 +5134,74 @@
"node": ">= 8"
}
},
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
+ },
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -4937,8 +5262,7 @@
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
- "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
- "dev": true
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
},
"node_modules/debug": {
"version": "4.4.0",
@@ -4997,7 +5321,6 @@
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5107,6 +5430,66 @@
"node": ">=6.0.0"
}
},
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -5127,9 +5510,9 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/electron-to-chromium": {
- "version": "1.5.137",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz",
- "integrity": "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA=="
+ "version": "1.5.139",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.139.tgz",
+ "integrity": "sha512-GGnRYOTdN5LYpwbIr0rwP/ZHOQSvAF6TG0LSzp28uCBb9JiXHJGmaaKw29qjNJc5bGnnp6kXJqRnGMQoELwi5w=="
},
"node_modules/emittery": {
"version": "0.13.1",
@@ -5156,6 +5539,17 @@
"node": ">= 0.8"
}
},
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/env-paths": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
@@ -6324,9 +6718,9 @@
"integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="
},
"node_modules/flow-parser": {
- "version": "0.267.0",
- "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.267.0.tgz",
- "integrity": "sha512-eBgyFHiT/CHevT225CVQbwnAwRKLjqgtkkpDBMvNGV2C/Tz8x4Zr9FZeWed/cSWhRTiUhH7MXpIWSHkrzvaqdA==",
+ "version": "0.268.0",
+ "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.268.0.tgz",
+ "integrity": "sha512-URZmPy/jKDDIJUHUfC+5KNwaPcfONTL3R8xltQWVEoCKLWowVebEBg89nbAnYHNo6ev8KzKWFpOROfHZdaCoxA==",
"engines": {
"node": ">=0.4.0"
}
@@ -6828,7 +7222,6 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "dev": true,
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -7574,12 +7967,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-circus/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/jest-cli": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
@@ -7684,12 +8071,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-config/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/jest-diff": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
@@ -7731,12 +8112,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-diff/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/jest-docblock": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
@@ -7791,12 +8166,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-each/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/jest-environment-node": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
@@ -7884,12 +8253,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-leak-detector/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/jest-matcher-utils": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
@@ -7931,12 +8294,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-matcher-utils/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/jest-message-util": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
@@ -7980,11 +8337,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-message-util/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
- },
"node_modules/jest-mock": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
@@ -8178,12 +8530,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-snapshot/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true
- },
"node_modules/jest-snapshot/node_modules/semver": {
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
@@ -8263,11 +8609,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-validate/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
- },
"node_modules/jest-watcher": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
@@ -8337,7 +8678,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
"dependencies": {
"argparse": "^2.0.1"
},
@@ -8437,8 +8777,7 @@
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
@@ -8559,8 +8898,7 @@
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
},
"node_modules/locate-path": {
"version": "6.0.0",
@@ -8769,6 +9107,14 @@
"loose-envify": "cli.js"
}
},
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -8826,6 +9172,11 @@
"node": ">= 0.4"
}
},
+ "node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
"node_modules/memoize-one": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
@@ -9369,6 +9720,15 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/nocache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz",
@@ -9429,6 +9789,17 @@
"node": ">=8"
}
},
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/nullthrows": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
@@ -9711,7 +10082,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
"dependencies": {
"callsites": "^3.0.0"
},
@@ -9723,7 +10093,6 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
@@ -9745,6 +10114,11 @@
"node": ">= 0.8"
}
},
+ "node_modules/path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q=="
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -9779,7 +10153,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -9953,6 +10326,12 @@
"@types/yargs-parser": "*"
}
},
+ "node_modules/pretty-format/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "devOptional": true
+ },
"node_modules/promise": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
@@ -10116,10 +10495,9 @@
}
},
"node_modules/react-is": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
- "devOptional": true
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
},
"node_modules/react-native": {
"version": "0.78.0",
@@ -10195,9 +10573,9 @@
}
},
"node_modules/react-native-paper": {
- "version": "5.13.2",
- "resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-5.13.2.tgz",
- "integrity": "sha512-qZbPZEfWWHmP7660K+xnYGhyDa2usr9aec7WEPBZQHrFe/dm9+yME2KZiDZq8ZbmSuj9ExV508brbdr1Ub/A/Q==",
+ "version": "5.13.3",
+ "resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-5.13.3.tgz",
+ "integrity": "sha512-OyUonUq5JwVClSi21eh0WW4FYnjqEY/6VasOzFi1wit85FBYsL1nYSz1Gqoxsw5bA5yDDyms/gdSvrUcQMYjMw==",
"dependencies": {
"@callstack/react-theme-provider": "^3.0.9",
"color": "^3.1.2",
@@ -10210,6 +10588,28 @@
"react-native-vector-icons": "*"
}
},
+ "node_modules/react-native-paper/node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
+ "node_modules/react-native-paper/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/react-native-paper/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
"node_modules/react-native-safe-area-context": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.4.0.tgz",
@@ -10232,6 +10632,35 @@
"react-native": "*"
}
},
+ "node_modules/react-native-svg": {
+ "version": "15.11.2",
+ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.11.2.tgz",
+ "integrity": "sha512-+YfF72IbWQUKzCIydlijV1fLuBsQNGMT6Da2kFlo1sh+LE3BIm/2Q7AR1zAAR6L0BFLi1WaQPLfFUC9bNZpOmw==",
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "css-tree": "^1.1.3",
+ "warn-once": "0.1.1"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-svg-transformer": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.5.0.tgz",
+ "integrity": "sha512-RG5fSWJT7mjCQYocgYFUo1KYPLOoypPVG5LQab+pZZO7m4ciGaQIe0mhok3W4R5jLQsEXKo0u+aQGkZV/bZG7w==",
+ "dependencies": {
+ "@svgr/core": "^8.1.0",
+ "@svgr/plugin-jsx": "^8.1.0",
+ "@svgr/plugin-svgo": "^8.1.0",
+ "path-dirname": "^1.0.2"
+ },
+ "peerDependencies": {
+ "react-native": ">=0.59.0",
+ "react-native-svg": ">=12.0.0"
+ }
+ },
"node_modules/react-native-vector-icons": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.2.0.tgz",
@@ -10325,11 +10754,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/react-native/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
- },
"node_modules/react-native/node_modules/regenerator-runtime": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
@@ -10579,7 +11003,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
"engines": {
"node": ">=4"
}
@@ -11092,6 +11515,15 @@
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -11100,6 +11532,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-support": {
"version": "0.5.13",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
@@ -11439,6 +11879,60 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+ },
+ "node_modules/svgo": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
+ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/svgo/node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="
+ },
"node_modules/terser": {
"version": "5.39.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
@@ -11699,7 +12193,7 @@
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
"integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
- "dev": true,
+ "devOptional": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
diff --git a/package.json b/package.json
index be07eb5..1bfc8fa 100644
--- a/package.json
+++ b/package.json
@@ -14,12 +14,15 @@
"@react-navigation/elements": "^2.3.8",
"@react-navigation/native": "^7.1.6",
"@react-navigation/native-stack": "^7.3.10",
+ "dayjs": "^1.11.13",
"react": "19.0.0",
"react-native": "0.78.0",
"react-native-element-dropdown": "^2.12.4",
"react-native-paper": "^5.13.2",
"react-native-safe-area-context": "^5.4.0",
"react-native-screens": "^4.10.0",
+ "react-native-svg": "^15.11.2",
+ "react-native-svg-transformer": "^1.5.0",
"react-native-vector-icons": "^10.2.0"
},
"devDependencies": {
diff --git a/src/components/PassportAppointmentCard.tsx b/src/components/PassportAppointmentCard.tsx
new file mode 100644
index 0000000..5973f37
--- /dev/null
+++ b/src/components/PassportAppointmentCard.tsx
@@ -0,0 +1,196 @@
+import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
+import WaitingForPaymentIcon from '../../assets/icons/waiting_for_payment.svg';
+import {StyleSheet, Text, View} from 'react-native';
+import FontFamily from '../../assets/styles/FontFamily';
+import Colors from '../../assets/styles/Colors';
+
+type PassportAppointmentCardProps = {
+ applicantName: string;
+ applicantCount: number;
+ appointmentDate: string;
+ appointmentTime: string;
+ serviceUnit: string;
+ status: string;
+};
+
+const renderStatusContent = (status: string) => {
+ let backgroundColor;
+ let IconComponent;
+
+ switch (status) {
+ case 'Permohonan Kadaluarsa':
+ backgroundColor = Colors.indicatorRed.color;
+ IconComponent = () => (
+
+ );
+ break;
+ case 'Sudah Terbayar':
+ backgroundColor = Colors.indicatorGreen.color;
+ IconComponent = () => (
+
+ );
+ break;
+ default:
+ backgroundColor = Colors.indicatorOrange.color;
+ IconComponent = () => ;
+ break;
+ }
+
+ return (
+ <>
+ {status === 'Sudah Terbayar' && (
+
+ Lihat Persyaratan
+
+ )}
+
+
+ {status}
+
+ >
+ );
+};
+
+const PassportAppointmentCard: React.FC = ({
+ applicantName,
+ applicantCount,
+ appointmentDate,
+ appointmentTime,
+ serviceUnit,
+ status,
+}) => {
+ return (
+
+
+
+ {applicantName}
+
+ {applicantCount} Pemohon
+
+
+
+
+
+
+
+ {appointmentDate}
+
+
+
+ {appointmentTime}
+
+
+
+ {serviceUnit}
+
+
+
+ {status === 'Menunggu Pembayaran' && (
+
+
+ Selesaikan pembayaran sebelum
+
+ 16 April 2025 23:30
+
+ )}
+
+ {renderStatusContent(status)}
+
+
+
+ );
+};
+
+export default PassportAppointmentCard;
+
+const styles = StyleSheet.create({
+ cardContainer: {
+ borderRadius: 20,
+ padding: 16,
+ backgroundColor: Colors.neutral100.color,
+ borderWidth: 1,
+ borderColor: Colors.secondary50.color,
+ },
+ topCardContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ marginVertical: 6,
+ },
+ topCardContentTextWrapper: {
+ gap: 4,
+ flex: 1,
+ },
+ applicantNameText: {
+ fontSize: 14,
+ ...FontFamily.notoSansBold,
+ textTransform: 'uppercase',
+ color: Colors.secondary30.color,
+ },
+ applicantCountText: {
+ fontSize: 12,
+ ...FontFamily.notoSansRegular,
+ color: Colors.primary30.color,
+ },
+ midCardContainer: {
+ gap: 8,
+ marginVertical: 8,
+ },
+ midCardContentWrapper: {
+ flexDirection: 'row',
+ gap: 6,
+ },
+ midCardContentTextStyle: {
+ fontSize: 12,
+ ...FontFamily.notoSansRegular,
+ color: Colors.primary30.color,
+ },
+ appointmentAlertWrapper: {
+ marginTop: 5,
+ marginBottom: 13,
+ },
+ appointmentAlertText: {
+ ...FontFamily.notoSansRegular,
+ fontSize: 10,
+ color: Colors.indicatorRed.color,
+ },
+ appointmentStatusContainer: {
+ alignItems: 'flex-end',
+ justifyContent: 'flex-end',
+ flexDirection: 'row',
+ gap: 10,
+ },
+ appointmentStatusWrapper: {
+ gap: 6,
+ alignItems: 'center',
+ backgroundColor: Colors.indicatorOrange.color,
+ padding: 8,
+ flexDirection: 'row',
+ borderRadius: 8,
+ },
+ appointmentStatusText: {
+ fontSize: 12,
+ ...FontFamily.notoSansMedium,
+ color: Colors.neutral100.color,
+ includeFontPadding: false,
+ },
+ seeRequirementsWrapper: {
+ backgroundColor: Colors.primary30.color,
+ borderRadius: 100,
+ paddingHorizontal: 16,
+ padding: 8,
+ flexDirection: 'row',
+ },
+});
diff --git a/src/model/DropdownData/CityData.tsx b/src/data/DropdownData/CityData.tsx
similarity index 100%
rename from src/model/DropdownData/CityData.tsx
rename to src/data/DropdownData/CityData.tsx
diff --git a/src/model/DropdownData/DistrictData.tsx b/src/data/DropdownData/DistrictData.tsx
similarity index 100%
rename from src/model/DropdownData/DistrictData.tsx
rename to src/data/DropdownData/DistrictData.tsx
diff --git a/src/model/DropdownData/GenderData.tsx b/src/data/DropdownData/GenderData.tsx
similarity index 100%
rename from src/model/DropdownData/GenderData.tsx
rename to src/data/DropdownData/GenderData.tsx
diff --git a/src/model/DropdownData/PostalCodeData.tsx b/src/data/DropdownData/PostalCodeData.tsx
similarity index 100%
rename from src/model/DropdownData/PostalCodeData.tsx
rename to src/data/DropdownData/PostalCodeData.tsx
diff --git a/src/model/DropdownData/ProvinceData.tsx b/src/data/DropdownData/ProvinceData.tsx
similarity index 100%
rename from src/model/DropdownData/ProvinceData.tsx
rename to src/data/DropdownData/ProvinceData.tsx
diff --git a/src/data/History/PassportAppointmentData.tsx b/src/data/History/PassportAppointmentData.tsx
new file mode 100644
index 0000000..ffcb940
--- /dev/null
+++ b/src/data/History/PassportAppointmentData.tsx
@@ -0,0 +1,49 @@
+const passportAppointmentData = [
+ {
+ id: '1',
+ applicantName: 'Irma Wahyudini',
+ applicantCount: 1,
+ appointmentDate: 'Kamis, 17 April 2025',
+ appointmentTime: '10.00 - 11.00 WIB',
+ serviceUnit: 'Unit Layanan Paspor I Jakarta Selatan (Pondok Pinang)',
+ status: 'Menunggu Pembayaran',
+ },
+ {
+ id: '2',
+ applicantName: 'Salwa Aisyah Adhani',
+ applicantCount: 2,
+ appointmentDate: 'Senin, 14 April 2025',
+ appointmentTime: '08:00 - 09:00 WIB',
+ serviceUnit: 'Kantor Imigrasi Depok',
+ status: 'Sudah Terbayar',
+ },
+ {
+ id: '3',
+ applicantName: 'Salwa Aisyah Adhani',
+ applicantCount: 2,
+ appointmentDate: 'Senin, 14 April 2025',
+ appointmentTime: '08:00 - 09:00 WIB',
+ serviceUnit: 'Kantor Imigrasi Depok',
+ status: 'Menunggu Pembayaran',
+ },
+ {
+ id: '4',
+ applicantName: 'Salwa Aisyah Adhani',
+ applicantCount: 2,
+ appointmentDate: 'Senin, 23 September 2024',
+ appointmentTime: '10:00 - 11:00 WIB',
+ serviceUnit: 'Kantor Imigrasi Depok',
+ status: 'Permohonan Kadaluarsa',
+ },
+ {
+ id: '5',
+ applicantName: 'Yulfarisa Hasnah',
+ applicantCount: 2,
+ appointmentDate: 'Senin, 14 April 2025',
+ appointmentTime: '08:00 - 09:00 WIB',
+ serviceUnit: 'Kantor Imigrasi Depok',
+ status: 'Sudah Terbayar',
+ },
+];
+
+export default passportAppointmentData;
diff --git a/src/data/Notification/NotificationData.tsx b/src/data/Notification/NotificationData.tsx
new file mode 100644
index 0000000..f9b9515
--- /dev/null
+++ b/src/data/Notification/NotificationData.tsx
@@ -0,0 +1,91 @@
+const notificationData = [
+ {
+ id: '1',
+ title: 'Pembayaran Permohonan',
+ message:
+ 'Anda belum melakukan pembayaran untuk IRMA WAHYUDINI. Silakan melakukan pembayaran sebelum Selasa, 8 April 2025, pukul 23:33:03 WIB.',
+ details:
+ 'Bila tidak melakukan pembayaran, maka permohonan Anda akan otomatis ditolak oleh sistem.',
+ timestamp: '2025-04-19T10:50:00+07:00',
+ },
+ {
+ id: '2',
+ title: 'Pembayaran Permohonan',
+ message:
+ 'Anda belum melakukan pembayaran untuk MUHAMMAD AMMAR. Silakan melakukan pembayaran sebelum Minggu, 29 September 2024, pukul 23:33:03 WIB.',
+ details:
+ 'Bila tidak melakukan pembayaran, maka permohonan Anda akan otomatis ditolak oleh sistem.',
+ timestamp: '2024-09-27T00:00:00+07:00',
+ },
+ {
+ id: '3',
+ title: 'Hari Penjadwalan',
+ message:
+ 'Halo SALWA AISYAH ADHANI, hari ini adalah jadwal kunjungan Anda ke KANTOR IMIGRASI DEPOK pada sesi Senin, 7 November 2022, pukul 12:30-15:00 WIB.',
+ details:
+ 'Kode Permohonan Anda adalah 2068000001633869. Pastikan Anda membawa dokumen yang dibutuhkan.',
+ timestamp: '2022-11-07T00:00:00+07:00',
+ },
+ {
+ id: '4',
+ title: 'Dokumen Siap Diambil',
+ message:
+ 'Dokumen paspor atas nama NURUL HUDA telah selesai diproses dan siap untuk diambil di KANTOR IMIGRASI YOGYAKARTA.',
+ details:
+ 'Harap ambil dokumen dalam waktu 14 hari kerja sejak pemberitahuan ini.',
+ timestamp: '2025-04-18T14:20:00+07:00',
+ },
+ {
+ id: '5',
+ title: 'Jadwal Ulang Permohonan',
+ message:
+ 'Permohonan atas nama LUTFI HAKIM perlu dijadwalkan ulang karena adanya gangguan sistem.',
+ details:
+ 'Silakan pilih jadwal baru melalui aplikasi sebelum Jumat, 21 April 2025.',
+ timestamp: '2025-04-17T09:10:00+07:00',
+ },
+ {
+ id: '6',
+ title: 'Verifikasi Berhasil',
+ message:
+ 'Verifikasi identitas untuk ANISA FITRIANI telah berhasil dilakukan.',
+ details:
+ 'Anda dapat melanjutkan ke tahap selanjutnya yaitu pembayaran permohonan.',
+ timestamp: '2025-04-16T13:45:00+07:00',
+ },
+ {
+ id: '7',
+ title: 'Permohonan Ditolak',
+ message:
+ 'Permohonan atas nama RAKA ARDIANSYAH ditolak karena dokumen tidak lengkap.',
+ details: 'Silakan ajukan ulang permohonan dengan dokumen yang sesuai.',
+ timestamp: '2025-04-14T11:30:00+07:00',
+ },
+ {
+ id: '8',
+ title: 'Batas Waktu Pembayaran',
+ message:
+ 'Pembayaran untuk permohonan atas nama SITI AMINAH akan berakhir dalam 1 jam.',
+ details:
+ 'Pastikan pembayaran dilakukan sebelum batas waktu agar permohonan tidak dibatalkan.',
+ timestamp: '2025-04-19T21:00:00+07:00',
+ },
+ {
+ id: '9',
+ title: 'Sesi Foto dan Biometrik',
+ message:
+ 'Jadwal sesi foto dan biometrik atas nama DANIL MAULANA adalah pada Rabu, 23 April 2025 pukul 09:00 WIB.',
+ details: 'Mohon hadir 15 menit lebih awal dengan membawa dokumen asli.',
+ timestamp: '2025-04-20T08:00:00+07:00',
+ },
+ {
+ id: '10',
+ title: 'Pembayaran Berhasil',
+ message:
+ 'Pembayaran untuk permohonan atas nama TIA ROSMAWATI telah berhasil.',
+ details: 'Silakan menunggu informasi jadwal kedatangan.',
+ timestamp: '2025-04-15T10:00:00+07:00',
+ },
+];
+
+export default notificationData;
diff --git a/src/screens/editProfile/index.tsx b/src/screens/editProfile/index.tsx
index d83b503..613f046 100644
--- a/src/screens/editProfile/index.tsx
+++ b/src/screens/editProfile/index.tsx
@@ -7,11 +7,11 @@ import {RootStackParamList} from '../../navigation/type';
import {NativeStackNavigationProp} from '@react-navigation/native-stack';
import {useNavigation} from '@react-navigation/native';
import TextInputComponent from '../../components/TextInput';
-import genderData from '../../model/DropdownData/GenderData';
-import provinceData from '../../model/DropdownData/ProvinceData';
-import cityData from '../../model/DropdownData/CityData';
-import districtData from '../../model/DropdownData/DistrictData';
-import postalCodeData from '../../model/DropdownData/PostalCodeData';
+import genderData from '../../data/DropdownData/GenderData';
+import provinceData from '../../data/DropdownData/ProvinceData';
+import cityData from '../../data/DropdownData/CityData';
+import districtData from '../../data/DropdownData/DistrictData';
+import postalCodeData from '../../data/DropdownData/PostalCodeData';
import {Button} from 'react-native-paper';
type EditProfileScreenNavigationProp = NativeStackNavigationProp<
diff --git a/src/screens/history/index.tsx b/src/screens/history/index.tsx
index 4bd9c34..d986832 100644
--- a/src/screens/history/index.tsx
+++ b/src/screens/history/index.tsx
@@ -1,21 +1,72 @@
import React from 'react';
-import {StyleSheet, Text, View} from 'react-native';
+import {FlatList, StatusBar, Text, View} from 'react-native';
+import styles from './styles';
+import Colors from '../../../assets/styles/Colors';
+import passportAppointmentData from '../../data/History/PassportAppointmentData';
+import PassportAppointmentCard from '../../components/PassportAppointmentCard';
+import {useNavigation, useNavigationState} from '@react-navigation/native';
+import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
+import {RootStackParamList} from '../../navigation/type';
+import {NativeStackNavigationProp} from '@react-navigation/native-stack';
+
+type HistoryScreenNavigationProp = NativeStackNavigationProp<
+ RootStackParamList,
+ 'History'
+>;
+
+const ItemSeparator = () => ;
function HistoryScreen() {
+ const navigation = useNavigation();
+ const previousRoute = useNavigationState(state => {
+ const index = state.index;
+ return index > 0 ? state.routes[index - 1].name : null;
+ });
+
+ const showNavBackAppBar = previousRoute === 'NavigationRoute';
+
return (
- History Screen
+
+ {showNavBackAppBar ? (
+
+ navigation.goBack()}
+ />
+ Riwayat
+
+ ) : (
+
+ Riwayat
+
+ )}
+
+
+ (
+
+ )}
+ keyExtractor={item => item.id}
+ ItemSeparatorComponent={ItemSeparator}
+ />
+
);
}
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- alignItems: 'center',
- justifyContent: 'center',
- backgroundColor: 'white',
- },
-});
-
export default HistoryScreen;
diff --git a/src/screens/history/styles.tsx b/src/screens/history/styles.tsx
new file mode 100644
index 0000000..e132dd2
--- /dev/null
+++ b/src/screens/history/styles.tsx
@@ -0,0 +1,52 @@
+import {StyleSheet} from 'react-native';
+import FontFamily from '../../../assets/styles/FontFamily';
+import Colors from '../../../assets/styles/Colors';
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: 'white',
+ },
+ appBarTitle: {
+ color: Colors.neutral100.color,
+ ...FontFamily.notoSansExtraBold,
+ fontSize: 28,
+ marginStart: 16,
+ includeFontPadding: false,
+ },
+ appBarContainer: {
+ height: 64,
+ backgroundColor: Colors.secondary30.color,
+ justifyContent: 'center',
+ },
+ appBarNavBackContainer: {
+ height: 64,
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: Colors.secondary30.color,
+ },
+ appBarNavBackTitle: {
+ color: Colors.neutral100.color,
+ ...FontFamily.notoSansRegular,
+ fontSize: 22,
+ marginStart: 16,
+ },
+ appBarNavBackIcon: {
+ marginLeft: 16,
+ },
+ topBackground: {
+ backgroundColor: Colors.secondary30.color,
+ height: 85,
+ alignItems: 'center',
+ },
+ cardWrapper: {
+ margin: 16,
+ marginBottom: 165,
+ marginTop: -69,
+ },
+ flatllistGap: {
+ height: 8,
+ },
+});
+
+export default styles;
diff --git a/src/screens/home/index.tsx b/src/screens/home/index.tsx
index 901ebcd..02005de 100644
--- a/src/screens/home/index.tsx
+++ b/src/screens/home/index.tsx
@@ -1,11 +1,109 @@
import * as React from 'react';
import styles from './styles';
-import {View, Text} from 'react-native';
+import {View, Text, StatusBar, FlatList} from 'react-native';
+import Colors from '../../../assets/styles/Colors';
+import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
+import {NativeStackNavigationProp} from '@react-navigation/native-stack';
+import {RootStackParamList} from '../../navigation/type';
+import {useNavigation} from '@react-navigation/native';
+import RegularPassportIcon from '../../../assets/icons/regular_passport.svg';
+import ExpressPassportIcon from '../../../assets/icons/express_passport.svg';
+import GuidebookIcon from '../../../assets/icons/guidebook.svg';
+import EazyPassportIcon from '../../../assets/icons/eazy_passport.svg';
+import passportAppointmentData from '../../data/History/PassportAppointmentData';
+import PassportAppointmentCard from '../../components/PassportAppointmentCard';
+
+type HomeScreenNavigationProp = NativeStackNavigationProp<
+ RootStackParamList,
+ 'Home'
+>;
+
+const ItemSeparator = () => ;
+
+const RenderContent = () => {
+ const navigation = useNavigation();
+
+ return (
+ <>
+
+
+ Layanan
+
+
+
+
+
+ Paspor Reguler
+
+
+
+
+
+ Paspor Percepatan
+
+
+
+
+
+ Buku Panduan
+
+
+
+
+
+ EAZY Pasport
+
+
+
+
+
+ Status Permohonan
+ navigation.navigate('History')}>
+ Lihat semua
+
+
+
+ (
+
+ )}
+ keyExtractor={item => item.id}
+ ItemSeparatorComponent={ItemSeparator}
+ />
+
+
+ >
+ );
+};
function HomeScreen() {
+ const navigation = useNavigation();
return (
- Home Screen
+
+
+ Halo, Salwa!
+ navigation.navigate('Notification')}
+ />
+
+ } />
);
}
diff --git a/src/screens/home/styles.tsx b/src/screens/home/styles.tsx
index efc4e0a..0f47624 100644
--- a/src/screens/home/styles.tsx
+++ b/src/screens/home/styles.tsx
@@ -1,19 +1,87 @@
import {StyleSheet} from 'react-native';
import Colors from '../../../assets/styles/Colors';
+import FontFamily from '../../../assets/styles/FontFamily';
const styles = StyleSheet.create({
container: {
flex: 1,
- alignItems: 'center',
- justifyContent: 'center',
backgroundColor: 'white',
},
- bottomNavLabel: {
+ appBarTitle: {
color: Colors.neutral100.color,
+ ...FontFamily.notoSansExtraBold,
+ fontSize: 28,
+ marginVertical: 14,
+ },
+ appBarContainer: {
+ height: 64,
+ backgroundColor: Colors.secondary30.color,
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingHorizontal: 16,
+ flexDirection: 'row',
+ },
+ topContainer: {
+ backgroundColor: Colors.secondary30.color,
+ height: 245,
+ alignItems: 'center',
+ },
+ serviceContainer: {
+ marginVertical: 12,
+ marginHorizontal: 16,
+ gap: 12,
+ },
+ serviceText: {
+ color: Colors.primary30.color,
+ ...FontFamily.notoSansExtraBold,
+ fontSize: 18,
+ },
+ serviceOptionWrapper: {
+ flexDirection: 'row',
+ gap: 10,
+ justifyContent: 'center',
+ },
+ serviceOptionContainer: {
+ alignItems: 'center',
+ marginHorizontal: 12,
+ },
+ serviceIcon: {
+ padding: 8,
+ backgroundColor: Colors.secondary70.color,
+ borderRadius: 4,
+ },
+ serviceDesc: {
+ width: 60,
textAlign: 'center',
- alignSelf: 'center',
+ fontSize: 10,
+ marginTop: 8,
+ color: Colors.primary30.color,
+ ...FontFamily.notoSansRegular,
+ },
+ applicationStatusContainer: {
+ marginHorizontal: 16,
+ },
+ applicationStatusTextWrapper: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ marginVertical: 12,
+ alignItems: 'center',
+ },
+ applicationStatusTitle: {
+ color: Colors.primary30.color,
+ ...FontFamily.notoSansExtraBold,
+ fontSize: 18,
+ },
+ applicationStatusSeeAll: {
+ color: Colors.secondary30.color,
fontSize: 12,
- position: 'absolute',
+ ...FontFamily.notoSansSemiBold,
+ },
+ cardWrapper: {
+ marginBottom: 16,
+ },
+ flatllistGap: {
+ height: 8,
},
});
diff --git a/src/screens/notification/index.tsx b/src/screens/notification/index.tsx
index 83581b9..970fc9f 100644
--- a/src/screens/notification/index.tsx
+++ b/src/screens/notification/index.tsx
@@ -1,21 +1,86 @@
import React from 'react';
-import {StyleSheet, Text, View} from 'react-native';
+import {FlatList, StatusBar, Text, View} from 'react-native';
+import Colors from '../../../assets/styles/Colors';
+import styles from './styles';
+import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
+import {RootStackParamList} from '../../navigation/type';
+import {NativeStackNavigationProp} from '@react-navigation/native-stack';
+import {useNavigation} from '@react-navigation/native';
+import dayjs from 'dayjs';
+import 'dayjs/locale/id';
+import notificationData from '../../data/Notification/NotificationData';
+
+type NotificationScreenNavigationProp = NativeStackNavigationProp<
+ RootStackParamList,
+ 'Notification'
+>;
+
+type NotificationCardProps = {
+ title: string;
+ message: string;
+ details: string;
+ timestamp: string;
+};
+
+const NotificationCard: React.FC = ({
+ title,
+ message,
+ details,
+ timestamp,
+}) => {
+ dayjs.locale('id');
+ const formattedTime = dayjs(timestamp).format('D MMMM YYYY');
+ return (
+
+
+ {title}
+ {formattedTime}
+
+ {message}
+ {details}
+
+ );
+};
+
+const ItemSeparator = () => ;
function NotificationScreen() {
+ const navigation = useNavigation();
+
return (
- Notification Screen
+
+
+ navigation.goBack()}
+ />
+ Notifikasi
+
+
+
+ (
+
+ )}
+ keyExtractor={item => item.id}
+ ItemSeparatorComponent={ItemSeparator}
+ />
+
);
}
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- alignItems: 'center',
- justifyContent: 'center',
- backgroundColor: 'white',
- },
-});
-
export default NotificationScreen;
diff --git a/src/screens/notification/styles.tsx b/src/screens/notification/styles.tsx
new file mode 100644
index 0000000..e1a8f15
--- /dev/null
+++ b/src/screens/notification/styles.tsx
@@ -0,0 +1,70 @@
+import {StyleSheet} from 'react-native';
+import Colors from '../../../assets/styles/Colors';
+import FontFamily from '../../../assets/styles/FontFamily';
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: 'white',
+ },
+ appBarTitle: {
+ color: Colors.neutral100.color,
+ ...FontFamily.notoSansRegular,
+ fontSize: 22,
+ marginStart: 16,
+ },
+ appBarIcon: {
+ marginLeft: 16,
+ },
+ appBarContainer: {
+ height: 64,
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: Colors.secondary30.color,
+ },
+ topBackground: {
+ backgroundColor: Colors.secondary30.color,
+ height: 85,
+ alignItems: 'center',
+ },
+ cardWrapper: {
+ margin: 16,
+ marginBottom: 165,
+ marginTop: -69,
+ },
+ cardContainer: {
+ borderRadius: 8,
+ padding: 16,
+ backgroundColor: Colors.neutral100.color,
+ borderWidth: 1,
+ borderColor: Colors.secondary50.color,
+ },
+ topCardContentWrapper: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ },
+ flatllistGap: {
+ height: 8,
+ },
+ notificationTitle: {
+ fontSize: 14,
+ ...FontFamily.notoSansBold,
+ },
+ notificationMessage: {
+ fontSize: 12,
+ marginTop: 4,
+ ...FontFamily.notoSansRegular,
+ },
+ notificationDetail: {
+ fontSize: 12,
+ marginTop: 4,
+ ...FontFamily.notoSansRegular,
+ },
+ notificationTime: {
+ fontSize: 10,
+ ...FontFamily.notoSansRegular,
+ },
+});
+
+export default styles;
diff --git a/src/screens/register/index.tsx b/src/screens/register/index.tsx
index 0758650..9cd8a0d 100644
--- a/src/screens/register/index.tsx
+++ b/src/screens/register/index.tsx
@@ -8,7 +8,7 @@ import styles from './styles';
import TextInputComponent from '../../components/TextInput';
import {Button, Checkbox} from 'react-native-paper';
import Colors from '../../../assets/styles/Colors';
-import genderData from '../../model/DropdownData/GenderData';
+import genderData from '../../data/DropdownData/GenderData';
type RegisterScreenNavigationProp = NativeStackNavigationProp<
RootStackParamList,