{"_id":"@armiasystems/react-native-armia-chat-sdk","_rev":"13-6ddaf2c41a5595bd885e4bbb00501a8a","name":"@armiasystems/react-native-armia-chat-sdk","dist-tags":{"latest":"1.0.9"},"versions":{"1.0.0":{"name":"@armiasystems/react-native-armia-chat-sdk","version":"1.0.0","description":"## Getting started","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["react-native"],"author":{"name":"Swathy"},"license":"ISC","peerDependencies":{"react-native":"^0.41.2","react-native-windows":"0.41.0-rc.1"},"dependencies":{"@react-native-community/async-storage":"^1.12.1","@react-native-community/masked-view":"^0.1.10","@react-navigation/native":"^5.8.10","@react-navigation/stack":"^5.12.8","react":"16.13.1","react-native":"0.63.4","react-native-device-info":"^7.3.1","react-native-reanimated":"^1.13.2","react-native-vector-icons":"^7.1.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-proposal-decorators":"^7.2.0","@babel/runtime":"^7.12.5","@react-native-community/eslint-config":"^2.0.0","babel-jest":"^26.6.3","eslint":"^7.17.0","jest":"^26.6.3","metro-react-native-babel-preset":"^0.64.0","react-test-renderer":"16.13.1"},"repository":{"type":"git","url":"git+https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","gitHead":"2d18546d93d85df2e6bc51d123a9dc7830da5052","_id":"@armiasystems/react-native-armia-chat-sdk@1.0.0","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-mj7GDAh53HEMGljQabC/wxa5qjn4oJC+adsyw/FCH7plNUZ52r/IHgIriTOvINk9ARnvORZ0NGlUSPL1tGRhhw==","shasum":"0922effc442525b70f264669bb1203a52e33bc8e","tarball":"https://registry.npmjs.org/@armiasystems/react-native-armia-chat-sdk/-/react-native-armia-chat-sdk-1.0.0.tgz","fileCount":56,"unpackedSize":184202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgm6oqCRA9TVsSAnZWagAAR1wP/1q2v1SL6nerNtQ1e25n\nnTpIV7FCeEF/WZagfO9XVuMiYRdGsPSGGnl7J4c68SCsFMfvcN+bxmOw9l9+\nCWziwm4/TUlvCAa0W+PQ7lwNnIDXrjKYe0B4xD0QTtTW03kiDiQCnEFWWP2Z\nxDMElWId7O0RETLmyHCofqC5dArCwRuemliTbnPcnJY6PUpF5HXKnZlqwjjA\nHDZh56nUWU7eurbfzHc57Qex98QniNGauckm6kV8rew46bGJR5vxFQCEizat\ndzEOQXK4AeJ+gudPUrLKl7qGZr584sjCXkp1zRUNuMHkpSai1Zz3zwLwzG36\nRLRimPqJCxcZ9MNXzt7/WNcb33ELFi39muRK+mGaVWSOkGtfQxMy35CPXf0V\nsZcfCksXhP1jwVN98S/shWBlxhL00Ms+hv9av/aIm/+7yRALTUiPnMzcRTM8\nutRc+GKAfWVi98oF7mtjbeEUAH2SJFfelejLBWWPOANwoTfd4DDyNali6Rdf\nMGYIMw0rR66tuIxhFhRYVjmcweuzdPb8vjaWHbVBSG6XTG3bi7wodbVefeYf\n7hp/q2yeBpag1HgKL95r5IFBUt2+UC+J/9+O3V5+sZmsGFg5JCFJ1KtQngO6\n2WLKppXoW4NFbuXeoFxsj9ec3j37m+l/LLVfDigry/L4b+q6kFFJrs/m+WJ0\nFfp2\r\n=fsji\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIED7j1LwWhPvMNewXiWuTmpBZr4b5rgv2/NHTqxG/3RgAiEAyyRQ7IyGJmI9vzoONOmkrxwpbalyNk2vJj+h9Tf6DDE="}]},"_npmUser":{"name":"armiasystems","email":"developeraccount@armiasystems.com"},"directories":{},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-native-armia-chat-sdk_1.0.0_1620814377993_0.8067006561617192"},"_hasShrinkwrap":false},"1.0.1":{"name":"@armiasystems/react-native-armia-chat-sdk","version":"1.0.1","description":"## Getting started","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["react-native"],"author":{"name":"Swathy"},"license":"ISC","peerDependencies":{"react-native":"^0.41.2","react-native-windows":"0.41.0-rc.1"},"dependencies":{"@react-native-community/async-storage":"^1.12.1","@react-native-community/masked-view":"^0.1.10","@react-navigation/native":"^5.8.10","@react-navigation/stack":"^5.12.8","react":"16.13.1","react-native":"0.63.4","react-native-device-info":"^7.3.1","react-native-reanimated":"^1.13.2","react-native-vector-icons":"^7.1.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-proposal-decorators":"^7.2.0","@babel/runtime":"^7.12.5","@react-native-community/eslint-config":"^2.0.0","babel-jest":"^26.6.3","eslint":"^7.17.0","jest":"^26.6.3","metro-react-native-babel-preset":"^0.64.0","react-test-renderer":"16.13.1"},"repository":{"type":"git","url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","gitHead":"2d18546d93d85df2e6bc51d123a9dc7830da5052","_id":"@armiasystems/react-native-armia-chat-sdk@1.0.1","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ofKnfCZoHr4csuKShWCle+vmbsEY//PW57rdxbBRnyrJEkvZ3RbgIstk9ncoA/Qs28CYElE6XjtTV0i1uro/Mw==","shasum":"6b19a7cdbc4c7b576548ca510fb454837536e601","tarball":"https://registry.npmjs.org/@armiasystems/react-native-armia-chat-sdk/-/react-native-armia-chat-sdk-1.0.1.tgz","fileCount":56,"unpackedSize":184198,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgm6ruCRA9TVsSAnZWagAAiZcP/15917eGAnXazmqnY/dL\nVskBnPSPiyV5cbQkhizsekOZKZiggz3LZEEZMV3d6IVrO100t3irrbX4C3g1\nb2swcamk8QX5GkA4RE78dtX441ICaKq3KUmfoDwHT6piJqnI2Xy8MNg8xyM/\nQV2jfxwW4QiJVlxKB9i5JwFi6swOwsXQcMaKAvYcmNi3n44BLYJJ/IZzfmjG\nQJaaeQkJqnZLdbb5eHnyr7zqGaw0hrNPwmlJD2ym5OnuaPJ5C9jsefCSAqOi\nOQNCPI5CKRje43MBLK4t+D+b/EdJmduOJHpDC96yG2csUwoMFOTbWuR91Vd6\nzjqMWT1gF1zUYKDUdUkWiNGeCY2sGG9JlrpgRhT+bVxfRvIZvZFnhpn7Bflz\nnc4wenb3NntxgRIrxR+XcyqqG+yQyTiQSYQ+ebyghBz8/pNPYe2h6vErIgqm\n9itfyPN0XoNAvnnPxM3LhLdMWRgSZlfy9IIqogZWtX6eL0frcCQee8boSTdb\nPsBcgKDZViKbCOHWP92tb/x0973xXY6Nx80XgbpKgHvuKJhHK9I1NqL2d6W1\nigbBicRuCWGOFHcmFkG50z0DL8vVpEx0z5V8q32tZ3dfkAB/XAYnXaxTcxZ5\nk9g1o+WOuiK3OP88qs9sK9su3y34ykdb5/aBXVzDTrLqRLaaafMGAQ4Kz1Go\naR5M\r\n=O/sd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB/+SuXTlUNN+iAXfMkNLAJcCyvs9TAgI9f2kn4A3hdgAiAcHl9n5RIN/+BDHf0fnSY09Atj2H2Tm4tQL2tsw4lGcA=="}]},"_npmUser":{"name":"armiasystems","email":"developeraccount@armiasystems.com"},"directories":{},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-native-armia-chat-sdk_1.0.1_1620814574310_0.30697751615442304"},"_hasShrinkwrap":false},"1.0.2":{"name":"@armiasystems/react-native-armia-chat-sdk","version":"1.0.2","description":"## Getting started","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["react-native"],"author":{"name":"Swathy"},"license":"ISC","peerDependencies":{"react-native":"^0.41.2","react-native-windows":"0.41.0-rc.1"},"dependencies":{"@react-native-community/async-storage":"^1.12.1","@react-native-community/masked-view":"^0.1.10","@react-navigation/native":"^5.8.10","@react-navigation/stack":"^5.12.8","react":"16.13.1","react-native":"0.63.4","react-native-device-info":"^7.3.1","react-native-reanimated":"^1.13.2","react-native-vector-icons":"^7.1.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-proposal-decorators":"^7.2.0","@babel/runtime":"^7.12.5","@react-native-community/eslint-config":"^2.0.0","babel-jest":"^26.6.3","eslint":"^7.17.0","jest":"^26.6.3","metro-react-native-babel-preset":"^0.64.0","react-test-renderer":"16.13.1"},"repository":{"type":"git","url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","gitHead":"2c96331277ac8bc751880e5ad9b2b4d83b26b340","_id":"@armiasystems/react-native-armia-chat-sdk@1.0.2","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-lR4y5ESbU99fGdUGbuFNB7gkWDmnI8Fuj+V7k5v6cif4lpx8dd80JIunX7Jwl2JQ4J361FXVKqIyE9bD0If5jA==","shasum":"9014f19092ab16a70cc31b67272368e0bf9b1431","tarball":"https://registry.npmjs.org/@armiasystems/react-native-armia-chat-sdk/-/react-native-armia-chat-sdk-1.0.2.tgz","fileCount":56,"unpackedSize":180382,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnP0uCRA9TVsSAnZWagAAOkgP/iAq8r5FF8uAO3o6W/CL\nKBVhOc+AdubGShR1d2VT0iPepTuWxOAIoRa+sefWF9HQA0dhFzt2APPWu0pS\nLn2H6oTGIkZaRRTb5aDUTWq/VX3rMQuXIZzpaGGZgIWUzXkm0pKcvjZi8P4l\nfVR+VnAiz3Kbo0aNr63oDaS8IzslS7ZyyhpFh5oO/Jqxdf54xKdrIugIJGAE\n35CAuLOMRzNynyd+MTCLeHa711n64jdR+yexEId82VW+W0f5SuO8IFDuKDzQ\nYgxFZ6LlmiaXFNMVB4vUN4K2Tj0KMH8yb0fZstu5RzGd1GZx94cxriTblhPR\nSbVuXwso9zddyS4cvGsJDvsWUOocfhcQIB6NlD1ZrTuqMVWRCExitnFM6jBb\nZ5y0zGd+TpQ/RSbWJVqozreRbZbSeyq9fHnLaWKN0IQvwlRu2fUR7UBq14n1\njtQI3rqOwAyUwcjQ91QFVvw/3gbn1JiChiZ6tn3YT8v9HB8D90JGxc4b/MD1\nQ6oB99OnIaeI0+2F8SK7wTPc+9guKFssX57PK+MehFsZa8Lbdy/XWPgkyidc\nJKv50UHoHx4S1nwlN6uuNZ8o44XPqattUx6xK2ROcTuN0KRFXKA85aRNkVE2\nbyK3JO1YY/kyyy+a4fIl2fq6DuoPPIfPeJ3OtqNJXEW2FkluaafbOdw1Kzqg\njhoN\r\n=+xsc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgfhogEgL2qyj8mIF8/UiSOQzrYP1c316z0JcO7vX59gIgJs41CZTgUVV/fwYSbkJ9Mu0Bo0PaijK1Uki61H4vA3k="}]},"_npmUser":{"name":"armiasystems","email":"developeraccount@armiasystems.com"},"directories":{},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-native-armia-chat-sdk_1.0.2_1620901165574_0.5623534294618451"},"_hasShrinkwrap":false},"1.0.3":{"name":"@armiasystems/react-native-armia-chat-sdk","version":"1.0.3","description":"## Getting started","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["react-native"],"author":{"name":"Swathy"},"license":"ISC","peerDependencies":{"react-native":"^0.41.2","react-native-windows":"0.41.0-rc.1"},"dependencies":{"@react-native-community/async-storage":"^1.12.1","@react-native-community/masked-view":"^0.1.10","@react-navigation/native":"^5.8.10","@react-navigation/stack":"^5.12.8","react":"16.13.1","react-native":"0.63.4","react-native-device-info":"^7.3.1","react-native-reanimated":"^1.13.2","react-native-vector-icons":"^7.1.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-proposal-decorators":"^7.2.0","@babel/runtime":"^7.12.5","@react-native-community/eslint-config":"^2.0.0","babel-jest":"^26.6.3","eslint":"^7.17.0","jest":"^26.6.3","metro-react-native-babel-preset":"^0.64.0","react-test-renderer":"16.13.1"},"repository":{"type":"git","url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","gitHead":"2c96331277ac8bc751880e5ad9b2b4d83b26b340","_id":"@armiasystems/react-native-armia-chat-sdk@1.0.3","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-mqKJFs0La3oqU2nwPqrSO4sT4ZltZBJH+HUp3FH1VNbWr9G+sOb0OY5IQ28it1Pkhl6hrn1Q4WrhelLOEZR/+g==","shasum":"dbf32e8efcbada7702422a0e83998df88ebb016c","tarball":"https://registry.npmjs.org/@armiasystems/react-native-armia-chat-sdk/-/react-native-armia-chat-sdk-1.0.3.tgz","fileCount":56,"unpackedSize":180378,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnP4iCRA9TVsSAnZWagAAqyAQAIZo9uwRMKRzfahou7Pr\nAk80p8NqQCsmvYGH/E2O0Q2veD2d7o2SLDOXUW44kjuuQ2CneYgUOuQPYv86\noZsyok6iD/dgD6sFIK+u/laBMXnnTBEY36P+gXSpZQVceBNQHTkekLq32s37\nl94oUCgUNJJL5HUs7NxebeAYejhE+Y13mAiDx26wdAu7XydS0BI8vBYDbSOw\nYUA7AvQrn7v/5GWu/uoT/nc2QTroXOlYXwKmieaDepX2wP9wLSVcDTtTONDc\n5YIo5BUDWxvGZFJ/gEFkq7xyN5L+0wsGQzgpeTuAUqF6p6552S8y2PQ2h4vt\nbwx6nJX42zMN4jBc0gAmkGt6qy34Kc11IQoYoNzWyCURwz3WnQ3KVHULwoW3\npS4p9OoUYNciW1VlNQsFbKPkMrBns+Ho2TZiGS2zozm0cFj06mCFqwHWJa2Q\n+9JHh+k09uboowZomxgRNq+sCdQPjQR0f8K0z4Ofnu+3SxlHBADo/A4hzyl2\nmjEewF04xLDGzUD2SPTkyrZ0xgtKij96dTnAVEoAv5uCMBjgJaDtJE59Pd0G\nj+AXDZsrrhQuA5+dXRXjMyejAjwjFsnsquSacZ3L2cT1pqqwWpxKdNmSZxlC\ndnDnJI3FrQD0vevtZruwKbUW65yQ4KGB+eTEajBTljxxXnEO8DupuXMLkBkI\nAnXm\r\n=4iO/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEBySmydzdboNSL9NnuYdIzxL3Kmpo6SH5nv3TiZ6KuyAiEAyp9uUZQcZhPWy8iFE2v30dBBJuMFFRWVTzteuGteUPk="}]},"_npmUser":{"name":"armiasystems","email":"developeraccount@armiasystems.com"},"directories":{},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-native-armia-chat-sdk_1.0.3_1620901409926_0.798883677876832"},"_hasShrinkwrap":false},"1.0.4":{"name":"@armiasystems/react-native-armia-chat-sdk","version":"1.0.4","description":"## Getting started","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["react-native"],"author":{"name":"Swathy"},"license":"ISC","peerDependencies":{"react-native":"^0.41.2","react-native-windows":"0.41.0-rc.1"},"dependencies":{"@react-native-community/async-storage":"^1.12.1","@react-native-community/masked-view":"^0.1.10","@react-navigation/native":"^5.8.10","@react-navigation/stack":"^5.12.8","react":"16.13.1","react-native":"0.63.4","react-native-device-info":"^7.3.1","react-native-reanimated":"^1.13.2","react-native-vector-icons":"^7.1.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-proposal-decorators":"^7.2.0","@babel/runtime":"^7.12.5","@react-native-community/eslint-config":"^2.0.0","babel-jest":"^26.6.3","eslint":"^7.17.0","jest":"^26.6.3","metro-react-native-babel-preset":"^0.64.0","react-test-renderer":"16.13.1"},"repository":{"type":"git","url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","gitHead":"2c96331277ac8bc751880e5ad9b2b4d83b26b340","_id":"@armiasystems/react-native-armia-chat-sdk@1.0.4","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-g03arg3yF13t0l9oev8qkDX9zCxthKFWWmoa+akf9JCpFg5Xcmm6jZnNl/qMnpf/OCd9zHn8WoYR6HjYygR3Hw==","shasum":"f2b230bd3ea934112bf18ddb2abfbe2e0da05207","tarball":"https://registry.npmjs.org/@armiasystems/react-native-armia-chat-sdk/-/react-native-armia-chat-sdk-1.0.4.tgz","fileCount":56,"unpackedSize":180271,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnP89CRA9TVsSAnZWagAA2w8QAJPh0G5kM1Qsnhf02KMN\nP11yM9BTO3IDW27iSQlZpTcYg9Vf51zRShtRkvwwWAPLOOwyWt1dBm4hDLwI\nhVqGJUylPaIYPqrWa/ErJBCm232OcAV1yC9+okj6RNwLe328dopsGGL4KOMy\n3gCr/SPnvBwOyBDuIMMsnypGJup63Ti7G4uwdx6GSlYGQlTBPD5ehjsTf+gq\npEgKzZhR/1Y0gbTtWBUnn7zzXzfrVfoEQsvLk+pdIxeNVckubCeXe/lioZOD\nkFNzxC75etspGxk6JQ0JBUmZ4nX4fAGlyYsvDOIxff2lneB2W9jO0N3DuN5K\nB3nVOge5MLSLRsP7oVJPIInN+fdceZPHDk8/iXzy18nDeDO5V36zoa8LfoNt\nPgUDwdgB1oHfcrQEYrtNwXAseOxZFX19Fon41YOkCUWK6C6g5PihhHgx5i/Y\nD3G6MFxN7hMkS7Ew/ozRZN7B72AdV2S+CaRI1szNLqNjtxYXtoduT+mCRXhD\nHpobec87Q+3cLJmMqXMq6fiTu0+DBJoOOTgmLwXxGzY0lY7DPcj8FoFjUnXA\ncpuVHZWzuaWb3e5FqccET6VmNcXhMBzstACMa20SBSR2VkgQLoe/FmkJMi4W\n7Wgc3qY/6LdhMkXBFakxYayWS09wpLfhxORJrb1Td4p++MTPjfIKqHq5Nfes\nmLAW\r\n=ls3b\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGDs9tUGS5Za3Qs94qQTOHDu0OxQM/sSH//FiU3l8ZIvAiEAiGIspzma9uIoKphNi/fFdCJpKRq5Aa4ZjY2CocV6hZI="}]},"_npmUser":{"name":"armiasystems","email":"developeraccount@armiasystems.com"},"directories":{},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-native-armia-chat-sdk_1.0.4_1620901692722_0.5659536658612212"},"_hasShrinkwrap":false},"1.0.8":{"name":"@armiasystems/react-native-armia-chat-sdk","version":"1.0.8","description":"## Getting started","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["react-native"],"author":{"name":"Swathy"},"license":"ISC","peerDependencies":{"react-native":"^0.63.4","react-native-windows":"0.41.0-rc.1"},"dependencies":{"@react-native-community/async-storage":"^1.12.1","@react-native-community/masked-view":"^0.1.10","@react-navigation/native":"^5.8.10","@react-navigation/stack":"^5.12.8","mobx":"4.15.7","mobx-react":"5.4.4","moment":"2.29.4","react":"16.13.1","react-native":"0.63.4","react-native-audio-recorder-player":"3.5.3","react-native-device-info":"7.3.1","react-native-document-picker":"5.2.0","react-native-fetch-blob":"0.10.8","react-native-file-provider":"^1.1.0","react-native-file-viewer":"^2.1.5","react-native-fs":"2.20.0","react-native-gesture-handler":"1.9.0","react-native-image-picker":"^5.4.0","react-native-reanimated":"1.13.2","react-native-safe-area-context":"^4.5.3","react-native-screens":"~2.16.1","react-native-size-matters":"0.1.7","react-native-snackbar":"^2.6.2","react-native-sound":"0.11.2","react-native-svg":"12.1.0","react-native-vector-icons":"^9.2.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-proposal-decorators":"^7.12.12","@babel/runtime":"^7.12.5","@react-native-community/eslint-config":"^2.0.0","babel-jest":"^26.6.3","eslint":"^7.17.0","jest":"^26.6.3","metro-react-native-babel-preset":"^0.64.0","react-test-renderer":"16.13.1"},"repository":{"type":"git","url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","gitHead":"3e38353a46b7ee68d8e05b305f85c19a9fbb7992","_id":"@armiasystems/react-native-armia-chat-sdk@1.0.8","_nodeVersion":"19.4.0","_npmVersion":"9.2.0","dist":{"integrity":"sha512-Q1eVUk3YC/dQoJswXDkY5e9Sd3TB/o47pc2Ie9EPLu4xYsiAPIbg3vIBCg6Qnty3Qwfdd/XTvYV5FAX/2WX/Ug==","shasum":"cd3f9b106a03289ccaddc7e02dbba4cbc6593a3d","tarball":"https://registry.npmjs.org/@armiasystems/react-native-armia-chat-sdk/-/react-native-armia-chat-sdk-1.0.8.tgz","fileCount":97,"unpackedSize":585702,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF5IZPk+WtS3CRDcxnUaOq2NlaaPWNiSNEi2EVKLhcRdAiEA/a4FHMj+D54H0I3Mo6EoYboSRpz/2mo3gYZLNCLippw="}]},"_npmUser":{"name":"armiasystems","email":"developeraccount@armiasystems.com"},"directories":{},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-native-armia-chat-sdk_1.0.8_1686982892985_0.43465146455715775"},"_hasShrinkwrap":false},"1.0.9":{"name":"@armiasystems/react-native-armia-chat-sdk","version":"1.0.9","description":"## Getting started","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["react-native"],"author":{"name":"Swathy"},"license":"ISC","peerDependencies":{"react-native":"^0.63.4","react-native-windows":"0.41.0-rc.1"},"dependencies":{"@react-native-community/async-storage":"^1.12.1","@react-native-community/masked-view":"^0.1.10","@react-navigation/native":"^5.8.10","@react-navigation/stack":"^5.12.8","mobx":"4.15.7","mobx-react":"5.4.4","moment":"2.29.4","react":"16.13.1","react-native":"0.63.4","react-native-audio-recorder-player":"3.5.3","react-native-device-info":"7.3.1","react-native-document-picker":"5.2.0","react-native-fetch-blob":"0.10.8","react-native-file-provider":"^1.1.0","react-native-file-viewer":"^2.1.5","react-native-fs":"2.20.0","react-native-gesture-handler":"1.9.0","react-native-image-picker":"^5.4.0","react-native-reanimated":"1.13.2","react-native-safe-area-context":"^4.5.3","react-native-screens":"~2.16.1","react-native-size-matters":"0.1.7","react-native-snackbar":"^2.6.2","react-native-sound":"0.11.2","react-native-svg":"12.1.0","react-native-vector-icons":"^9.2.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-proposal-decorators":"^7.12.12","@babel/runtime":"^7.12.5","@react-native-community/eslint-config":"^2.0.0","babel-jest":"^26.6.3","eslint":"^7.17.0","jest":"^26.6.3","metro-react-native-babel-preset":"^0.64.0","react-test-renderer":"16.13.1"},"repository":{"type":"git","url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","gitHead":"fcb08cb08a2648fe586098ebea4eb0cc65a7b4aa","_id":"@armiasystems/react-native-armia-chat-sdk@1.0.9","_nodeVersion":"19.4.0","_npmVersion":"9.2.0","dist":{"integrity":"sha512-/YOTdxJytxIAU3WFKmWpTLbnpOMZz0kyrreE3AzDrIWMs0wEPGh9z7zOUQHvqQuVIxDF1XytakyNAY2uVAQASg==","shasum":"a732b677b1b5c6e3c9d6b79feb741fc3856f42dc","tarball":"https://registry.npmjs.org/@armiasystems/react-native-armia-chat-sdk/-/react-native-armia-chat-sdk-1.0.9.tgz","fileCount":97,"unpackedSize":585080,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4vrSYB82y4NP4Bx+N2BTLGe4SlEJ6uTvMinjkZK/pgwIhAP4fvmGqRdQPuV7w+JS/kRfzRdSaczVYF0eILrVusG/o"}]},"_npmUser":{"name":"armiasystems","email":"developeraccount@armiasystems.com"},"directories":{},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-native-armia-chat-sdk_1.0.9_1687192309870_0.304296870303119"},"_hasShrinkwrap":false}},"time":{"created":"2021-05-12T10:12:57.929Z","1.0.0":"2021-05-12T10:12:58.164Z","modified":"2023-06-19T16:31:50.255Z","1.0.1":"2021-05-12T10:16:14.463Z","1.0.2":"2021-05-13T10:19:25.764Z","1.0.3":"2021-05-13T10:23:30.096Z","1.0.4":"2021-05-13T10:28:12.851Z","1.0.5":"2023-06-05T04:17:34.279Z","1.0.6":"2023-06-06T04:56:07.501Z","1.0.7":"2023-06-12T17:22:10.059Z","1.0.8":"2023-06-17T06:21:33.278Z","1.0.9":"2023-06-19T16:31:50.145Z"},"maintainers":[{"name":"armiasystems","email":"developeraccount@armiasystems.com"}],"description":"## Getting started","homepage":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk#readme","keywords":["react-native"],"repository":{"type":"git","url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk.git"},"author":{"name":"Swathy"},"bugs":{"url":"https://gitlab.armiasystems.com/mobilelearningprojects/armiachatsdk/issues"},"license":"ISC","readme":"# @armiasystems/react-native-armia-chat-sdk\n\n## Getting started\n\n### NPM\n\n`$ npm install @armiasystems/react-native-armia-chat-sdk --save`\n\n### YARN\n\n`$ yarn add @armiasystems/react-native-armia-chat-sdk`\n\n### Firebase Set up\n\nFor Firebase setup you need to follow this [instructions](https://firebase.google.com/docs/android/setup)\n\nSetup the RealTime Database and Storage in Firebase with edited rules \n\n### Install dependencies\n@react-native-community/async-storage,\n@react-native-community/masked-view\n@react-native-firebase/app,\n@react-native-firebase/auth,\n@react-native-firebase/database,\n@react-native-firebase/firestore,\n@react-native-firebase/storage,\nmobx,\nmobx-react,\nreact-native-animatable,\nreact-native-audio-recorder-player,\nreact-native-device-info,\nreact-native-document-picker,\nreact-native-fast-image,\nreact-native-fetch-blob,\nreact-native-file-provider,\nreact-native-file-viewer,\nreact-native-fs,\nreact-native-gesture-handler,\nreact-native-image-picker,\nreact-native-modal,\nreact-native-permissions\nreact-native-phone-input,\nreact-native-reanimated,\nreact-native-safe-area-context,\nreact-native-screens,\nreact-native-size-matters,\nreact-native-snackbar,\nreact-native-sound,\nreact-native-svg,\nreact-native-vector-icons,\n\n\nMake sure all dependencies settings/installation are done by refering respective npm package to avoid build errors\n\n## Usage\n\n## Sign up, login using firebase email authentication\n\n```javascript\n\nimport auth from \"@react-native-firebase/auth\";\nimport database from \"@react-native-firebase/database\";\nimport {saveKey,saveUserDisplayName,saveEmail} from\"@armiasystems/react-native-armia-chat-sdk/src/utils/asyncStorage\";\n\nasync function register(name, email, password) {\n  try {\n    let result = await auth().createUserWithEmailAndPassword(email, password);\n    if (result) {\n      //save result\n      //save userKey into async storage \n      saveKey(result.data.key);\n      saveUserDisplayName(result.data.name);\n      saveEmail(result.data.email);\n    } else {\n      console.log(\"error\", result);\n    }\n  } catch (e) {\n    console.log(e);\n  }\n}\n\nasync function login(email, password) {\n  try {\n    let result = await auth().signInWithEmailAndPassword(email, password);\n    if (result) {\n      //save result\n      //save userKey into async storage \n    } else {\n      console.log(\"error\", result);\n    }\n  } catch (e) {\n    console.log(e);\n  }\n}\n\n```\n\n## Sign up, login using firebase phone authentication\n\nFor Firebase phone authentication you need to follow this [instructions](https://rnfirebase.io/auth/phone-auth)\n\n```javascript\nimport React, { useState} from 'react';\nimport auth from \"@react-native-firebase/auth\";\nimport {saveKey,saveUserDisplayName,saveEmail} from\"@armiasystems/react-native-armia-chat-sdk/src/utils/asyncStorage\";\n\nfunction PhoneSignIn() {\n   // If null, no SMS has been sent\n  const [confirm, setConfirm] = useState(null);\n\n  // verification code (OTP - One-Time-Passcode)\n  const [code, setCode] = useState('');\n  async function register(phoneNumber) {\n    try {\n      let result = await auth().signInWithPhoneNumber(phoneNumber);\n      if (result) {\n        //save result\n        //save userKey into async storage \n      saveKey(result.data.key);\n      saveUserDisplayName(result.data.name);\n      saveEmail(result.data.email);\n      setConfirm(confirmation);\n      } else {\n        console.log(\"error\", result);\n      }\n    } catch (e) {\n      console.log(e);\n    }\n  }\n  async function confirmCode() {\n    try {\n      await confirm.confirm(code);\n    } catch (error) {\n      console.log('Invalid code.');\n    }\n  }\n}\n\n```\n## Logout \n\n```javascript\n\nimport auth from \"@react-native-firebase/auth\";\nimport database from \"@react-native-firebase/database\";\nimport {removeAllKeys} from\"@armiasystems/react-native-armia-chat-sdk/src/utils/asyncStorage\";\n\nasync function logout() {\n  try {\n    let keyFromAsync = await loadKey();\n    const reference = database().ref(`/online/${keyFromAsync}`);\n\n    reference.set(true).then(() => console.log(\"Online presence set\"));\n\n    // Remove the node whenever the client disconnects\n    reference\n      .onDisconnect()\n      .remove()\n      .then(() => console.log(\"On disconnect function configured.\"));\n    await database()\n      .ref(\"Users\")\n      .child(keyFromAsync)\n      .update({ online: false });\n    await database()\n      .ref(\"Users\")\n      .child(keyFromAsync)\n      .update({ lastSeen: Date.now() });\n\n    onSignOut().then(async () => {\n      removeAllKeys();\n      await auth().signOut();\n      dispatch({ type: \"SIGN_OUT\" });\n    });\n    //clear values in onSignOut function and switch the stack\n  } catch (e) {\n    console.error(e);\n  }\n}\n\n```\n## app.js setup\n\n```javascript\n\nimport { Provider } from \"mobx-react\";\nimport stores from \"@armiasystems/react-native-armia-chat-sdk/src/store\";\n\nfunction App() {\n  return (\n    <Provider {...stores}>   \n       // Add the Navigation Container\n    </Provider>\n  );\n}\n\nexport default App;\n\n```\n\n## List all threads [The Conversation List]\n\n```javascript\n\n//A class component with ConversationList component will give chat list\n\nimport ConversationList from '@armiasystems/react-native-armia-chat-sdk/src/chatComponents/conversationList';\nimport Conversations from '@armiasystems/react-native-armia-chat-sdk/src/store/conversation';\nimport ConversationItem from '@armiasystems/react-native-armia-chat-sdk/src/chatComponents/conversationItem';\nimport Snackbar from 'react-native-snackbar';\nimport moment from 'moment';\n    \nrender(){\n  let keyFromAsync = await loadKey();\n  return(\n  <ConversationList\n    primaryColor={'#4090B3'}\n    Preview={(data, index) =>\n      this.CustomListItemPreview(data, index)\n    }\n    token={this.state.key}//keyFromAsync saved to state as 'key'\n    navigation={this.props.navigation}\n    contentContainerStyle={{\n      paddingBottom: 80,\n      flexGrow: 1,\n      paddingTop: 15,\n    }}\n    goToDetails={() => {}}\n    ref={(inst) => (this.listRef = inst)}\n    deleteConversations={(item) => {\n      this.deleteConversation(item);\n    }}\n    listEmptyComponent={this.renderListEmpty()}\n    customLoader={()=>{\n      //Provide any loader component\n    }}\n  />\n  )\n}\n\n\n  CustomListItemPreview = (item, index) => {\n\n    let result = '';\n    let you = '';\n    if (item.lastType === 'info') {\n      let text = item.lastMessage;\n      // Save the username to state as 'name'\n      if (text.includes(this.state.name)) {\n        result = text.replace(this.state.name, 'You');\n      } else {\n        result = item.lastMessage;\n      }\n    }\n    if (item.lastMsgUser.split('***')[0] === item.userId) {\n      you = 'true';\n    }\n    this.filterUnreadConversationCount(item, this.state.key);\n    return (\n      <ConversationItem\n        isGroup={item.type === 'group'}\n        navigation={this.props.navigation}\n        imageSrc={item.avatarSource ? item.avatarSource : undefined}\n        username={item.name ? item.name : item.email}\n        bio=\"\"\n        description={\n\n          item.type === 'group'\n            ? item.lastType !== 'info'\n              ? item.lastMsgUser\n                ? item.lastMsgUser.split('***')[0] === item.userId\n                  ? 'You' + ': ' + item.lastMessage\n                  : item.lastMsgUser.split('***')[1] + ': ' + item.lastMessage\n                : item.lastMessage\n              : result\n            : item.lastMessage\n        }\n        type={item.lastType}\n        time={this.formatedTime(item.lastTime)}\n        notification={\n          item.userUnreadCount !== 0 &&\n            item.userUnreadCount !== undefined &&\n            item.userUnreadCount !== null\n            ? item.userUnreadCount\n            : ''\n        }\n        isBlocked={false}\n        isMuted={false}\n        hasStory={false}\n        ownKey={this.state.key}//keyFromAsync saved to state as 'key'\n        receiverKey={item.userKey}\n        chatInfo={item}\n        onPress={() => {\n          this.onPressListItem(item);\n        }}\n        onLongPress={() => {\n          this.deleteConversation(item);\n        }}\n        goToProfile={() => {\n          this.onPressListItem(item);\n        }}\n        yourMessage={you}\n      />\n    );\n  };\n\n  deleteConversation = (item) => {\n    if (item.type !== 'group') {\n      Alert.alert('Remove', 'Do you want to remove the conversation?', [\n        {\n          text: 'NO',\n          onPress: () => console.log('Cancel Pressed'),\n        },\n        {\n          text: 'YES',\n          onPress: async () =>\n          {\n            //keyFromAsync saved to state as 'key'\n            Conversations.deleteConversation(this.state.key, item.key)\n              .then((result) => {\n                if (result) {\n                  this.listRef.removeItemFromList(item.key);\n                } else {\n                  Snackbar.show({\n                    text: 'Something went wrong, Please try again later',\n                    duration: Snackbar.LENGTH_SHORT,\n                  });\n                }\n              })\n              .catch((err) => console.warn('error====>', err));\n           },\n        },\n      ]);\n    }\n  };\n\n  onPressListItem = (item) => {\n        this.props.navigation.navigate('ChatView', {\n        conversationKey: item.type === 'group' ? item.conversation_key : item.key,\n        currentUserKey: this.state.key,//keyFromAsync saved to state as 'key'\n        title: item.name ? item.name : item.email,\n        imageURL: item.avatarSource,\n        unreadCount: item.unreadCount,\n        userkey_unreadCount: item.userkey_unreadCount,\n        update: this.update(),\n        lastseen: item.lastSeen,\n        isOnline: item.online,\n        type: item.type,\n        receiverKey: item.userKey,\n        chatInfo: item,\n        isAGroupMember:'',\n      });\n  };\n  renderListEmpty = () => {\n    return (\n      <View style={styles.emptyListContainer}>\n        <Text>No chats yet</Text>\n      </View>\n    );\n  };\n   update = async () => {\n    this.listRef.refreshList();\n  };\n  formatedTime = (time) => {\n    var formatted = '';\n    let timestempFormated;\n\n    let fulltoday = new Date();\n    var today =\n      fulltoday.getDate() +\n      '-' +\n      parseInt(fulltoday.getMonth() + 1) +\n      '-' +\n      fulltoday.getFullYear();\n    let yesterday =\n      fulltoday.getDate() -\n      1 +\n      '-' +\n      parseInt(fulltoday.getMonth() + 1) +\n      '-' +\n      fulltoday.getFullYear();\n    if (time) {\n      var timestemp = new Date(time);\n\n      let hour = timestemp.getHours() % 12 || 12;\n      let ampm = timestemp.getHours() < 12 ? ' AM' : ' PM';\n\n      timestempFormated =\n        timestemp.getDate() +\n        '-' +\n        parseInt(timestemp.getMonth() + 1) +\n        '-' +\n        timestemp.getFullYear();\n\n      if (timestempFormated === today) {\n        formatted =\n          hour + ':' + ('0' + timestemp.getMinutes()).slice(-2) + ampm;\n      } else if (timestempFormated === yesterday) {\n        formatted = 'Yesterday';\n      } else {\n\n        formatted = moment(timestemp).format('DD/MM/YYYY');\n\n        // formatted =\n        //   ('0' + timestemp.getDate()).slice(-2) +\n        //   '/' +\n        //   ('0' + timestemp.getMonth()).slice(-2) +\n        //   '/' +\n        //   timestemp.getFullYear();\n      }\n    }\n    return formatted;\n  };\n\n   filterUnreadConversationCount = async (data, userkey) => {\n    const unreadCountVal = data.userUnreadCount;\n    if (unreadCountVal !== 0) {\n      if (this.state.contactsListFiltered.includes(data.conversation_key) === false) {\n        this.state.contactsListFiltered.push(data.conversation_key);\n      }\n    }\n    const count = this.state.contactsListFiltered.length;\n    //  console.log('Count', count);\n    if (count !== 0) {\n      await database()\n        .ref('Users')\n        .child(userkey)\n        .update({ unreadChatCount: count });\n    } else {\n      await database()\n        .ref('Users')\n        .child(userkey)\n        .update({ unreadChatCount: 0 });\n    }\n  };\n\n```\n\n\n## To use single contact list item\n\n```javascript\n\nimport Contact from \"@armiasystems/react-native-armia-chat-sdk/src/components/contact\";\nimport database from '@react-native-firebase/database';\n\n<Contact\n  name={item.name}\n  item={item}\n  avatarUrl={{\n    uri: item.avatarSource !== \"\" ? item.avatarSource : undefined\n  }}\n  bio={item.bio}\n  onPress={() =>\n   //check whether the current user is a member of the group & then add isAGroupMember value\n    startConversation(item.key).then(val => {\n      //Navigate to a screen called \"ChatView\" that has ChatDetails component(Can be found in SDK) with below props\n      //** Make sure the component name should be \"ChatView\" in navigator stack (Since many internal redirection are done using this route name)\n    \n      navigation.navigate(\"ChatView\", {\n        conversationKey: item.type === 'group' ? item.conversation_key : item.key,\n        currentUserKey: key,\n        title: item.name ? item.name : item.email,\n        imageURL: item.avatarSource,\n        unreadCount: item.unreadCount,\n        userkey_unreadCount: item.userkey_unreadCount,\n        update: this.update(),\n        lastseen: item.lastSeen,\n        isOnline: item.online,\n        type: item.type,\n        receiverKey: item.userKey,\n        chatInfo: item,\n        isAGroupMember:isAGroupMember !== undefined ? isAGroupMember : '',\n      });\n    })\n  }\n  reRenderFlatList={(index, unreadvalue) => {}}\n/>;\n\n  update = async () => {\n    //Add a ref to refresh the list\n  };\n\n startConversation = async (receiver) => {\n  const keyFromAsync = await loadKey();\n    try {\n      let key = null;\n\n      let Users = {};\n      Users[keyFromAsync] = true;\n      Users[receiver] = true;\n\n      const snapshot = await database()\n        .ref('Conversations')\n        .orderByChild(keyFromAsync)\n        .equalTo(true)\n        .once('value');\n\n      snapshot.forEach((item) => {\n        item.forEach((subItem) => {\n          if (\n            subItem.key === receiver &&\n            item.child('type').val() !== 'group'\n          ) {\n            key = item.key;\n            return;\n          }\n        });\n      });\n\n      if (key === null || key === undefined) {\n        key = await database().ref('Conversations').push(Users).key;\n      }\n\n      return Promise.resolve(key);\n    } catch (error) {\n      return Promise.reject(error);\n    }\n  };\n\n```\n\n## To use chat details page\n\n```javascript\nimport ChatDetails from \"@armiasystems/react-native-armia-chat-sdk/src/chatComponents/chatDetails\";\n\n <ChatDetails\n  conversationKey={conversationKey}\n  currentUserKey={keyFromAsync}\n  uri={imgUrl}\n  title={title}\n  goBack={() => {\n    navigation.goBack();\n  }}\n  navigation={navigation}\n  unreadCount={unreadCount}\n  lastseen={lastseen}\n  isOnline={isOnline}\n  type={type}\n  userName={userName}\n  isAMemberOfGroup={\n     //check whether the current user is a member of the group & then check\n    isAGroupMember\n    ? isAGroupMember\n    : 'No'\n  }\n  goToProfile={() => {\n    if (type === 'group') {\n      //navigate to group details screen\n    }\n  }}\n  customHeader={(isOnline, lastSeen, type, typingInfo) =>\n    //Add a customHeader to chat details screen(You can refer to ChatHeader component in SDK)\n  }\n  placeHolder={'Type Something…'}\n  customSenderMsg={(data) => {\n    // Add the message component (You can refer to ChatCard component in SDK with isLeft={false}) \n  }}\n  customReceiverMsg={(data) => {\n     // Add the message component (You can refer to ChatCard component in SDK with isLeft={true}) \n  }}\n  customFooterMainContainerStyle={{\n          paddingHorizontal: 10,\n          justifyContent: 'space-between',\n          alignItems: 'center',\n          flexDirection: 'row',\n          paddingVertical: 10,\n          backgroundColor: 'white',\n          borderWidth: 0,\n          elevation: 0,\n          borderRadius: 0,\n          margin: 0,\n    //Messagebar container  style\n  }}\n  customFooterInnerContainerStyle={{\n          flexDirection: 'row',\n          backgroundColor: 'white',\n          flex: 3,\n          marginHorizontal: 10,\n          paddingVertical: Platform.OS === 'ios' ? 10 : 0,\n          borderRadius: 30,\n          alignItems: 'center',\n          justifyContent: 'space-between',\n          elevation: 2,\n    //Messagebar inner style\n  }}\n  textInputStyle={{ \n    fontWeight: '400',\n    //Message bar text style\n  }}\n  sendIconSize={25}\n  sendIconColor={'white'\n    //Send icon background color\n  }\n  primaryColor={'#4090B3'}\n  senderBg={\n    '#4090B3'\n    //Sender chat bubble background color\n  }\n  receiverBg={\n     '#F5F5F5'\n    //Reciever chat bubble background color\n  }\n  sendIconContainerStyle={{ \n     backgroundColor: '#4090B3',\n    //Send button background color\n  }}\n  receiverKey={receiverKey}\n  mediaPress={(type,url)=>{\n    console.log('Type',type);\n    console.log('Url',url);\n    //case 'image':\n         //Add image view screen\n    //case 'video':\n         //Add video view screen with video player\n    // case 'doc':\n         //Add FileViewer to open files or documents\n  }\n      \n  }\n  isVoiceShareAvailable={true}\n  fileSharingEnable={true}\n  isTypingIndicatorEnabled={true}\n  ref={(inst) => (this.chatListRef = inst)}\n  />\n\n```\n## ChatHeader\n\n```javascript\n\nimport ChatHeader from '@armiasystems/react-native-armia-chat-sdk/src/components/chatComponents/ChatHeader';\nimport SDKGroup from '@armiasystems/react-native-armia-chat-sdk/src/store/group';\n\n//Info needed for GroupDetials screen\nconst [groupDetails, setGroupDetails] = useState([]);\nconst [admin, setAdmin] = useState('');\n async function loadGroupDetails() {\n    let keyFromAsync = await loadKey();\n    SDKGroup.loadGroupInfo(\n      keyFromAsync,\n      props.route.params.conversationKey,\n    ).then(result => {\n      if (result) {\n        setGroupDetails(result);\n        if (result.data.adminKey) {\n          if (keyFromAsync === result.data.adminKey) {\n            setAdmin(true);\n          } else {\n            setAdmin(false);\n          }\n        }\n      }\n    });\n  }\n\n\n<ChatHeader\n  type={type}\n  onOpenProfile={() => {\n     //Can either use SDK friendProfilePage & GroupDetails screen or provide a custom Profile screen\n     //**********Usage *********\n\n    if (type === 'group') {\n\n       // 1) Add the  GroupDetail screen to the navigation stack\n      import GroupDetails from '@armiasystems/react-native-armia-chat-sdk/src/screens/groupDetails';\n\n      // 2) Add the below navigation step \n      navigation.navigate('GroupDetails', {\n              conversationKey: conversationKey, \n              title: 'Group detail',\n              addedList: groupDetails?.data.participantList,\n              name: groupDetails?.data.groupName,\n              profileImage: groupDetails?.data.groupImage,\n              groupKey: groupDetails?.data.groupKey,\n              createUserId: groupDetails?.data.createUser,\n              adminKey: groupDetails?.data.adminKey,\n              returnScreen:'Home' \n\n              // \"returnScreen\"-> screen which you want to return after certain function like exist/delete group\n\n            });\n    } else {\n\n      // 1) Add the  FriendProfilePage screen to the navigation stack\n      import FriendsProfilePage from '@armiasystems/react-native-armia-chat-sdk/src/screens/friendsProfilePage';\n\n      // 2) Add the below navigation step\n            navigation.navigate('FriendsProfilePage', {\n              username: title,\n              bio: '',\n              imageSrc: imgUrl,\n              isBlocked: false,\n              isMuted: false,\n              ownKey: key,\n              receiverKey:receiverKey,\n              chatInfo: chatInfo,\n            });\n    }\n  }}\n  onPress={() => navigation.goBack()}\n  username={title}\n  imageSrc={imgUrl}\n  receiverKey={receiverKey}\n  onlineStatus={\n   isOnline ? 'Online' : 'Last seen at ' + this.getLastSeen(lastSeen)\n  }\n  lastSeen={lastSeen}\n  typingInfo={typingInfo}\n  />\n\n  getLastSeen = (lastseenVal) => {\n    var formatted = 'unknown';\n    let lastseen = lastseenVal;\n    let dispayTimestempDay = '';\n    let timestempday = '';\n    if (lastseen) {\n      var fulltoday = new Date();\n      var today =\n        fulltoday.getDate() +\n        '-' +\n        parseInt(fulltoday.getMonth() + 1) +\n        '-' +\n        fulltoday.getFullYear();\n\n      fulltoday.setDate(fulltoday.getDate() - 1);\n      var yesterday =\n        fulltoday.getDate() +\n        '-' +\n        parseInt(fulltoday.getMonth() + 1) +\n        '-' +\n        fulltoday.getFullYear();\n\n      var timestemp = new Date(lastseen);\n      timestempday =\n        timestemp.getDate() +\n        '-' +\n        parseInt(timestemp.getMonth() + 1) +\n        '-' +\n        timestemp.getFullYear();\n      dispayTimestempDay =\n        (timestemp.getDate() < 9\n          ? '0' + timestemp.getDate()\n          : timestemp.getDate()) +\n        '-' +\n        (parseInt(timestemp.getMonth() + 1) < 9\n          ? '0' + parseInt(timestemp.getMonth() + 1)\n          : parseInt(timestemp.getMonth() + 1)) +\n        '-' +\n        timestemp.getFullYear();\n\n      let hour = timestemp.getHours() % 12 || 12;\n      let ampm = timestemp.getHours() < 12 ? ' AM' : ' PM';\n\n      if (timestempday === today) {\n        formatted =\n          (hour >= 10 ? hour : '0' + hour) +\n          ':' +\n          ('0' + timestemp.getMinutes()).slice(-2) +\n          ampm;\n      } else if (timestempday === yesterday) {\n        formatted = 'Yesterday';\n      } else {\n        formatted = dispayTimestempDay;\n      }\n    }\n    return formatted;\n  };\n\n```\n## ChatCard (Message bubble)\n\n```javascript\n\nimport ChatCard from '@armiasystems/react-native-armia-chat-sdk/src/components/chatComponents/chatCard';\n\n<ChatCard\n  time={time}\n  isLeft={false} //Sender=false, Reciever=true  \n  chat={content}\n  type={type}\n  name={name}\n  isSeen={isSeen}\n  isDelivered={isDelivered}\n  messageKey={messageKey}\n  conversationKey={conversationKey}\n  deleteMsg={(messageKey, deleteValue) => {\n      if (this.chatListRef) {\n        //--------Sender\n        //this.chatListRef.removeMessageFromList(messageKey, deleteValue);\n        //---------Reciever\n        //this.chatListRef.removeMessageFromList(messageKey);\n      }\n    //Do function to remove message\n  }}\n  showAvatar={showAvatar}\n  messageType={messageType}\n  />\n\n```\n## Searching users\n\n```javascript\n\nimport database from '@react-native-firebase/database';\n\nconst snapshot = await database()\n  .ref('Users')\n  .once('value');\nlet contacts = []\nsnapshot.forEach(item => {\n  if (item.val().name) {\n    if (\n      item\n        .val()\n        .name.toLowerCase()\n        .includes(text.toLowerCase())\n    ) {\n      const contact = {\n        key: item.key,\n        lastTime: '',\n        lastMessage: ''\n        ...item.val(),\n      };\n      if (item.key !== key) {\n        contacts.push(contact);\n      }\n    }\n  }\n});\n\n```\n## Block & Unblock user\n\n```javascript\n\nimport database from '@react-native-firebase/database';\nimport {Alert} from 'react-native';\n\nasync function fetchBlockUserList (shouldBlock) {\n  let keyFromAsync = await loadKey(); //ownKey\n  const referencePath = '/blocked/' + keyFromAsync;\n  database().ref(referencePath)once('value').then((snapshot) => {\n    let blockList = [];\n    if (snapshot.val() != null && snapshot.val().length !== 0) {\n      blockList = snapshot.val();\n    }\n    if (shouldBlock) {\n      Alert.alert('Block', 'Are you sure you want to block?', [\n        {\n          text: 'Cancel',\n          style: 'cancel',\n        },\n        { text: 'Block', onPress: () => blockTheUser(blockList) },\n      ]);\n    } else {\n      unblockTheUser(blockList);\n    }\n  });\n}\n\nasync function blockTheUser(blockList){\n  let keyFromAsync = await loadKey(); //ownKey\n  const referencePath = '/blocked/' + keyFromAsync;\n\n  let updatedList = blockList;\n  //Push the user key which you want to block to updatedList\n  updatedList.push(userkey); \n  database().ref(referencePath).set(updatedList).then(() => {\n    // Save the result to state to refer whether the user is blocked or not\n  });\n};\n\nasync function unblockTheUser(blockList){\n  let keyFromAsync = await loadKey();//ownKey\n  const referencePath = '/blocked/' + keyFromAsync;\n\n  let filtered = blockList.filter((item) => item !== userkey);\n  database().ref(referencePath).set(filtered).then(() => {\n    // Save the result to state to refer whether the user is blocked or not\n  });\n};\n\n```\n\n## Creating a group \n\n```javascript\n\n//Initailly add below screen from the SDK to the stack navigator\n\n//Make sure the stack screen name should be same as import name(eg:GroupDetails)\n\nimport GroupDetails from '@armiasystems/react-native-armia-chat-sdk/src/screens/groupDetails';\nimport CreateGroup from '@armiasystems/react-native-armia-chat-sdk/src/screens/createGroup';\nimport AddParticipants from '@armiasystems/react-native-armia-chat-sdk/src/screens/addParticipants';\n\n\n<TouchableOpacity\n  onPress={() =>\n \n    this.props.navigation.navigate('AddParticipants', {\n      title: 'Create Group', \n      returnScreen: 'Home',//Screen which the user will redirected after group creation\n      })\n  }>\n  <Text>Create Group</Text>\n</TouchableOpacity>\n\n//The above Touchable opacity onPress will navigate you to AddParticipants screen which is added to your app stack navigator\n\n//Here we will see the list of user where we can select the participant and the press the botton arrow to CreateGroup with name & photo then press forward arrow in the bottom to create group\n\n//Here a return screen  will redirect to specified screen\n\n```\n\n## Image Upload\n\n```javascript\nimport storage from \"@react-native-firebase/storage\";\n\nasync function imageUpload() {\n  let url = \"\",\n    ref = \"\";\n  let data = {\n    groupSource: groupImage,\n    groupRef: groupImage\n  };\n  if (fileName !== \"\") {\n    const rImage = await storage()\n      .ref(\"/groupPics/\" + getFileName(fileName))\n      .putFile(groupImage);\n\n    url = await storage()\n      .ref(rImage.metadata.fullPath)\n      .getDownloadURL();\n\n    ref = rImage.metadata.fullPath;\n\n    data = {\n      groupSource: url,\n      groupRef: ref\n    };\n  }\n  return data;\n}\n\nfunction getFileName(originalName) {\n  const re = /(?:\\.([^.]+))?$/;\n  return \"IMG-\" + getFormattedTime() + \".\" + re.exec(originalName)[1];\n}\n\nfunction getFormattedTime() {\n  var today = new Date();\n  var y = today.getFullYear();\n  var m = today.getMonth() + 1;\n  var d = today.getDate();\n  var h = today.getHours();\n  var mi = today.getMinutes();\n  var s = today.getSeconds();\n  return y + \"-\" + m + \"-\" + d + \"-\" + h + \"-\" + mi + \"-\" + s;\n}\n```\n\n## Mini Profile\n\n```javascript\n\nimport MiniPofile from '@armiasystems/react-native-armia-chat-sdk/src/components/miniProfile';\n\n//This component can be used inside a modal\n <MiniProfile\n  isGroup={isGroup}\n  username={username}\n  imageSrc={imageSrc}\n  bio={bio}\n  isBlocked={isBlocked}\n  isMuted={isMuted}\n  ownKey={ownKey}\n  receiverKey={receiverKey}\n  chatInfo={chatInfo}\n  hide={\n    //set state to hide the profile (hide the modal)\n  }\n  navigation={navigation}\n  goToProfile={() => {\n             //Navigate to profile\n  }}\n  returnScreen={isGroup&&'Home'} //if the type is a 'group' it should have a return screen route name given\n  />\n\n```\n\n## Profile view\n\n```javascript\n\ngetCurrentUser = async () => {\n  let key;\n  let keyFromAsync = await loadKey();\n  let emailFromAsync = await loadEmail();\n\n  this.setState({\n    key: keyFromAsync\n  });\n\n  if (keyFromAsync) {\n    key = keyFromAsync;\n  } else {\n    const snapshot = await database()\n      .ref(\"Email\")\n      .once(\"value\");\n    if (snapshot.val() !== null) {\n      key = snapshot.val()[emailFromAsync];\n      if (key === undefined) {\n        return;\n      }\n    }\n  }\n\n  const userSnapshot = await database()\n    .ref(\"Users\")\n    .child(key)\n    .once(\"value\");\n\n  const _user = userSnapshot.val();\n  if (_user) {\n    this.setState({\n      userDetails: _user,\n      profileImage: _user.avatarSource !== undefined ? _user.avatarSource : \"\",\n      name: _user.name\n    });\n  }\n};\n\nimport ProfileHeader from '@armiasystems/react-native-armia-chat-sdk/src/components/profileComponents/ProfileInfo';\n\n <ProfileInfo\n  myProfile\n  username={''}\n  bio=\"\"\n  profilePicture={''}\n  onPressNameEdit={() => {}}\n  onPressImageEdit={() => {}}\n  />\n\n```\n## Open Room Chat creation\n\n```javascript\n\n//Add both the import to Stack navigator as a screen \n\nimport RoomList from '@armiasystems/react-native-armia-chat-sdk/src/screens/roomList';\nimport RoomChat from '@armiasystems/react-native-armia-chat-sdk/src/screens/roomChat';\n\n//Below onPress in touchableOpacity will navigate to the screen call RoomList\n\n<TouchableOpacity\n  onPress={() =>{\n //You can create any number of rooms with different name \n\n    this.props.navigation.navigate('RoomList', {\n      hideOption: false,\n      rooms:[\n         { id: 'room_1', name: 'Startups' },\n         { id: 'room_2', name: 'Sports' },\n         { id: 'room_3', name: 'Health and Wellness' },\n         { id: 'room_4', name: 'Stock Market' },\n         { id: 'room_5', name: 'Travel & Tourism' },\n      ],\n      imageViewScreen:'', //(Image full view on press in chat)Provide the name of screen where image full view is implemented \n      videoViewScreen:'', //(Video Player screen) Provide the name of the screen where video player is implemented\n      });\n  }}>\n  <Text>Room List</Text>\n</TouchableOpacity>\n\n```\n## Delete account \n\n```javascript\nimport auth from \"@react-native-firebase/auth\";\nimport database from \"@react-native-firebase/database\";\nimport {removeAllKeys} from\"@armiasystems/react-native-armia-chat-sdk/src/utils/asyncStorage\";\n\nasync function deleteAccount() {\n  try {\n    let keyFromAsync = await loadKey();\n    \n    await database()\n      .ref(\"Users\")\n      .child(keyFromAsync)\n      .update({ online: false });\n    await database()\n      .ref(\"Users\")\n      .child(keyFromAsync)\n      .update({ lastSeen: Date.now() });\n    await database()\n      .ref('Users')\n      .child(key)\n      .update({ deletedAccount: true });\n    await auth().currentUser.delete();\n    onSignOut().then(async () => {\n      removeAllKeys();\n      await auth().signOut();\n      dispatch({ type: \"SIGN_OUT\" });\n    });\n    //clear values in onSignOut function and switch the stack\n  } catch (e) {\n    console.error(e);\n  }\n}\n\n```\n\n## Push Notification\n\nFor Push notification implementation, you can follow [ Firebase Cloud Messaging](https://rnfirebase.io/messaging/usage) and [react-native-push-notification](https://www.npmjs.com/package/react-native-push-notification)\n\n\n\n### Check out the sample app https://gitlab.armiasystems.com/mobilelearningprojects/chatwithme.git\n","readmeFilename":"README.md"}