Compare commits

...

761 Commits
v1 ... v2

Author SHA1 Message Date
0117e5735e bump version 2021-10-25 12:46:03 +02:00
7a3626df1c fixing unsplash cors issue 2021-10-25 12:45:13 +02:00
ba11af887c bump to v2.7.9 2021-10-24 13:36:40 +02:00
41a9ce2b06 Merge pull request #577 from AmruthPillai/l10n_develop
New Crowdin updates
2021-10-24 13:36:16 +02:00
becb4993b2 New translations en.json (Danish) 2021-10-24 13:35:37 +02:00
bcc3ab44eb New translations en.json (German) 2021-10-24 13:35:33 +02:00
5d2961945c Merge pull request #570 from HristovCodes/develop
Translated to Bulgarian
2021-10-24 13:08:57 +02:00
bb1e68fcc5 Translated to Bulgarian 2021-10-03 15:48:05 +03:00
4d9c41f52b Merge pull request #543 from kescherCode/develop
German locale corrections and improvements
2021-09-30 09:43:11 +02:00
13abbd21e2 Merge pull request #547 from preetamm/develop
1] sidebar toggle feature 2] ask for confirmation before delete operation
2021-09-30 09:42:39 +02:00
a9f4fb863f Merge pull request #551 from hpierre74/gfm
feat(markdown): add gfm support
2021-09-30 09:42:03 +02:00
97f2b0c6f8 Merge pull request #561 from AmruthPillai/l10n_develop
New Crowdin updates
2021-09-30 09:41:26 +02:00
7cf57a999d New translations en.json (Indonesian) 2021-09-02 23:55:53 +05:30
1e927838d0 Update src/pages/app/dashboard.js 2021-08-10 13:09:12 +02:00
cfad352903 feat(markdown): add gfm support
revert firebase changes
2021-08-10 12:50:04 +02:00
2cbdf77c51 added sidebar toggle feature and confirmation prompt before deleting any list-item 2021-08-08 18:36:07 +05:30
3b127a81fd German locale corrections and improvements 2021-07-28 15:10:20 +02:00
99d7d3aad2 v2.7.8: update dependencies 2021-07-13 10:57:20 +05:30
1640ffb177 Merge pull request #530 from AmruthPillai/l10n_develop
New Crowdin updates
2021-07-13 10:42:38 +05:30
9f31a890ef New translations en.json (Italian) 2021-07-13 10:42:09 +05:30
8b79a88809 New translations en.json (Portuguese, Brazilian) 2021-07-13 10:42:08 +05:30
3801b54ced Merge pull request #528 from lpmi-13/set_present_as_end_date
update Project data model to use "Present" if no end date selected
2021-07-13 10:40:26 +05:30
d6d8f240bd Merge branch 'develop' into set_present_as_end_date 2021-07-13 10:40:20 +05:30
ec7b33c008 Merge pull request #527 from lpmi-13/add_info_to_readme
add information on setting up firebase to the readme
2021-07-13 10:39:36 +05:30
d11784161a Merge pull request #526 from lpmi-13/fix_date_placholder
fix typo in placeholder dates
2021-07-13 10:39:26 +05:30
b869291589 set more recent date as placeholder 2021-07-12 23:20:28 +01:00
be4334f6a2 update Project data model to use "Present" if no end date selected
Sometimes, projects are ongoing, and it would be helpful to be able to show that, similar to how it's done in the Work section.

This is what's expected in the `formatDateRange` function, and it's more consistent with the way things are done in other parts of the application.
2021-07-06 13:36:47 +01:00
ed950ddcdc add information on setting up firebase to the readme
I had to think a bit about what values to put in the .env file, and once I figured it out, I thought it would be helpful to add that information explicitly in the readme so other developers could speed up local development.
2021-07-06 13:34:08 +01:00
5771f28018 fix typo in placeholder dates 2021-07-06 13:01:19 +01:00
5fbf48cc3b Merge pull request #523 from faturachmanyusup/develop
Change button text "Add New" in List.js from STATIC to DYNAMIC using …
2021-06-28 20:39:08 +05:30
36a9b1302b Change button text "Add New" in List.js from STATIC to DYNAMIC using translation shared.buttons.add and improve Indonesian translation 2021-06-28 15:22:43 +07:00
6754cb1e45 bump verison to v2.7.7, translations added 2021-06-26 21:21:28 +05:30
4f40e8421f Merge pull request #522 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-26 21:19:45 +05:30
d6470620eb Update run-tests.yml 2021-06-26 21:19:14 +05:30
795f14713d New translations en.json (Hebrew) 2021-06-26 21:17:54 +05:30
6b7b71dc7b New translations en.json (Romanian) 2021-06-26 21:17:53 +05:30
75f76b267f New translations en.json (French) 2021-06-26 21:17:52 +05:30
cdf8a133e3 New translations en.json (Spanish) 2021-06-26 21:17:51 +05:30
91ffcba7da New translations en.json (German) 2021-06-26 21:17:49 +05:30
04e3cd4b8d New translations en.json (Italian) 2021-06-26 21:17:48 +05:30
a256bb8ce7 New translations en.json (Norwegian) 2021-06-26 21:17:45 +05:30
d33dc23ad1 New translations en.json (Polish) 2021-06-26 21:17:45 +05:30
4dde9fbcc1 New translations en.json (Russian) 2021-06-26 21:17:44 +05:30
b9c5aac485 New translations en.json (Swedish) 2021-06-26 21:17:43 +05:30
19906ea18b New translations en.json (Turkish) 2021-06-26 21:17:42 +05:30
eebb6890ab New translations en.json (Ukrainian) 2021-06-26 21:17:41 +05:30
6ecf8dd404 New translations en.json (Portuguese, Brazilian) 2021-06-26 21:17:40 +05:30
affbc26e22 New translations en.json (Persian) 2021-06-26 21:17:39 +05:30
cfff2bf562 New translations en.json (Hindi) 2021-06-26 21:17:38 +05:30
9db04bfaba New translations en.json (Greek) 2021-06-26 21:17:37 +05:30
21b4e02dee New translations en.json (Kannada) 2021-06-26 21:10:05 +05:30
8804a3a18d New translations en.json (Arabic) 2021-06-26 21:10:03 +05:30
ff2131141c New translations en.json (Czech) 2021-06-26 21:10:02 +05:30
62b3144ef9 New translations en.json (Japanese) 2021-06-26 21:10:01 +05:30
75dd08188e New translations en.json (Chinese Simplified) 2021-06-26 21:09:59 +05:30
ef59464bcd New translations en.json (Japanese) 2021-06-26 16:23:39 +05:30
08325b3bdd - fix: Indonesian language display
- update dependencies
2021-06-24 12:52:19 +05:30
56e0852d23 Create SECURITY.md 2021-06-24 12:47:01 +05:30
c4ddba2933 Merge pull request #519 from mberlinger3/pikachu_address
Pikachu address
2021-06-24 12:44:45 +05:30
2eaeb11c93 Merge pull request #518 from mberlinger3/bugfix
Removed duplicate locale
2021-06-24 12:44:20 +05:30
60b84b8e14 Added address to pikachu template with icon 2021-06-23 22:31:13 -07:00
97d5bf73c4 Removed duplicate locale 2021-06-23 22:27:20 -07:00
db9dc36e6d Merge pull request #517 from faturachmanyusup/develop
Fix Error when select Bahasa Indonesia
2021-06-23 17:23:13 +05:30
9dab038a9a Update README.md
- change bahasa Indonesi to Bahasa Indonesia
2021-06-22 21:42:38 +07:00
08b5ac588c Merge branch 'develop' of https://github.com/faturachmanyusup/Reactive-Resume into develop 2021-06-22 21:41:26 +07:00
cddb238994 FIX error when select Indonesian Language
- import 'id.json' in src/i18n/locales/index.js
- import 'dayjs/locale/id' in src/utils/dayjs.js
2021-06-22 21:32:29 +07:00
b2583724fd fix lint 2021-06-22 16:56:53 +05:30
c908f450f9 update dependencies 2021-06-22 16:56:29 +05:30
c6986b5048 v2.7.5 - add Indonesian language 2021-06-22 16:53:37 +05:30
6f12251aef Merge pull request #516 from faturachmanyusup/develop
add new translation 'Indonesian (Bahasa Indonesia)' with code 'id'
2021-06-22 16:49:02 +05:30
6539430980 add new translation 'Indonesian (Bahasa Indonesia)' with code 'id' 2021-06-19 17:55:13 +07:00
a13842d014 Merge pull request #513 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-19 10:57:00 +05:30
8d72ec2460 New translations en.json (Dutch) 2021-06-18 13:23:03 +05:30
47f1beec48 Merge pull request #512 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-17 15:16:57 +05:30
b3ca6be1c4 New translations en.json (Dutch) 2021-06-17 14:36:14 +05:30
36c54a0af2 New translations en.json (Danish) 2021-06-17 12:59:37 +05:30
da4c74917d New translations en.json (Finnish) 2021-06-17 12:59:36 +05:30
c4495d2912 New translations en.json (Dutch) 2021-06-17 11:46:23 +05:30
f9183384e9 Merge pull request #503 from AmruthPillai/imgbot
[ImgBot] Optimize images
2021-06-17 09:24:15 +05:30
7a4f50cb92 Merge pull request #504 from m4rcs/translate-contact
Add translation for "Contact" in Gengar theme.
2021-06-17 09:23:46 +05:30
9084a2803e v2.7.4 - Added Hebrew (עִברִית) Language 2021-06-17 09:22:59 +05:30
45042050ee Merge pull request #510 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-17 09:20:16 +05:30
d4f9926e94 New translations en.json (Hebrew) 2021-06-13 17:31:53 +05:30
79c903f02d - v2.7.3: update dependencies 2021-06-09 11:30:59 +05:30
d23040a374 Add translation for "Contact" in Gengar theme.
Reworked german translation.
2021-06-03 11:50:23 +02:00
882fde899b [ImgBot] Optimize images
/static/images/picture.jpg -- 188.32kb -> 170.83kb (9.29%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2021-06-03 03:33:42 +00:00
fc96a6fc92 - change demoState picture URL 2021-06-03 09:01:01 +05:30
847c2c0f9b - update to v2.7.2
- update dependencies
2021-06-03 08:52:19 +05:30
2a1a6498e2 - update to 2.7.1
- add webpack cache
2021-06-03 08:45:50 +05:30
7a721f40b6 - update to 2.7.1 2021-06-03 08:42:26 +05:30
23690d7bc1 Merge pull request #501 from m4rcs/patch-1
Improvement of German Translation
2021-06-03 08:41:15 +05:30
4fb6763328 Merge pull request #496 from NatProView/patch-2
Improvement of polish translations
2021-06-03 08:41:04 +05:30
85939e59c6 Merge pull request #495 from NatProView/patch-1
Correcting typos in pl.json
2021-06-03 08:40:45 +05:30
bb7a41cd62 Merge pull request #494 from theoctober19th/develop
Add appropriate icon for YouTube channel in profile information.
2021-06-03 08:39:55 +05:30
d0c18afed1 Merge branch 'develop' into develop 2021-06-03 08:39:45 +05:30
6bd545df55 Merge pull request #498 from gianantoniopini/develop
Addition of unit tests related to Delete Account
2021-06-03 08:37:25 +05:30
d71d378aa1 Fixed Jest warnings occurring after latest merge from upstream 2021-06-02 15:02:36 +02:00
99f87ebb3e Fixed Jest errors occurring after latest merge from upstream 2021-06-01 12:14:12 +02:00
fbe2c1f91c Merge remote-tracking branch 'upstream/develop' into develop 2021-06-01 09:28:35 +02:00
4af318dc61 - update to 2.7.0 2021-05-29 12:02:57 +05:30
2c22c13f3e - update dependencies
- upgrade gatsby v2 to v3
- update functions
2021-05-29 11:47:34 +05:30
6daf6e8b11 Update de.json
Changed translation of present to a more CV suitable
2021-05-28 10:43:29 +02:00
fb18b5c94c FirebaseStub: added more unit tests related to functions 2021-05-25 12:48:38 +02:00
a4d474b8ec FirebaseStub: added more unit tests related to auth 2021-05-25 12:16:49 +02:00
23ebb25a89 Improvement of polish translations 2021-05-21 14:56:47 +02:00
ab95160b04 Correcting typos in pl.json
Corrected a few minor mistakes such as too many whitespaces or typos, e.g.
**Projects** - Ptojekty (should be Projekty)
**Education** - Wyksztłacenie (should be Wykształcenie)
"CV" should be written in capital letters, it was inconsistent
2021-05-21 14:29:43 +02:00
9e63d0b2c7 Delete Account unit tests: added tests related to Google reauthentication 2021-05-20 15:57:01 +02:00
e1186591f9 Add appropriate icon for YouTube channel in profile information. 2021-05-19 17:53:09 +05:45
7cb469657d Firebase.auth Jest mock: minor fix in signOut() method 2021-05-18 13:57:34 +02:00
53d0e17865 Delete Account unit tests: fixed warnings, added test for error notifications 2021-05-18 13:41:38 +02:00
a8cf553217 Delete Account: added more unit tests 2021-05-14 18:21:47 +02:00
d11d414504 Jest mocks: added @reach/router and stub for Firebase auth signOut method 2021-05-13 16:53:04 +02:00
ffb8ae45e0 Delete Account unit tests: first attempt to spy on Firebase auth User delete 2021-05-11 17:25:30 +02:00
e794325787 FirebaseStub: added auth User class 2021-05-11 16:42:36 +02:00
eb54a7f69d Delete Account: started adding unit tests 2021-05-11 15:19:05 +02:00
b0bd8c94f3 Merge pull request #489 from gianantoniopini/develop
"Download PDF" action: basic retry mechanism - "Delete Account" action: deletion of uploaded photographs
2021-05-10 14:13:39 +05:30
9f38ebd044 "deleteUser" Firebase cloud function: added deletion of user folder from Storage, added extra checks on IDs not being empty string 2021-05-06 12:37:10 +02:00
14ea8de709 Modified 'printResume' Firebase cloud function: implemented basic retry mechanism with waitUntil 'networkidle0' and 'networkidle2', enhanced error handling to return more detailed information 2021-05-04 11:35:40 +02:00
1ac828b532 Update package-lock.json in functions 2021-05-03 11:11:53 +05:30
13508d3c16 Fix fontSize in initialState.json 2021-05-03 11:02:30 +05:30
8c849e4018 Update demoState.json to fix font size 2021-05-03 10:24:00 +05:30
4b007749cb Merge branch 'master' into develop 2021-05-03 10:01:42 +05:30
8aaee4cd9e Added .nvmrc with 14 2021-05-03 09:46:01 +05:30
aa8d9228b9 Merge pull request #485 from gianantoniopini/develop
Delete Account: fix for Firebase cloud function and error handling improvements
2021-05-01 21:44:29 +05:30
34627e2acb Settings, deleteAccount: prevent execution of deleteAccount if it is already in progress 2021-04-28 09:56:13 +02:00
b5d4d54ad3 UserContext, deleteAccount: if provider is google, use reauthenticateWithPopup to reauthenticate user 2021-04-26 15:26:02 +02:00
f53e34c37d UserContext, deleteAccount: if provider is google, always reauthenticate the user before performing any delete 2021-04-23 17:30:25 +02:00
54ddfe30d7 Updated "deleteUser" Firebase cloud function to perform updates in an atomic way, tweaked UI call and error handling 2021-04-23 15:16:37 +02:00
d4e7914a27 Updated "deleteUser" Firebase cloud function implementation, UI call and error handling 2021-04-22 18:38:02 +02:00
43c8729c5b bump version 2021-04-14 14:41:17 +05:30
8bfed6a342 update package-lock.json 2021-04-14 14:29:07 +05:30
71471020b6 Merge pull request #481 from ntotao/patch-1
Update it.json
2021-04-14 14:22:49 +05:30
1e02f5b27a Update it.json
Edited some showed-in-the-resume words, such as "present" which was translated to regalo (it's literally like a birthday present). "Attuale" is the right translation.
Also edited some wording around to enhance the experience in an Italian fluent translation.
2021-04-13 13:26:07 +02:00
abd18236ed Merge pull request #477 from ceoshikhar/develop
Fixed bug where multiple resumes are created if "Create Resume" button is spammed
2021-04-03 17:18:54 +05:30
6ffcf2a1c4 fix: multiple resumes are created if "Create Resume" button is spammed 2021-04-03 14:49:37 +05:30
8628ca5475 Merge pull request #474 from indranil32/bengali-locale
Adding Bengali translation for this amazing app
2021-03-31 12:50:28 +05:30
cf95dd6a28 Merge pull request #475 from p-8-z/local_sk
Added sk.json to i18n locales. Slovak translation
2021-03-31 12:35:02 +05:30
p8z
b392bada3b added sk.json to i18n locales 2021-03-30 20:52:00 +02:00
978207a700 Adding Bengali translation for this amazing app 2021-03-30 22:20:38 +05:30
a7fa5f5fe9 - npm audit fix 2021-03-20 12:15:01 +05:30
f73d9ad7d0 Fixed type in StorageContext.js
Thank you kind stranger.
2021-03-16 08:44:02 +05:30
ee93c47403 Create DEPLOYMENT.md 2021-03-13 11:37:17 +05:30
a0dd63edb2 Merge pull request #468 from AmruthPillai/l10n_develop
New Crowdin updates
2021-03-11 21:10:13 +05:30
0f1778a11c New translations en.json (Dutch) 2021-03-11 21:09:08 +05:30
bf03e40895 update dependencies for functions 2021-03-07 10:00:40 +05:30
9ed97c8b6c [2.6.6] Added Romanian Language 2021-03-07 09:41:39 +05:30
b06e9b3ef0 Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2021-03-07 09:38:33 +05:30
b81c167a10 Merge pull request #464 from AmruthPillai/l10n_develop
New Crowdin updates
2021-03-07 09:38:16 +05:30
33ac260683 [2.6.5] Addition of Show/Hide Selectors for all blocks
- Updating dependencies
2021-03-07 09:38:02 +05:30
e28bd17d3b New translations en.json (Persian) 2021-03-07 09:37:03 +05:30
9134375ad8 New translations en.json (Italian) 2021-03-07 09:37:02 +05:30
e6c8a73e72 New translations en.json (Japanese) 2021-03-07 09:37:01 +05:30
1e87b1a7f4 New translations en.json (Norwegian) 2021-03-07 09:36:59 +05:30
70be890e37 New translations en.json (Polish) 2021-03-07 09:36:58 +05:30
d6db251a8f New translations en.json (Russian) 2021-03-07 09:36:57 +05:30
fa5fa3e891 New translations en.json (Ukrainian) 2021-03-07 09:36:56 +05:30
a92a56449c New translations en.json (Chinese Simplified) 2021-03-07 09:36:55 +05:30
7b422bfccd New translations en.json (Portuguese, Brazilian) 2021-03-07 09:36:54 +05:30
d1feab6701 New translations en.json (Hindi) 2021-03-07 09:36:53 +05:30
b2a511736e New translations en.json (Kannada) 2021-03-07 09:36:52 +05:30
e405b3b641 New translations en.json (French) 2021-03-07 09:36:51 +05:30
4609fb583e New translations en.json (German) 2021-03-07 09:36:46 +05:30
a12a8a2f83 New translations en.json (Finnish) 2021-03-07 09:36:45 +05:30
34d07bc863 New translations en.json (Dutch) 2021-03-07 09:36:43 +05:30
e4c9833c8d New translations en.json (Swedish) 2021-03-07 09:36:42 +05:30
5070a11854 New translations en.json (Romanian) 2021-03-07 09:36:41 +05:30
1365972676 Merge pull request #462 from anu1097/feature/toggle-switch-left-panel
feat: adding a toggle switch for left panel items
2021-03-07 08:51:16 +05:30
b0e0a53794 Merge pull request #460 from lordkyuusei/develop
Updating FR.json translations
2021-02-27 20:04:14 +05:30
cf47447102 feat: adding a toggle switch for left panel items 2021-02-26 02:14:40 +05:30
7af837165d Mise à jour de certaines erreurs de traduction 2021-02-22 17:47:37 +01:00
d98e591fee [2.6.3] update dockerfile to add other required packages 2021-02-16 09:59:34 +05:30
a219b1d979 [2.6.3] updating dependencies 2021-02-16 09:17:11 +05:30
797e30022e Merge pull request #459 from mlow/develop
Dockerfile improvements
2021-02-15 00:28:57 +05:30
d6ae8309b4 Dockerfile improvements
- Add missing build dependencies for `sharp` node module (dependency of
  `gatsby-plugin-sharp`).
- Add ARG instructions for firebase variables, allowing them to be set
  via --build-arg flags when building the image.
- Use `npm ci` instead of `npm install`, and execute it after copying
  only package*.json. This prevents having to fetch all dependencies if
  package*.json hasn't changed between builds.
- Use `node:alpine` instead of `node` - not an improvement per-se,
  but I happen to be more familiar with adding build dependecies in the
  alpine based node image.
2021-02-14 00:41:29 -07:00
f1a911560d [2.6.2] add eslint-webpack-plugin 2021-02-12 11:27:56 +05:30
5e5ee5fffa [2.6.2] update dependencies, bump up version 2021-02-12 11:23:28 +05:30
0639cef426 Merge pull request #448 from agirdzius/lithuanian-locale
Added Lithuanian translations.
2021-02-12 11:18:23 +05:30
d1a392c2f0 Merge pull request #449 from AmruthPillai/l10n_develop
New Crowdin updates
2021-02-12 11:18:15 +05:30
b781731e5c Merge pull request #453 from agirdzius/missing-dayjs-locales
Added missing Hindi, Swedish and Russian dayjs locales.
2021-02-12 11:18:04 +05:30
90b968f152 Merge pull request #456 from ConorSheehan1/develop
fix link to product hunt
2021-02-12 11:17:56 +05:30
b6d5f0ce12 Merge pull request #450 from gianantoniopini/develop
Add support for drag & drop to the List component
2021-02-12 11:17:43 +05:30
eb01954b9b fix link to product hunt 2021-02-10 22:34:55 +00:00
39278b7803 Added missing Hindi, Swedish and Russian dayjs locales. 2021-02-10 12:51:26 +00:00
bd1bd2fc97 List component, drag handler: added check for source and destination id being the same 2021-02-09 12:31:54 +01:00
8ce73a38ea Builder unit tests helper: comments correction 2021-02-09 11:52:48 +01:00
2fa4ff8d9d Builder page: added unit test for drag & drop of skill 2021-02-09 09:36:36 +01:00
db460c9b55 New translations en.json (Arabic) 2021-02-09 12:27:17 +05:30
23bf495a5a List component: added support for drag & drop 2021-02-09 05:59:32 +01:00
3ff4b5c90f Version bump to 2.6.1 2021-02-08 15:12:29 +00:00
341f36870b Added Lithuanian translations. 2021-02-08 11:41:47 +00:00
89936b651a [2.6.0] update dependencies + verify firebase engine 2021-02-07 12:34:15 +05:30
04f8fe2db7 [2.6.0] update dependencies 2021-02-07 12:21:21 +05:30
91329969be Merge pull request #437 from AmruthPillai/l10n_develop
New Crowdin updates
2021-02-06 09:50:28 +05:30
142f8e0b31 Merge pull request #443 from gianantoniopini/develop
Addition of some unit tests to the Dashboard page
2021-02-06 09:50:14 +05:30
811e158fbc Merge remote-tracking branch 'upstream/develop' into develop 2021-02-02 14:20:47 +01:00
f2bc5e36b3 Dashboard: removed unit tests related to rename resume 2021-02-02 14:03:35 +01:00
a2b637fa71 Dashboard: unit tests related to rename resume 2021-02-02 14:02:56 +01:00
fd79891a1a Dashboard: unit tests related to rename resume 2021-02-02 14:01:17 +01:00
23386839a6 Firebase Stub: unit tests separated in different files 2021-02-02 12:39:16 +01:00
a589b3530a Merge pull request #442 from AmruthPillai/issue-441
Fix #441: Make Skill Level Optional
2021-02-02 15:56:02 +05:30
26022ae73e Update SkillModal.js 2021-02-02 15:46:48 +05:30
4634b4f0a0 Castform: unit tests refactoring to reduce nesting 2021-02-02 10:40:26 +01:00
f72d2639e5 Builder page: unit tests separated in different files 2021-02-02 10:27:30 +01:00
e39026c8b4 Dashboard page: unit tests separated in different files 2021-02-01 18:00:52 +01:00
5ee077dac5 Dashboard page: added unit tests related to duplicate resume interaction 2021-02-01 12:10:15 +01:00
c748e6a0b4 Dashboard page: removed unit tests related to rename resume interaction (they are generating warnings) 2021-02-01 10:49:02 +01:00
97f065f51c Merge remote-tracking branch 'upstream/develop' into develop 2021-02-01 07:23:19 +01:00
5b0124bedc New translations en.json (Spanish) 2021-02-01 07:24:24 +05:30
51673a9e6d - bump up version to 2.5.5 2021-01-31 11:03:45 +05:30
9ddba69ff0 - Added Greek Language 2021-01-31 10:59:41 +05:30
2a2ceea448 Merge pull request #434 from AmruthPillai/l10n_develop
New Crowdin updates
2021-01-31 10:57:29 +05:30
bff0bec759 New translations en.json (German) 2021-01-31 00:31:13 +05:30
7bdddb8dc7 New translations en.json (Greek) 2021-01-30 15:40:51 +05:30
da8bf8bc36 Dashboard page: added more unit tests for rename resume interaction 2021-01-27 11:33:11 +01:00
5d9527e46e Dashboard page: unit tests refactoring 2021-01-27 10:35:58 +01:00
a20fe10c06 Dashboard page: added unit test for delete resume interaction 2021-01-26 17:38:05 +01:00
8018d7f527 Dashboard page: refactored setup of fetch mock, added more assertions to unit test 2021-01-26 14:22:27 +01:00
e27bedcf88 Dashboard page: unit tests refactoring 2021-01-26 13:19:49 +01:00
b196ca1bf5 Dashboard page: added unit test related to create resume interaction 2021-01-25 17:54:36 +01:00
87fee23480 Dashboard page: added unit test related to create resume interaction 2021-01-25 17:30:05 +01:00
9d486c11cc Dashboard page: added unit test related to create resume interaction 2021-01-25 16:44:08 +01:00
ef3f2a802f Dashboard page: added first unit test for create resume interaction 2021-01-25 15:15:02 +01:00
8b39dcc239 Merge pull request #431 from AmruthPillai/l10n_develop
New Crowdin updates
2021-01-25 12:35:26 +05:30
b73e3b7c4d New translations en.json (Turkish) 2021-01-24 23:14:18 +05:30
4820a8bea3 add deploy script to package.json 2021-01-23 20:07:14 +05:30
22a171c25c [2.5.4] Add Tests, Add GitHub Action, Update Dependencies 2021-01-23 19:44:20 +05:30
30109ecb1d set up for first use on IntelliJ WebStorm 2021-01-23 19:41:11 +05:30
b76fa1dcc5 add GitHub Action to run unit tests on every PR/push 2021-01-23 19:28:01 +05:30
6c31d3dff3 Merge pull request #429 from gianantoniopini/develop
Addition of some unit tests to Builder and Dashboard pages
2021-01-23 19:19:06 +05:30
c01be98cfc Builder: added unit test for resume in initial state 2021-01-23 14:05:37 +01:00
74335a1771 Builder and Dashboard unit tests: fine tuning of assertions related to toast/notification 2021-01-23 12:21:02 +01:00
5317f5e525 Builder and Dashboard unit tests refactoring/cleanup 2021-01-23 11:45:06 +01:00
9a7bdb188b Builder: updated unit test handling non-existent resume 2021-01-22 17:25:04 +01:00
dc18e84bc2 Dashboard: updated unit tests for Delete resume 2021-01-22 16:42:21 +01:00
cb2aeec70a Dashboard: added unit tests for Delete resume 2021-01-22 10:43:06 +01:00
16ed433705 Exported LoadingScreen testId and language Storage item key in order to be used in unit tests 2021-01-22 06:36:11 +01:00
0bab0d01d1 Removed testId from LoadingScreen 2021-01-22 06:05:00 +01:00
306db64ff1 Firebase Stub: minor tweak in reference .on function 2021-01-21 16:56:05 +01:00
af966bdf7b Firebase Stub: introduced a delay in all async functions to better mimic real Firebase 2021-01-21 16:45:33 +01:00
562a07619c Merge remote-tracking branch 'upstream/develop' into develop 2021-01-20 15:53:29 +01:00
4c63f68215 Builder tests: added test for loading screen 2021-01-20 15:52:35 +01:00
1215071ab9 Dashboard tests: added test for loading screen 2021-01-20 14:27:27 +01:00
3d39576a90 Builder test: changed some queries to use *ByRole 2021-01-20 13:40:58 +01:00
155cd499fb Builder test: added test for handling non-existent resume, added resetting of language Storage item 2021-01-20 12:57:31 +01:00
aca1d13116 Merge pull request #423 from gianantoniopini/develop
Unit testing environment set up and addition of some unit tests
2021-01-20 16:19:16 +05:30
fbc5f0de72 Merge pull request #426 from 4O4/i18n-pl-improvements
Improvement of polish translations
2021-01-20 16:19:03 +05:30
536bdb7bae Merge pull request #427 from 4O4/latin-ext-webfonts
Add latin-ext subset to fix special characters missing in webfonts
2021-01-20 16:18:49 +05:30
d507b9d54d Add latin-ext subset to fix special characters missing in webfonts 2021-01-19 15:12:38 +01:00
efe1762b33 Improvement of polish translations 2021-01-19 13:52:01 +01:00
5ba978dae5 Firebase Stub: refactoring 2021-01-15 10:25:44 +01:00
aac1e12cfc Firebase Stub: leading slash in reference path is ignored 2021-01-15 09:19:35 +01:00
978aafae75 Firebase Stub: added more unit tests 2021-01-15 08:31:35 +01:00
72176e2500 Firebase Stub: .off function implementation 2021-01-14 17:49:52 +01:00
6ac0f37ada Firebase Stub: added support for data remove 2021-01-14 17:16:01 +01:00
46781bba60 Firebase Stub: simple implementation of data changes listener 2021-01-14 14:48:07 +01:00
6d36c27889 Firebase Stub: simple implementation of data changes listener 2021-01-14 14:00:07 +01:00
36036cc411 Firebase Stub: query parameters not kept between ref calls 2021-01-14 09:38:46 +01:00
b6a0527fbe Firebase Stub refactoring: private class field naming convention 2021-01-11 17:18:37 +01:00
253f778a63 Dashboard test working 2021-01-11 16:58:24 +01:00
6c1fc543ad Firebase Stub: debounce callback called by "on" function 2021-01-11 16:18:38 +01:00
dce5d2c591 Firebase Stub: resolving ESLint errors 2021-01-08 14:15:46 +01:00
cb45629032 Firebase Stub: resolving ESLint errors 2021-01-08 13:29:21 +01:00
9c5b8398a3 Firebase Stub: resolving ESLint errors 2021-01-08 12:11:02 +01:00
e78d3dbaa4 Updates after latest merge from upstream branch 2021-01-08 10:15:38 +01:00
70cd92f29e Merge remote-tracking branch 'upstream/develop' into develop 2021-01-08 09:38:13 +01:00
4a0995eeb6 [2.5.3] Added "Czech" Language 2021-01-08 08:46:19 +05:30
ba31e18ffd Merge pull request #418 from AmruthPillai/l10n_develop
New Crowdin updates
2021-01-08 08:21:11 +05:30
3c6e45abf4 Firebase Stub refactoring 2021-01-07 18:04:59 +01:00
c2ac9594ef Firebase Stub refactoring 2021-01-07 17:28:43 +01:00
69f0338b19 Firebase Stub refactoring 2021-01-07 17:17:53 +01:00
da8849c854 Firebase Stub refactoring, added eslint-plugin-jest dev dependency 2021-01-07 16:43:24 +01:00
294dbf195f FirebaseStub refactoring 2021-01-07 13:23:22 +01:00
98aef7eb77 [2.5.2] Fix fontSize not reflecting in exported PDF 2021-01-07 09:35:31 +05:30
176ba0de7a Firebase stub: added support for filtering of resumes by user 2021-01-06 17:03:46 +01:00
c667c31737 Firebase stub: added additional resume and user to test data, added more tests 2021-01-06 16:00:23 +01:00
7733d827e2 New translations en.json (Czech) 2021-01-06 19:48:32 +05:30
35c663ebe8 Dashboard test: draft version 2021-01-06 14:42:50 +01:00
854020481c Builder: 'allow to change the language' test 2021-01-06 10:10:15 +01:00
e99c73a5b1 Builder test: draft version of test changing the language 2021-01-04 16:17:51 +01:00
5197878b79 Jest configuration: updated settings for code coverage 2021-01-04 12:35:02 +01:00
57d234ae02 Jest configuration: added settings for code coverage 2021-01-04 12:09:04 +01:00
8202ca5461 FirebaseStub refactoring 2021-01-04 10:42:41 +01:00
2e346c93eb Updates after latest merge from upstream branch 2021-01-04 10:22:09 +01:00
5470fb8d6f Merge remote-tracking branch 'upstream/develop' into develop 2021-01-04 09:46:35 +01:00
4cd4af6ee1 New translations en.json (French) 2021-01-03 18:46:23 +05:30
c065c844ee New translations en.json (Danish) 2021-01-03 17:46:00 +05:30
4768135963 New translations en.json (Finnish) 2021-01-03 16:26:08 +05:30
a63496ca86 New translations en.json (Dutch) 2021-01-03 15:25:29 +05:30
c40d89e98e [2.5.1] update dependencies 2021-01-03 11:58:17 +05:30
eb4023e3b2 Merge branch 'rpolley-add-font-size-setting' into develop 2021-01-03 11:45:00 +05:30
e2218030cf Merge pull request #413 from rpolley/add-font-size-setting
Add ability to customize font size
2021-01-03 11:44:43 +05:30
fdd35492a0 [2.5] Implement Font Size Adjustments 2021-01-03 11:44:14 +05:30
297a258e4a Merge branch 'add-font-size-setting' of https://github.com/rpolley/Reactive-Resume into rpolley-add-font-size-setting 2021-01-03 11:29:31 +05:30
c0808af7f4 Merge pull request #415 from StijnSimons/develop
Fixed Dutch translation
2021-01-03 11:23:40 +05:30
5887babd15 Fixed Dutch translation 2020-12-27 23:02:07 +01:00
abd24e7eb7 Add ability to customize font size
Added an ability to customize font sizes. This is set at a new section in the settings.
The controler for this sets a number of css variables which are used in css rules that
override tailwind's text-<size> to use the font size and line spacing contained in the
variable. The control itself is a simple logarithmic slider that controls a "scale
factor" by which all the text sizes in a resume are scaled by.
2020-12-26 13:24:29 -06:00
988a903acc Merge pull request #412 from AmruthPillai/dependabot/npm_and_yarn/functions/date-and-time-0.14.2
Bump date-and-time from 0.14.1 to 0.14.2 in /functions
2020-12-25 09:12:58 +05:30
f76609c2fc Bump date-and-time from 0.14.1 to 0.14.2 in /functions
Bumps [date-and-time](https://github.com/knowledgecode/date-and-time) from 0.14.1 to 0.14.2.
- [Release notes](https://github.com/knowledgecode/date-and-time/releases)
- [Commits](https://github.com/knowledgecode/date-and-time/compare/v0.14.1...v0.14.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-24 21:56:54 +00:00
53333bb6fb Merge remote-tracking branch 'upstream/develop' into develop 2020-12-24 10:18:29 +01:00
d951a3f52d Castform tests refactoring 2020-12-24 10:08:17 +01:00
458aab4e8d FirebaseStub: refactoring 2020-12-24 09:53:55 +01:00
445d1e37d9 FirebaseStub: refactoring 2020-12-24 09:24:46 +01:00
85a489cefa [2.4.3] Add Docker Support, Make Address Optional 2020-12-24 11:08:59 +05:30
53b36a1aad FirebaseStub: cleanup 2020-12-23 16:23:13 +01:00
25d3661599 Minor change in FirebaseStub test file 2020-12-23 16:01:13 +01:00
2158c8b245 builder.test: cleanup 2020-12-23 15:49:56 +01:00
18e3e47ee4 Updated builder.test 2020-12-23 15:48:06 +01:00
c6a400a2f1 Updated builder.test to use DebounceWaitTime 2020-12-23 15:46:48 +01:00
30d94fd2a8 Updated builder.test to use new FirebaseStub 2020-12-23 14:46:10 +01:00
fb8dd6d986 Firebase stub: new implementation in place 2020-12-23 14:25:38 +01:00
356ae08643 Firebase stub: refactoring 2020-12-23 14:15:57 +01:00
f73359f83a Firebase mock: added auth to new implementation 2020-12-23 13:56:34 +01:00
45bf7146e5 Firebase mock: updated new implementation 2020-12-23 13:07:15 +01:00
5bec64d723 Firebase mock: started new implementation 2020-12-23 09:12:46 +01:00
a9c6ed4cdb Firebase mock: fix for property ServerValue.TIMESTAMP 2020-12-22 17:08:37 +01:00
b9014eb6cb Firebase mock: fixed issue with database namespace 2020-12-22 15:40:36 +01:00
9dc1f1b89b Builder.test: modified draft version of test for data update 2020-12-21 15:16:35 +01:00
7450b1c683 Updates after latest merge from upstream branch 2020-12-21 11:53:24 +01:00
9d713d7449 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-21 11:20:41 +01:00
c1cc9d0a69 rename workflow 2020-12-20 22:11:26 +05:30
45edbded87 Builder.test: modified draft version of test for data update 2020-12-20 17:36:24 +01:00
d6ca39817d fix build and deploy script 2020-12-20 21:51:25 +05:30
534736a3a4 fix build and deploy workflow script 2020-12-20 21:38:28 +05:30
8bac6c79a8 Merge branch 'develop' 2020-12-20 21:29:23 +05:30
7fb8d0d59d remove unnecessary alias 2020-12-20 21:28:46 +05:30
c9c62b1f3c Merge pull request #407 from AmruthPillai/develop
Adding GitHub Actions to make my life easier
2020-12-20 21:19:23 +05:30
53676ad997 version bump 2020-12-20 21:16:36 +05:30
fa1d8d50a0 Create build-and-deploy.yml 2020-12-20 21:14:23 +05:30
a13404aaf2 Merge pull request #406 from AmruthPillai/codeql-analysis
Create codeql-analysis.yml
2020-12-20 21:06:45 +05:30
a558a97cba Create codeql-analysis.yml 2020-12-20 21:02:56 +05:30
72b68e060c [2.4.1] Add Persian (Farsi) Language 2020-12-20 20:04:58 +05:30
7a0403f9d6 Merge pull request #403 from pmsoltani/pmsoltani-patch-1
Farsi (Persian) translation
2020-12-20 19:55:24 +05:30
916579c874 [v2.4] Fix JSON Resume Imports 2020-12-20 19:47:31 +05:30
b3be9e5f50 Builder.test: added draft version of test for data update 2020-12-17 17:40:54 +01:00
918100c949 Firebase mock: refactoring to mock functions with specific arguments 2020-12-17 12:32:42 +01:00
7c1076e08d Farsi (Persian) translation 2020-12-16 21:55:40 +03:30
a79de37ac9 Deleted obsolete Context mocks; added more Asserts to builder.test 2020-12-16 17:03:28 +01:00
a16f19a26f Gatsby mock: expanded useStaticQuery to support Templates, refactoring 2020-12-16 15:12:21 +01:00
0459a77e4d Firebase mock: set resume 'name' and 'user' properties 2020-12-16 11:13:49 +01:00
3a68c4b5af Firebase mock refactoring 2020-12-16 10:37:23 +01:00
d33f707cea Firebase mock: mock auth() signIn, in order to trigger onAuthStateChanged 2020-12-15 15:32:08 +01:00
942d8a0120 Updated Gatsby mock: fluid images returned by useStaticQuery 2020-12-14 15:05:03 +01:00
d51201d6f2 Firebase mock: added onAuthStateChanged observer 2020-12-14 13:26:11 +01:00
d3d51eabf5 Firebase mock: refactoring, fixed issue with call to __getResume 2020-12-14 12:03:36 +01:00
287336e166 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-14 09:00:56 +01:00
96ab340b1c set min-height for pages when printing 2020-12-13 10:37:02 +05:30
b105b08c8f Updated Firebase mock 2020-12-12 16:42:34 +01:00
d7123e511e Updated mock DatabaseContext to allow setting of resumes array 2020-12-12 14:06:00 +01:00
6e666b1435 Updated Firebase mock to allow use of demo resume 2020-12-12 13:17:57 +01:00
8ffe61a94a Updated package-lock.json after latest merge from upstream branch 2020-12-12 11:54:39 +01:00
c9ce3f6716 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-12 11:04:51 +01:00
a84cdf33cd added .env.example 2020-12-11 10:15:15 +05:30
d51363663b Stopped tracking .env files, but keep remote 2020-12-11 10:12:41 +05:30
b992bc4b73 Attempt to test Builder, using Firebase mock 2020-12-10 17:03:56 +01:00
e3d1f0305a Changes in DatabaseContext mock 2020-12-10 12:16:55 +01:00
9736b2c6d4 Attempt to test Builder, using DatabaseContext mock. 2020-12-10 11:13:03 +01:00
435400b1e3 Reinstated dependencies for Unit Testing, after latest merge from upstream branch 2020-12-09 11:05:34 +01:00
422066dd62 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-09 10:35:39 +01:00
5cd95b54f5 Create .env 2020-12-09 10:42:01 +05:30
df71b86028 - bumped version to 2.3.3
- fixed text alignment issues
- updated dependencies
- added ukranian language
2020-12-09 10:40:27 +05:30
88a3fe5148 Merge pull request #389 from AmruthPillai/l10n_develop
New Crowdin updates
2020-12-09 10:37:03 +05:30
d56ce24064 New translations en.json (Italian) 2020-12-09 10:36:41 +05:30
5f0bab8dd0 New translations en.json (Polish) 2020-12-09 10:36:37 +05:30
4be55a4133 New translations en.json (Arabic) 2020-12-09 10:27:41 +05:30
5b4f495fc9 Reinstated dependencies for Unit Testing, after latest merge from upstream branch 2020-12-07 16:02:50 +01:00
7af9b1469d Merge remote-tracking branch 'upstream/develop' into develop 2020-12-07 15:06:43 +01:00
c1c0f5a43d New translations en.json (Ukrainian) 2020-12-06 18:02:28 +05:30
bce80a9101 bump up version to 2.3 2020-12-05 16:19:52 +05:30
cd0c847606 updates to dependencies, merging to production 2020-12-05 15:22:45 +05:30
cc8729e889 Merge pull request #386 from AmruthPillai/l10n_develop
New Crowdin updates
2020-12-05 15:21:58 +05:30
faf67dd7a8 New translations en.json (French) 2020-12-05 15:21:43 +05:30
990336017e Merge pull request #384 from HristovCodes/develop
Added address info to Gengar template.
2020-12-05 11:13:15 +05:30
fe2e56bda0 Added newline at end of package.json 2020-12-02 16:56:53 +01:00
fcf578a6d9 Defined the 'prebuild' script in package.json to run the unit tests 2020-12-02 16:50:29 +01:00
4198136ce4 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-01 14:43:39 +01:00
354b517200 Set up Unit Testing environment with Gatsby, Jest and @testing-library/react; added some basic unit tests for Castform template 2020-12-01 14:40:53 +01:00
902a6eb0c5 Merge branch 'develop' of https://github.com/HristovCodes/Reactive-Resume into develop 2020-11-28 18:03:08 +02:00
285cc80592 Added adress info to Gengar template. 2020-11-28 18:00:20 +02:00
8b8541227d Merge pull request #382 from AmruthPillai/l10n_develop
New Crowdin updates
2020-11-27 01:34:11 +05:30
b8701f9fc6 New translations en.json (Danish) 2020-11-22 15:42:59 +05:30
a5550d5e64 New translations en.json (Finnish) 2020-11-22 14:02:37 +05:30
d9af8286b9 New translations en.json (Dutch) 2020-11-22 14:02:35 +05:30
71914d8edb New translations en.json (French) 2020-11-22 13:01:26 +05:30
ab1b52fb77 Merge pull request #375 from rpolley/add-end-date-field-to-projects
Add end date field to projects
2020-11-22 12:00:39 +05:30
97affd54fc Merge pull request #374 from gianantoniopini/develop
Add a Birthdate field to the profile information
2020-11-22 12:00:26 +05:30
aea3950d73 Merge pull request #380 from enzo-g/develop
Update fr.json
2020-11-22 11:59:49 +05:30
06f84cd9cf Merge branch 'develop' into develop 2020-11-22 11:59:38 +05:30
0f390ab493 Issue #314: Updated Celebi, Gengar, Glalie and Pikachu templates to include new birthDate field; deleted ContactE block as it is no longer used in the Celebi template. 2020-11-10 14:01:16 +01:00
e2b242d40d use date attribute for start date 2020-11-09 16:04:03 -06:00
81ad16ae8a update project to use date range 2020-11-09 15:59:24 -06:00
df4f4e2ccd Issue #314: Updated Onyx template to incorporate birthDate field through new component BirthDateB 2020-11-09 17:07:48 +01:00
21e499502f Issue #314: Created separate component BirthDateA, with language retrieved from data.metadata.language 2020-11-09 12:42:15 +01:00
b365826f0a Merge remote-tracking branch 'upstream/develop' into develop 2020-11-09 11:54:37 +01:00
d4816291b4 Update fr.json 2020-11-09 09:19:37 +05:30
b7c242a32f Merge pull request #373 from mrjelveh/develop
Adding stackoverflow & behance icon: Fixes #372
2020-11-09 09:05:58 +05:30
74b16824fa Merge branch 'develop' into develop 2020-11-09 09:05:17 +05:30
f779ca4cbf Issue #314: Modified Castform template to handle data profile having no birthDate field (backward compatibility) 2020-11-08 14:56:52 +01:00
f0660b4266 Adding stackoverflow & behance icon 2020-11-08 16:00:54 +03:30
2e6e4ad2c7 Update fr.json
"present": "cadeau" -> cadeau means 'gift' in French.
'Aujourd'hui' is more appropriate, it's the term use by LinkedIn in French.
French is my native language.
2020-11-07 19:27:27 +09:00
ea9931a147 Issue #314: Added new BirthDate field to the i18n language files 2020-11-04 14:56:28 +01:00
59f0ff9228 Issue #314: Added BirthDate field to Profile builder and Castform template 2020-11-04 13:38:43 +01:00
5bf9d5ae9e remove annoying confirmation dialog box 2020-10-10 12:59:55 +05:30
eed71286f2 bump up version to 2.2.1 2020-10-10 12:45:19 +05:30
36aad98485 bringing back the service worker 2020-10-10 12:45:04 +05:30
6bc0451ed9 MMerge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-10-10 12:32:38 +05:30
52e43638e7 fix firebase deploy settings 2020-10-10 12:32:19 +05:30
8f17f18b2b Merge pull request #358 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-10 12:09:16 +05:30
c704f8029b [ADD] new languages [FIX] PDF export 2020-10-10 12:07:29 +05:30
32a6cb5d30 New translations en.json (Norwegian) 2020-10-10 12:01:40 +05:30
54b3b649b8 Merge pull request #357 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-10 11:53:50 +05:30
3a48d6a7c2 New translations en.json (Norwegian) 2020-10-10 11:53:41 +05:30
1ab07a2f4b New translations en.json (Russian) 2020-10-10 11:53:40 +05:30
1a275d4585 New translations en.json (Swedish) 2020-10-10 11:53:38 +05:30
8297551e7c New translations en.json (Chinese Simplified) 2020-10-10 11:53:37 +05:30
93d04f3300 New translations en.json (Hindi) 2020-10-10 11:53:29 +05:30
f2b74caa7c Merge pull request #356 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-10 11:36:42 +05:30
b451276d68 New translations en.json (Kannada) 2020-10-10 11:36:21 +05:30
aec5238456 New translations en.json (French) 2020-10-10 11:36:19 +05:30
5de45ff155 New translations en.json (Spanish) 2020-10-10 11:36:17 +05:30
4ba401cd31 New translations en.json (Arabic) 2020-10-10 11:36:16 +05:30
2c452ebd6a New translations en.json (German) 2020-10-10 11:36:13 +05:30
b43733c811 New translations en.json (Italian) 2020-10-10 11:36:11 +05:30
7118de4198 New translations en.json (Japanese) 2020-10-10 11:36:09 +05:30
7e0222402d New translations en.json (Polish) 2020-10-10 11:36:07 +05:30
1071caa062 New translations en.json (Turkish) 2020-10-10 11:36:05 +05:30
fa82978ead New translations en.json (Portuguese, Brazilian) 2020-10-10 11:36:04 +05:30
aa5be1e0a0 [FIX] exporting resume 2020-10-10 11:22:08 +05:30
2020ecfacb Merge pull request #344 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-09 08:24:36 +05:30
ab1e2a9678 Merge pull request #348 from PostIt59/develop
🐛 Fix translate mistake
2020-10-09 08:24:25 +05:30
6af4ec193e 🐛 Fix translate mistake 2020-10-05 22:23:15 +02:00
2630891cd1 New translations en.json (Finnish) 2020-10-04 20:01:35 +05:30
054a97055b New translations en.json (Danish) 2020-10-04 17:48:44 +05:30
ac7f16f829 New translations en.json (French) 2020-10-04 13:48:18 +05:30
f7a2bb5af8 New translations en.json (Dutch) 2020-10-04 12:28:34 +05:30
49d0a5607e add back purge paths 2020-10-04 09:05:55 +05:30
a11db1db10 adding stylelint to repo 2020-10-04 08:58:01 +05:30
469f53bf6e fix with firebase deploy 2020-10-03 09:10:19 +05:30
2aaed1a575 fixing crashes, upgrading dependencies, patching security vulnerabilities 2020-10-03 08:57:37 +05:30
2410ce024a Merge pull request #341 from robert-w-gries/utils_hook_fix
Fix app crashes after setting date range
2020-10-03 08:14:05 +05:30
77f3837fc8 Merge pull request #340 from thjiang/develop
- add translation for Simplified Chinese
2020-10-03 08:13:46 +05:30
c4d63da884 Merge pull request #339 from kbravh/develop
Set contact icons for phone, website, and email
2020-10-03 08:13:21 +05:30
c7b03bde79 Merge pull request #330 from AmruthPillai/dependabot/npm_and_yarn/functions/node-fetch-2.6.1
Bump node-fetch from 2.6.0 to 2.6.1 in /functions
2020-10-03 08:12:56 +05:30
0f6c4b3b45 Merge pull request #328 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-03 08:12:34 +05:30
52912aff0a Merge pull request #322 from AmruthPillai/dependabot/npm_and_yarn/functions/bl-4.0.3
Bump bl from 4.0.2 to 4.0.3 in /functions
2020-10-03 08:12:27 +05:30
0104e888e7 Merge pull request #318 from marciojpflorindo/develop
Translation to pt-PT
2020-10-03 08:12:04 +05:30
370de9ec47 Remove useTranslation hook from util functions 2020-10-02 18:17:48 +00:00
d712dbf5e2 - add translate for Simplified Chinese 2020-10-02 17:22:35 +08:00
054dec5b68 Set contact icons for phone, website, and email 2020-09-18 10:25:51 -05:00
838b63ca42 New translations en.json (Polish) 2020-09-17 01:28:43 +05:30
50da90af89 Bump node-fetch from 2.6.0 to 2.6.1 in /functions
Bumps [node-fetch](https://github.com/bitinn/node-fetch) from 2.6.0 to 2.6.1.
- [Release notes](https://github.com/bitinn/node-fetch/releases)
- [Changelog](https://github.com/node-fetch/node-fetch/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bitinn/node-fetch/compare/v2.6.0...v2.6.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-13 02:32:34 +00:00
656ff69af3 New translations en.json (Italian) 2020-09-09 18:01:42 +05:30
3d8b9f8ba3 Bump bl from 4.0.2 to 4.0.3 in /functions
Bumps [bl](https://github.com/rvagg/bl) from 4.0.2 to 4.0.3.
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v4.0.2...v4.0.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-02 18:50:19 +00:00
f622ccda1d translation to pt-PT 2020-08-31 12:31:22 +01:00
1c25ffe037 Merge pull request #308 from grijul/develop
Added GitLab icon
2020-08-22 21:27:36 +05:30
895f18181a Added GitLab icon 2020-08-19 18:40:16 +05:30
e2ef7874a6 Update README.md 2020-08-13 11:06:12 +05:30
4fecbaf8d8 Merge pull request #297 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-13 11:05:41 +05:30
0d65e9d0c0 New translations en.json (Kannada) 2020-08-13 11:03:26 +05:30
3695a25428 New translations en.json (Arabic) 2020-08-13 11:03:24 +05:30
9f30f0dafb New translations en.json (Danish) 2020-08-13 11:03:23 +05:30
1dce5f248a New translations en.json (German) 2020-08-13 11:03:22 +05:30
e0e08f7071 New translations en.json (Finnish) 2020-08-13 11:03:20 +05:30
73a6ab096f New translations en.json (Japanese) 2020-08-13 11:03:19 +05:30
64c1ec4cc2 New translations en.json (French) 2020-08-13 11:03:17 +05:30
5d1f378397 New translations en.json (Dutch) 2020-08-13 11:03:16 +05:30
d00cb00a7c New translations en.json (Turkish) 2020-08-13 11:03:14 +05:30
1c123e922d New translations en.json (Spanish) 2020-08-13 11:03:12 +05:30
9fcc3c1ae6 New translations en.json (Portuguese, Brazilian) 2020-08-13 11:03:11 +05:30
dc6c5b848b New translations en.json (Finnish) 2020-08-09 12:50:19 +05:30
929f7c7147 Merge pull request #296 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-08 09:04:23 +05:30
33ce66eab1 New translations en.json (Kannada) 2020-08-08 09:04:13 +05:30
3aa968248d New translations en.json (Arabic) 2020-08-08 09:04:12 +05:30
2d0a524f86 New translations en.json (Danish) 2020-08-08 09:04:10 +05:30
6d4bfc196b New translations en.json (German) 2020-08-08 09:04:09 +05:30
906f9434f4 New translations en.json (Finnish) 2020-08-08 09:04:07 +05:30
033b6df89b New translations en.json (Japanese) 2020-08-08 09:04:05 +05:30
5c8530f53e New translations en.json (French) 2020-08-08 09:04:04 +05:30
74c6fd7b4e New translations en.json (Dutch) 2020-08-08 09:04:02 +05:30
f45c9d3ef8 New translations en.json (Turkish) 2020-08-08 09:04:01 +05:30
f7245936c7 New translations en.json (Spanish) 2020-08-08 09:03:59 +05:30
91dc642dbd New translations en.json (Portuguese, Brazilian) 2020-08-08 09:03:57 +05:30
5955567b5e - add "Present" key string in i18n 2020-08-08 08:52:30 +05:30
1e5dc00da8 fix list style indent 2020-08-08 08:47:09 +05:30
0374f572e6 Merge pull request #295 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-08 08:39:39 +05:30
28855bcc48 New translations en.json (Portuguese, Brazilian) 2020-08-07 23:22:55 +05:30
2b0a127904 Merge pull request #292 from crazyuploader/patch-1
Update README.md
2020-08-06 19:46:05 +05:30
c148a677e9 Update README.md 2020-08-06 18:34:32 +05:30
94abd5ce4f Merge pull request #285 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-03 22:24:47 +05:30
c77448a932 Merge pull request #284 from a-thug/develop
Fix scaling for large monitor
2020-08-03 22:24:23 +05:30
dc95fb4f60 Merge pull request #283 from MeisterLLD/develop
Update fr.json
2020-08-03 22:23:55 +05:30
b52118d1b2 New translations en.json (Japanese) 2020-08-03 20:17:11 +05:30
2107a1af45 Fix scaling for large monitor 2020-08-03 23:25:33 +09:00
465ee689d3 Update fr.json 2020-08-03 12:21:51 +02:00
87e3ebfaa8 - update dependencies 2020-08-01 10:31:04 +05:30
dc6f825f2e Merge pull request #276 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-01 10:09:11 +05:30
bc622083c7 - fix black screen issue when in certain templates 2020-08-01 10:08:25 +05:30
7db22e3b42 New translations en.json (Danish) 2020-07-31 20:19:21 +05:30
ac9650e397 New translations en.json (Dutch) 2020-07-31 20:19:19 +05:30
1f80fc481d - add norwegian language 2020-07-31 19:15:20 +05:30
9f81101084 - fix typo in import text 2020-07-31 19:11:10 +05:30
3634e3cf35 Merge pull request #275 from rubjo/develop
Add Norwegian translation
2020-07-31 19:06:37 +05:30
a991546e79 - fix photo not being uploaded 2020-07-31 19:01:16 +05:30
7a2f86a5c3 Fix English typo 2020-07-31 14:19:53 +02:00
48e7149540 Add Norwegian translation 2020-07-31 14:19:39 +02:00
09ea3b95ab - fix label in contact
- fix importing from json
- fix reset everything
- update dependencies
2020-07-31 13:33:11 +05:30
714d37deca - add arabic language 2020-07-31 12:36:43 +05:30
0b6345ff16 Merge pull request #274 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-31 12:31:55 +05:30
4fbe758165 Merge branch 'develop' into l10n_develop 2020-07-31 12:31:08 +05:30
729570c8b7 New translations en.json (Arabic) 2020-07-31 12:27:06 +05:30
b8215a9081 Merge pull request #271 from A7madXatab/develop
adding support for arabic language
2020-07-31 12:14:52 +05:30
63b3c4d1dd adding support for arabic language 2020-07-30 04:28:32 -07:00
509a59b943 Merge pull request #270 from RiderExMachina/patch-1
Fix typo on the index page
2020-07-30 09:37:50 +05:30
56616183f1 Fix typo on the index page
Change "convinient" => "convenient"
2020-07-29 17:37:50 -07:00
3eb69151a6 - fix language issue when printing 2020-07-28 10:09:05 +05:30
a1d345dfb2 fix website link 2020-07-28 09:24:44 +05:30
ba0ee5fdf9 upddate dependencies, cache buster 2020-07-28 09:18:41 +05:30
e8b735e1cb - adding Japanese language 2020-07-25 20:23:10 +05:30
e4f0373661 Merge pull request #260 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-25 20:16:59 +05:30
78753dff08 New translations en.json (Kannada) 2020-07-25 20:16:43 +05:30
be8e506747 New translations en.json (Portuguese, Brazilian) 2020-07-25 20:16:36 +05:30
9d65b02554 New translations en.json (Japanese) 2020-07-25 15:47:42 +05:30
79f4d68383 Merge pull request #258 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-25 07:39:41 +05:30
0b71193526 New translations en.json (Spanish) 2020-07-25 01:38:43 +05:30
4c39d7fd74 New translations en.json (Dutch) 2020-07-24 23:33:43 +05:30
f1fe45e9c9 removed experimental code 2020-07-24 21:56:02 +05:30
f2a0b612d0 solving bugs reported in GH issues 2020-07-24 21:54:48 +05:30
586f2b1eca Merge pull request #251 from SophieMdl/customize-skills-level-input
Customize skills level input
2020-07-24 10:37:15 +05:30
59fcfbf78d replace select by single input 2020-07-22 09:53:53 +02:00
7aab7c74f6 - add multiple languages
- switch from moment to dayjs
2020-07-21 11:07:19 +05:30
e4f40f04ff Merge pull request #247 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-21 09:24:16 +05:30
068b955f6e Merge pull request #246 from 2imad/dutch-translation
add dutch translation
2020-07-21 09:17:27 +05:30
cad10b73de New translations en.json (Danish) 2020-07-21 04:26:39 +05:30
316d4c8a2a New translations en.json (German) 2020-07-21 00:26:58 +05:30
8f3ccdeabc New translations en.json (Dutch) 2020-07-21 00:26:56 +05:30
4071d7e0a3 add dutch translation 2020-07-20 20:06:26 +02:00
f13984cbf3 Update README.md 2020-07-20 18:03:49 +05:30
b696c71152 - add Turkish language
- update dependencies
- increment version
2020-07-20 07:57:40 +05:30
cee9c7f35b Merge pull request #236 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-20 07:53:05 +05:30
f54c7ec51f Merge branch 'develop' into l10n_develop 2020-07-20 07:52:26 +05:30
5aecfb47bd New translations en.json (Turkish) 2020-07-20 07:52:00 +05:30
0068b2f085 Merge pull request #234 from AtlasFontaine/develop
Added Turkish language support
2020-07-20 07:48:22 +05:30
fe645e7d4c - make dates follow internationalization standard 2020-07-20 07:43:56 +05:30
5e4dc8c4bd Added Turkish language support 2020-07-19 19:04:50 +03:00
9930cee309 - update layout to work for responsive screen sizes 2020-07-19 20:33:11 +05:30
6a8775e31b update dependencies 2020-07-19 19:02:53 +05:30
0265eea7bf - added French translations 2020-07-19 18:58:05 +05:30
84dfdbca8a Merge pull request #231 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 18:55:31 +05:30
d7fbbc3217 Merge branch 'develop' into l10n_develop 2020-07-19 18:55:18 +05:30
1d51353849 New translations en.json (French) 2020-07-19 18:51:59 +05:30
6d4f5b2e3f Merge pull request #230 from MeisterLLD/develop
fr translation
2020-07-19 18:41:58 +05:30
aa1ac369cc Merge pull request #229 from prateek-parashar/develop
Fixed a typo
2020-07-19 18:40:23 +05:30
68bd420211 some more things translated (donations, github link) 2020-07-19 14:14:37 +02:00
8137ac1c9b some missing ones 2020-07-19 13:59:40 +02:00
c20787f93e awarder-> décerné 2020-07-19 13:45:54 +02:00
cc730cf82a a few changes in fr translations 2020-07-19 13:44:57 +02:00
0a46c1ed52 Merge pull request #1 from prateek-parashar/prateek-parashar-patch-1
Updated the readme : Fixed a typo
2020-07-19 17:10:55 +05:30
7b850027fc some more fr translations 2020-07-19 13:40:24 +02:00
6c87d3c1c6 Updated the readme : Fixed a typo
Hi!
I followed the project from the Internet and notices this quick fix!
2020-07-19 17:10:13 +05:30
1a81940085 first attempt at fr translation 2020-07-19 13:20:29 +02:00
44bf41e60a added Finnish language 2020-07-19 15:20:46 +05:30
c0ae8f3e4f Merge pull request #227 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 15:09:41 +05:30
1aab5f70a9 New translations en.json (Finnish) 2020-07-19 14:57:27 +05:30
84440f09ed Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-19 09:12:59 +05:30
51b579ed3a - add Portuguese Brazillian language 2020-07-19 09:12:53 +05:30
50badbf7fe Update README.md 2020-07-19 09:10:08 +05:30
4c91d3f341 Merge pull request #226 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 09:03:41 +05:30
dce6e3aed2 New translations en.json (Portuguese, Brazilian) 2020-07-19 09:03:10 +05:30
7ec18693b4 Merge pull request #225 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 09:01:44 +05:30
4a53e4b1bb New translations en.json (Portuguese, Brazilian) 2020-07-19 09:00:39 +05:30
f9f84378d6 New translations en.json (Spanish) 2020-07-19 09:00:37 +05:30
e56876b56f New translations en.json (Kannada) 2020-07-19 09:00:34 +05:30
3fa849e3bc Merge pull request #224 from felcg/develop
add brazilian portuguese language
2020-07-19 08:57:06 +05:30
3c0251ca1f Create pt-br.json 2020-07-18 19:38:34 -03:00
13c5b92e53 - add spanish language 2020-07-18 23:05:25 +05:30
8e8c5f4e04 Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-18 22:58:09 +05:30
d8f35f30df Merge branch 'l10n_develop' into develop 2020-07-18 22:57:53 +05:30
626009c2b8 Merge branch 'develop' into l10n_develop 2020-07-18 22:57:46 +05:30
d15b1b4067 New translations en.json (Spanish) 2020-07-18 22:27:04 +05:30
e26a0df1bd New translations en.json (Kannada) 2020-07-18 22:27:01 +05:30
dbe6469e9d Merge pull request #219 from AmruthPillai/imgbot
[ImgBot] Optimize images
2020-07-18 22:18:14 +05:30
a33437abea [ImgBot] Optimize images
*Total -- 6,147.74kb -> 4,536.52kb (26.21%)

/static/images/screenshots/screen-3.png -- 688.75kb -> 405.73kb (41.09%)
/static/images/screenshots/screen-1.png -- 1,060.97kb -> 756.51kb (28.7%)
/static/images/screenshots/screen-4.png -- 1,223.75kb -> 896.00kb (26.78%)
/static/images/screenshots/screen-2.png -- 1,533.91kb -> 1,168.82kb (23.8%)
/static/images/screenshots/screen-5.png -- 1,640.35kb -> 1,309.47kb (20.17%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2020-07-18 16:45:08 +00:00
688a77ddb5 - update screenshots 2020-07-18 22:14:05 +05:30
b811d73f26 Update README.md 2020-07-18 21:55:08 +05:30
ec6ddd1fff fix issue with celebi printing 2020-07-18 21:51:01 +05:30
5bb4bc5941 Update README.md 2020-07-18 21:24:46 +05:30
f972d64eea fix markdown not displaying bullet lists 2020-07-18 19:30:59 +05:30
2f44f90364 update translations, fix form loading bug 2020-07-18 19:15:15 +05:30
89261f27d8 fix test being repeated in share your resume 2020-07-18 18:40:51 +05:30
eaf2f38940 Update README.md 2020-07-18 18:32:54 +05:30
ef9fc9c071 Merge pull request #214 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-17 11:17:10 +05:30
f051eb2286 New translations en.json (Kannada) 2020-07-17 11:07:09 +05:30
3a2f9c1542 - update version 2020-07-17 10:54:10 +05:30
d6ac14eb93 Merge branch 'master' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-17 10:53:58 +05:30
60acdce555 Create FUNDING.yml 2020-07-17 10:51:56 +05:30
0eab454d5d Merge pull request #213 from AmruthPillai/develop
Some more bugfixes, updates to artboard styles
2020-07-17 10:34:38 +05:30
b52f3dee07 - add app version
- fix bugs with artboard
2020-07-17 10:32:28 +05:30
da5158f757 Merge pull request #212 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-17 10:00:57 +05:30
9a9590299d New translations en.json (Hindi) 2020-07-17 10:00:37 +05:30
ab029a759f New translations en.json (French) 2020-07-17 10:00:35 +05:30
cc291b1fb5 New translations en.json (Spanish) 2020-07-17 10:00:33 +05:30
38ace117ea New translations en.json (Afrikaans) 2020-07-17 10:00:32 +05:30
aacd516cf3 New translations en.json (Arabic) 2020-07-17 10:00:30 +05:30
ceddfa6cdc New translations en.json (Bulgarian) 2020-07-17 10:00:28 +05:30
0dc6166b59 New translations en.json (Catalan) 2020-07-17 10:00:27 +05:30
568e4e72d8 New translations en.json (Czech) 2020-07-17 10:00:26 +05:30
a92941e568 New translations en.json (Danish) 2020-07-17 10:00:24 +05:30
78e97abb3b New translations en.json (German) 2020-07-17 10:00:23 +05:30
0b8145d5ff New translations en.json (Greek) 2020-07-17 10:00:21 +05:30
3eac9ef6ac New translations en.json (Finnish) 2020-07-17 10:00:20 +05:30
7bcac45214 New translations en.json (Hebrew) 2020-07-17 10:00:18 +05:30
a3d6a50489 New translations en.json (Hungarian) 2020-07-17 10:00:17 +05:30
3bab21d1e8 New translations en.json (Romanian) 2020-07-17 10:00:15 +05:30
5fc46bf634 New translations en.json (Italian) 2020-07-17 10:00:13 +05:30
4b2ce15fc9 New translations en.json (Korean) 2020-07-17 10:00:11 +05:30
bdc987e878 New translations en.json (Dutch) 2020-07-17 10:00:10 +05:30
2f9dd15c0d New translations en.json (Norwegian) 2020-07-17 10:00:09 +05:30
5becf826d2 New translations en.json (Polish) 2020-07-17 10:00:07 +05:30
33fef62417 New translations en.json (Portuguese) 2020-07-17 10:00:06 +05:30
c7aae10231 New translations en.json (Russian) 2020-07-17 10:00:05 +05:30
5dad0c7995 New translations en.json (Serbian (Cyrillic)) 2020-07-17 10:00:03 +05:30
a46550204b New translations en.json (Swedish) 2020-07-17 10:00:01 +05:30
de21432d07 New translations en.json (Turkish) 2020-07-17 10:00:00 +05:30
fc4cee3767 New translations en.json (Ukrainian) 2020-07-17 09:59:58 +05:30
6635e6556d New translations en.json (Chinese Simplified) 2020-07-17 09:59:57 +05:30
705fd4bbc6 New translations en.json (Vietnamese) 2020-07-17 09:59:56 +05:30
6f24317c94 New translations en.json (Tamil) 2020-07-17 09:59:54 +05:30
2e698a54e8 New translations en.json (Japanese) 2020-07-17 09:59:53 +05:30
2c0f58bb07 New translations en.json (Kannada) 2020-07-17 09:59:51 +05:30
6ba81683ff Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-17 09:59:17 +05:30
31506af8fc - fix empty space at start of line 2020-07-17 09:59:13 +05:30
32dcc7ee84 New translations en.json (Hindi) 2020-07-17 09:48:31 +05:30
11e5e392c3 New translations en.json (French) 2020-07-17 09:48:30 +05:30
abee586e5a New translations en.json (Spanish) 2020-07-17 09:48:29 +05:30
0a50fc3488 New translations en.json (Afrikaans) 2020-07-17 09:48:28 +05:30
3413150177 New translations en.json (Arabic) 2020-07-17 09:48:27 +05:30
c06e3a9081 New translations en.json (Bulgarian) 2020-07-17 09:48:25 +05:30
9127bda6b3 New translations en.json (Catalan) 2020-07-17 09:48:24 +05:30
7aef4156c4 New translations en.json (Czech) 2020-07-17 09:48:23 +05:30
98501762a9 New translations en.json (Danish) 2020-07-17 09:48:21 +05:30
1e6471910b New translations en.json (German) 2020-07-17 09:48:20 +05:30
61d258d939 New translations en.json (Greek) 2020-07-17 09:48:19 +05:30
b85e5680cf New translations en.json (Finnish) 2020-07-17 09:48:18 +05:30
ef8ca86f30 New translations en.json (Hebrew) 2020-07-17 09:48:17 +05:30
a00297131b New translations en.json (Hungarian) 2020-07-17 09:48:15 +05:30
b6d853759c New translations en.json (Romanian) 2020-07-17 09:48:14 +05:30
100a7880d4 New translations en.json (Italian) 2020-07-17 09:48:13 +05:30
552287ddf8 New translations en.json (Korean) 2020-07-17 09:48:12 +05:30
b9fa284644 New translations en.json (Dutch) 2020-07-17 09:48:11 +05:30
82d512b602 New translations en.json (Norwegian) 2020-07-17 09:48:09 +05:30
9e6ff789a7 New translations en.json (Polish) 2020-07-17 09:48:08 +05:30
6a6e20ad57 New translations en.json (Portuguese) 2020-07-17 09:48:07 +05:30
d047e1e5ea New translations en.json (Russian) 2020-07-17 09:48:06 +05:30
7713d92610 New translations en.json (Serbian (Cyrillic)) 2020-07-17 09:48:05 +05:30
dfba7103ff New translations en.json (Swedish) 2020-07-17 09:48:04 +05:30
ce8f0dd497 New translations en.json (Turkish) 2020-07-17 09:48:02 +05:30
fa354bf041 New translations en.json (Ukrainian) 2020-07-17 09:48:01 +05:30
4a688a284d New translations en.json (Chinese Simplified) 2020-07-17 09:48:00 +05:30
6dda5fb226 New translations en.json (Vietnamese) 2020-07-17 09:47:59 +05:30
c5eaf43a3d New translations en.json (Tamil) 2020-07-17 09:47:58 +05:30
4a0241eded New translations en.json (Japanese) 2020-07-17 09:47:57 +05:30
678d022bb6 New translations en.json (Kannada) 2020-07-17 09:47:11 +05:30
42ee915aaf Update Crowdin configuration file 2020-07-17 09:46:24 +05:30
0a1ad4d091 Update Crowdin configuration file 2020-07-17 09:34:33 +05:30
2d76396040 Update Crowdin configuration file 2020-07-17 09:32:41 +05:30
9d0d7bd96e Merge pull request #210 from AmruthPillai/develop
Production Release of Reactive Resume v2
2020-07-17 09:26:43 +05:30
689d35a4af - add LICENSE
- update README.md
2020-07-17 09:22:10 +05:30
210d5c7f4d Merge pull request #209 from AmruthPillai/imgbot
[ImgBot] Optimize images
2020-07-17 09:12:47 +05:30
ea26241a15 [ImgBot] Optimize images
*Total -- 281.74kb -> 204.39kb (27.45%)

/static/icons/maskable.png -- 29.65kb -> 7.40kb (75.06%)
/static/images/screenshots/screen-5.png -- 34.09kb -> 16.76kb (50.84%)
/static/icons/icon-384x384.png -- 11.94kb -> 6.83kb (42.81%)
/static/icons/icon-512x512.png -- 8.42kb -> 4.83kb (42.69%)
/static/images/logo.png -- 8.30kb -> 4.85kb (41.63%)
/static/icons/icon-192x192.png -- 5.65kb -> 3.38kb (40.2%)
/static/icons/icon-96x96.png -- 2.78kb -> 1.70kb (38.67%)
/static/icons/icon-128x128.png -- 3.79kb -> 2.33kb (38.51%)
/static/icons/icon-152x152.png -- 4.44kb -> 2.73kb (38.49%)
/static/icons/icon-144x144.png -- 4.27kb -> 2.63kb (38.45%)
/static/icons/icon-72x72.png -- 1.98kb -> 1.24kb (37.53%)
/static/images/screenshots/screen-4.png -- 93.94kb -> 83.78kb (10.81%)
/static/images/screenshots/screen-2.png -- 72.49kb -> 65.94kb (9.03%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2020-07-17 03:40:36 +00:00
5627a2e941 Merge branch 'v2' into develop 2020-07-17 09:10:04 +05:30
96259c6c5d - final sanity checks before release 2020-07-17 09:06:47 +05:30
816e400b31 - implement ability to rename sections
- clean up kannada translations
2020-07-17 08:36:46 +05:30
c57eb2e9aa Update README.md 2020-07-16 21:33:14 +05:30
f8d679993a - make the app faster, better accesibility 2020-07-16 20:30:53 +05:30
0b70d7ebec - attempt at responsiveness fix
- bring back scrollbars
- update dependencies
2020-07-16 19:53:14 +05:30
0019fee34e - switch to using downloadjs for downloading files
- increase timeout for cloud function
2020-07-16 17:34:21 +05:30
406a3dba56 - gear up for staging release 2020-07-16 15:59:35 +05:30
f41018c60b - implement "Import from JSON Resume" feature 2020-07-16 11:58:31 +05:30
8e9bd99e91 - add sitemap.xml
- reduce screenshot sizes
2020-07-16 10:31:56 +05:30
be40644497 - implement screenshots
- implement OG tags
2020-07-16 10:04:49 +05:30
a7657b4a5c - implement i18n
- translation dynamic for sections
- added articles for SEO
2020-07-16 08:42:19 +05:30
b7c565de79 - implement about section 2020-07-14 22:59:59 +05:30
af955bbf55 - implement donation link, in about section 2020-07-14 17:24:59 +05:30
851d6ef020 - fix firebase functions execution 2020-07-13 23:23:21 +05:30
e9bc40afb5 - update to use onCall from firebase functions 2020-07-13 22:13:00 +05:30
f17471b94d - fix issues with function calls 2020-07-13 17:01:56 +05:30
48b11de774 update firebase hosting link to functions 2020-07-13 16:52:26 +05:30
cf5d0b9571 - update for statging release, pre-checks 2020-07-13 16:38:08 +05:30
591c9a6ccf - remove eslint from functions project 2020-07-13 16:03:15 +05:30
c7b39c9ed3 - updated packages across projects, deployed to staging 2020-07-13 15:58:59 +05:30
55fd1d4bdc - implement celebi template 2020-07-13 09:46:55 +05:30
7b2094a543 - implement glalie template 2020-07-12 21:51:38 +05:30
41e708e302 - implement gengar template 2020-07-12 19:31:22 +05:30
5ccc360345 - implement cloud functions for printing
- implement AMOLED mode
- implement reset layout
2020-07-12 15:04:07 +05:30
f468ca73c3 - implement actions section
- implement settings section
2020-07-12 12:55:08 +05:30
8972a96afd - implement duplicate resume functionality 2020-07-11 21:45:34 +05:30
5ec1f21bd3 - complete onyx design template
- implement public sharable urls
- implement more actions
2020-07-11 20:42:16 +05:30
0b5653fab5 - completed design of Onyx template 2020-07-11 10:49:55 +05:30
a8c5d29858 - implement actions section 2020-07-10 13:40:48 +05:30
89fa8236e8 - creating a dynamic color palette
- implementing actions section
2020-07-10 01:09:33 +05:30
da197be2f5 - implement fonts section 2020-07-09 20:43:38 +05:30
3eaab3b427 - implement colors section 2020-07-09 20:06:49 +05:30
3b252476c4 - refactor sections
- combine resume and metadata contexts
2020-07-09 19:18:04 +05:30
c00d7a9eef - fixing conflicting order warning and firebase warning
- added more web manifest rules
2020-07-09 15:45:20 +05:30
370b0c4020 - implementing react-scroll 2020-07-09 14:30:06 +05:30
3aaef5f730 - memoize all components
- implement metadata context
2020-07-09 14:00:18 +05:30
9e98da038c - implementing hobby, language and reference sections
- dynamic template selection
2020-07-09 10:41:16 +05:30
9045e2983d - run eslint --fix across project 2020-07-09 00:14:13 +05:30
a1931f5e36 - switched to useSelector
- implemented skills section
2020-07-08 22:26:27 +05:30
70866420e5 - implement certifications section 2020-07-08 20:20:44 +05:30
c38788aa3b - implement awards section 2020-07-08 20:07:28 +05:30
922db70107 - implement work experience
- implement education
- show dynamic names in layout
2020-07-08 16:49:26 +05:30
bee6a40e9f - implement lists
- implement generic sections
- implement list actions
- implement error handlers
2020-07-08 05:01:50 +05:30
d7e86ddf29 - fix conflicting order warning by mini-css-extract-plugin 2020-07-07 10:01:20 +05:30
4e064dba96 - fix issue with firebase-hooks
- implement custom useAuthState
2020-07-06 19:53:47 +05:30
862ff7cdc1 - fix eslint warning 2020-07-06 16:08:01 +05:30
d02fad1164 - fix bug with multiple modal appearances 2020-07-06 16:07:32 +05:30
dbb005d26c - using nanoevents as event emitter
- bug: createResumeModal opens twice
2020-07-06 14:47:05 +05:30
6d3e5823fc - implement tips on loading screen
- implement centralized sections
- removed react-spinner package
2020-07-06 10:02:17 +05:30
65fc779d58 - switching from firestore to realtime DB
- implement debouncing tactic to sync data
- display sync indicator
2020-07-06 00:25:31 +05:30
49a867dd37 - recreating onyx template
- profile section complete
2020-07-05 16:45:29 +05:30
03e1de1d14 implement reorder/moving of sections between blocks 2020-07-05 13:34:04 +05:30
202c7f5ad4 - creating the right sidebar
- designing the artboard
- optimizing dark mode performance
- optimizing input onChange handler
2020-07-05 11:34:32 +05:30
6f66181c17 - designing the builder
- designing the left navbar and sidebar
2020-07-04 22:41:28 +05:30
f806b3f96d Update README.md 2020-07-04 15:15:18 +05:30
b42deb737c - deleting a resume 2020-07-04 15:13:50 +05:30
e247cb102c - creating and updating resumes 2020-07-04 14:31:25 +05:30
e1f1d84201 - designing the dashboard
- resume preview
- create resume modal
2020-07-04 10:26:29 +05:30
dd5e594dc9 - code cleanup and security checks 2020-07-03 21:04:43 +05:30
c53cd84722 - add icons and favicon 2020-07-03 20:55:52 +05:30
84ceae05c3 Merge pull request #204 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-03 20:45:11 +05:30
6dc2747a9b - storing user information in firestore 2020-07-03 20:44:12 +05:30
24fed8ff3f - adding icons to buttons
- styling modals for dark mode
2020-07-03 19:37:23 +05:30
3a1d42025f - integrating sign in with google
- set up dark mode context and other services
2020-07-03 18:59:25 +05:30
5f01287685 New translations objective.json (Finnish) 2020-07-03 16:15:09 +05:30
954aeef366 New translations about.json (Finnish) 2020-07-03 15:58:25 +05:30
e379533e81 New translations work.json (Finnish) 2020-07-03 15:58:23 +05:30
4caab8f7ea New translations references.json (Finnish) 2020-07-03 15:58:22 +05:30
37a31f0ecb New translations profile.json (Finnish) 2020-07-03 15:58:20 +05:30
cd2c284ca7 New translations objective.json (Finnish) 2020-07-03 15:58:19 +05:30
205c365ee2 New translations languages.json (Finnish) 2020-07-03 15:58:18 +05:30
ec44bc93f2 New translations extras.json (Finnish) 2020-07-03 15:58:17 +05:30
f0aa9a3bc9 New translations education.json (Finnish) 2020-07-03 15:58:15 +05:30
c45886dc18 New translations certifications.json (Finnish) 2020-07-03 15:58:14 +05:30
336fd22150 - building the base modal trigger architecture 2020-07-03 15:48:55 +05:30
52d9f92b62 New translations actions.json (Finnish) 2020-07-03 15:44:24 +05:30
0fa9cb5d47 New translations about.json (Finnish) 2020-07-03 15:44:23 +05:30
f145064b14 New translations actions.json (Finnish) 2020-07-03 15:20:35 +05:30
cb06f2d731 New translations settings.json (Finnish) 2020-07-03 15:04:54 +05:30
cbdd332de0 New translations fonts.json (Finnish) 2020-07-03 15:04:53 +05:30
ffbc8e560d New translations colors.json (Finnish) 2020-07-03 15:04:51 +05:30
57cdfcf7bd New translations actions.json (Finnish) 2020-07-03 15:04:50 +05:30
7bcdcf5987 New translations templates.json (Finnish) 2020-07-03 14:50:31 +05:30
48729306f1 New translations app.json (Finnish) 2020-07-03 14:50:29 +05:30
48e324b768 New translations actions.json (Finnish) 2020-07-03 14:44:41 +05:30
7d6221327d New translations app.json (Finnish) 2020-07-03 14:44:40 +05:30
17fd577a22 New translations work.json (Finnish) 2020-07-03 14:31:38 +05:30
273c81242c New translations profile.json (Finnish) 2020-07-03 14:31:36 +05:30
97e05e01e4 New translations languages.json (Finnish) 2020-07-03 14:31:35 +05:30
908d933ab8 New translations awards.json (Finnish) 2020-07-03 14:31:33 +05:30
70ef926b70 - intial gatsbyJS setup
- setting up tailwindcss and other plugins
- designing the landing page
- creating a reusable button component
2020-07-03 13:00:46 +05:30
d2e3227d01 clearing the slate 2020-07-02 21:23:03 +05:30
1192 changed files with 77354 additions and 31670 deletions

View File

@ -1,8 +1,4 @@
node_modules
git
.gitignore
.dockerignore
Dockerfile*
docker-compose*
README.md
LICENSE
.cache/
node_modules/
functions/
public/

1
.env
View File

@ -1 +0,0 @@
SKIP_PREFLIGHT_CHECK=true

8
.env.example Normal file
View File

@ -0,0 +1,8 @@
FIREBASE_APIKEY=""
FIREBASE_APPID=""
FIREBASE_AUTHDOMAIN=""
FIREBASE_DATABASEURL=""
FIREBASE_MEASUREMENTID=""
FIREBASE_MESSAGINGSENDERID=""
FIREBASE_PROJECTID=""
FIREBASE_STORAGEBUCKET=""

4
.eslintignore Normal file
View File

@ -0,0 +1,4 @@
.cache
package.json
package-lock.json
public

View File

@ -1,29 +1,36 @@
{
"parser": "babel-eslint",
"parserOptions": {
"sourceType": "module",
"allowImportExportEverywhere": false,
"codeFrame": false
"globals": {
"atob": true,
"Blob": true,
"fetch": true,
"window": true,
"document": true,
"FileReader": true,
"localStorage": true
},
"extends": [
"airbnb",
"plugin:react/recommended",
"prettier",
"prettier/react"
"plugin:jest/recommended",
"plugin:jest/style",
"prettier"
],
"env": {
"browser": true,
"jest": true
},
"plugins": ["jest", "prettier", "sort-imports-es6-autofix"],
"rules": {
"jsx-a11y/no-static-element-interactions": 0,
"jsx-a11y/click-events-have-key-events": 0,
"import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
"jsx-a11y/label-has-associated-control": 0,
"react/jsx-filename-extension": 0,
"react/jsx-one-expression-per-line": 0,
"react/jsx-props-no-spreading": 0,
"prettier/prettier": ["error"],
"react/no-array-index-key": 0,
"jsx-a11y/anchor-is-valid": 0,
"react/button-has-type": 0,
"no-unused-expressions": 0,
"no-restricted-syntax": 0,
"no-param-reassign": 0,
"consistent-return": 0,
"no-nested-ternary": 0,
"react/prop-types": 0,
"no-plusplus": 0
}
}
}

View File

@ -5,11 +5,8 @@
"targets": {
"rx-resume": {
"hosting": {
"app": [
"rx-resume"
],
"docs": [
"docs-rx-resume"
"rxresume": [
"public"
]
}
}

4
.github/FUNDING.yml vendored
View File

@ -1 +1,3 @@
open_collective: reactive-resume
# These are supported funding model platforms
custom: ['buymeacoffee.com/AmruthPillai']

View File

@ -1,31 +0,0 @@
---
name: Bug Report
about: Create a report to help us improve
title: "[Bug] "
labels: bug
assignees: ''
---
**Describe the Bug**
A clear and concise description of what the bug is.
**Reproduction**
Steps to reproduce the behaviour:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected Behaviour**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS/macOS/Windows 10]
- Browser [e.g. Chrome/Safari/Firefox]
**Additional Context**
Add any other context about the problem here.

View File

@ -1,21 +0,0 @@
---
name: Feature Request
about: Suggest an idea for this project
title: "[Feature] "
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is.
Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

34
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@ -0,0 +1,34 @@
name: CodeQL Analysis
on:
push:
branches: [ develop ]
pull_request:
branches: [ develop ]
schedule:
- cron: '37 16 * * 0'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@ -1,25 +0,0 @@
name: Build & Deploy
on:
push:
branches: [master]
jobs:
build:
name: Build & Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout GitHub Repository
uses: actions/checkout@v2.0.0
- name: Install Project Dependencies
run: npm install
- name: Build App
run: npm run build
- name: Build Documentation
run: npm run docs:build
- name: Deploy to Firebase Hosting
uses: w9jds/firebase-action@v1.3.0
with:
args: deploy --only hosting
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

27
.github/workflows/run-tests.yml vendored Normal file
View File

@ -0,0 +1,27 @@
name: Run Unit Tests
on:
push:
branches: [ develop ]
pull_request:
branches: [ develop ]
jobs:
build:
name: Build
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test

100
.gitignore vendored
View File

@ -1,30 +1,76 @@
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# firebase
.firebase
# tailwind
tailwind.css
# vuepress
docs/.vuepress/dist
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Coverage directory used by Jest
test-coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# dotenv environment variable files
.env
# gatsby files
.cache/
public
# Firebase Files
.firebase
# Mac files
.DS_Store
# Yarn
yarn-error.log
.pnp/
.pnp.js
# Yarn Integrity file
.yarn-integrity

1
.husky/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
_

4
.husky/pre-commit Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged

5
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,5 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/

12
.idea/Reactive-Resume.iml generated Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

58
.idea/codeStyles/Project.xml generated Normal file
View File

@ -0,0 +1,58 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<HTMLCodeStyleSettings>
<option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
<option name="HTML_ENFORCE_QUOTES" value="true" />
</HTMLCodeStyleSettings>
<JSCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
<option name="SPACES_WITHIN_IMPORTS" value="true" />
</JSCodeStyleSettings>
<TypeScriptCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
<option name="SPACES_WITHIN_IMPORTS" value="true" />
</TypeScriptCodeStyleSettings>
<VueCodeStyleSettings>
<option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
<option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
</VueCodeStyleSettings>
<codeStyleSettings language="HTML">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="TypeScript">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="Vue">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="Stylelint" enabled="true" level="ERROR" enabled_by_default="true" />
</profile>
</component>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Reactive-Resume.iml" filepath="$PROJECT_DIR$/.idea/Reactive-Resume.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
16

4
.prettierignore Normal file
View File

@ -0,0 +1,4 @@
.cache
package.json
package-lock.json
public

View File

@ -1,7 +1,5 @@
{
"printWidth": 100,
"trailingComma": "all",
"tabWidth": 2,
"semi": true,
"singleQuote": true
}
"singleQuote": true,
"trailingComma": "all"
}

13
.vscode/settings.json vendored
View File

@ -1,4 +1,11 @@
{
"i18n-ally.localesPaths": "src/i18n",
"i18n-ally.keystyle": "nested"
}
"files.associations": {
"*.js": "javascriptreact"
},
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"i18n-ally.localesPaths": ["src/i18n/locales"],
"i18n-ally.keystyle": "nested",
"css.validate": false
}

65
DEPLOYMENT.md Normal file
View File

@ -0,0 +1,65 @@
# Deployment
This is a guide on how to build the source from scratch, along with setting up Firebase and related cloud functions to be able to export PDFs just like the original deployment of [rxresu.me](http://rxresu.me/).
### Requirements
- A Firebase project
- Works on both Linux, macOS and Windows
- Requires Node.js & NPM installed on the machine
### Setting up Firebase
1. Create a new Firebase project by visiting [Firebase Console](https://console.firebase.google.com/) and clicking on `Add Project`
![Screenshot 2021-03-13 at 10 19 10 AM](https://user-images.githubusercontent.com/1134738/111019495-97a73800-83e5-11eb-9eb1-6da100d839ba.png)
2. Disable Google Analytics, or keep it enabled as per your requirements. Most people wouldn't need it.
![Screenshot 2021-03-13 at 10 19 23 AM](https://user-images.githubusercontent.com/1134738/111019521-bc9bab00-83e5-11eb-9365-e521577e7a90.png)
3. Wait until Project is created, then click on Continue
![Screenshot 2021-03-13 at 10 21 30 AM](https://user-images.githubusercontent.com/1134738/111019543-e5bc3b80-83e5-11eb-923f-fc4fb2c6d84f.png)
4. Navigate to Realtime Database, and click on `Create Database`
![Screenshot 2021-03-13 at 10 28 57 AM](https://user-images.githubusercontent.com/1134738/111019691-f02b0500-83e6-11eb-9112-c3123273d035.png)
5. Select any location that's nearby to you, and most importantly, create the database in `Test Mode` and click on Enable
![Screenshot 2021-03-13 at 10 30 01 AM](https://user-images.githubusercontent.com/1134738/111019724-16e93b80-83e7-11eb-9713-06a7adf0c5d4.png)
6. Go back to Project Overview and click on `Web` and skip through every other step by clicking `Next`.
![Screenshot 2021-03-13 at 10 27 34 AM](https://user-images.githubusercontent.com/1134738/111019839-b4446f80-83e7-11eb-9fe2-183b06f6f829.png)
7. Copy configuration variables of your project, or keep this page open as you will need it later
![ezgif com-gif-maker](https://user-images.githubusercontent.com/1134738/111019829-9d9e1880-83e7-11eb-8ccc-573db1039b10.gif)
### Cloning the Repository
1. Run this command on your machine's terminal or Command Prompt
```
git clone git@github.com:AmruthPillai/Reactive-Resume.git
```
<img width="550" alt="Screenshot 2021-03-13 at 10 38 16 AM" src="https://user-images.githubusercontent.com/1134738/111019919-3df43d00-83e8-11eb-8d6b-d9fe0cc74a3a.png">
2. Copy the file `.env.example` to `.env` and start editing the file
```
cp .env.example .env
```
<img width="317" alt="Screenshot 2021-03-13 at 10 50 21 AM" src="https://user-images.githubusercontent.com/1134738/111020166-ed7ddf00-83e9-11eb-9cbb-a8732243bbd5.png">
3. Copy configuration variables from last step to the .env file, it's fine to have `FIREBASE_MEASUREMENTID` empty if you had Google Analytics disabled.
<img width="696" alt="Screenshot 2021-03-13 at 10 51 53 AM" src="https://user-images.githubusercontent.com/1134738/111020217-3c2b7900-83ea-11eb-801d-d8719cf23608.png">
4. Run `npm install` on the terminal/command prompt
5. After that's done, run `npm run build` and allow some time for the process to build

View File

@ -1,39 +1,38 @@
## build image
FROM node:13.12.0-alpine as build
FROM node:alpine as builder
WORKDIR /app
## set working directory
WORKDIR /usr/src/app
RUN apk add --update --no-cache \
g++ \
yasm \
bash \
make \
automake \
autoconf \
libtool \
zlib-dev \
libpng-dev
## add `/usr/src/app/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH
RUN apk add --update --no-cache \
--repository http://dl-3.alpinelinux.org/alpine/edge/community \
--repository http://dl-3.alpinelinux.org/alpine/edge/main \
vips-dev
## install and cache app dependencies
COPY package.json /usr/src/app/package.json
COPY package*.json ./
RUN npm ci
## install git
RUN apk add --no-cache git
ARG FIREBASE_APIKEY
ARG FIREBASE_APPID
ARG FIREBASE_AUTHDOMAIN
ARG FIREBASE_DATABASEURL
ARG FIREBASE_MEASUREMENTID
ARG FIREBASE_MESSAGINGSENDERID
ARG FIREBASE_PROJECTID
ARG FIREBASE_STORAGEBUCKET
## install app dependencies
RUN npm install
## copy files
COPY . /usr/src/app
## build production app
COPY . ./
RUN npm run build
## production environment
FROM nginx:1.17.9-alpine
## copy build artifacts to nginx
COPY --from=build /usr/src/app/build /usr/share/nginx/html
## copy custom nginx config
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/nginx.conf /etc/nginx/conf.d
## export port 80
EXPOSE 80
## run nginx server
CMD ["nginx", "-g", "daemon off;"]
FROM nginx:alpine
RUN rm -rf /usr/share/nginx/html
COPY --from=builder /app/public/ /usr/share/nginx/html
COPY server.conf /etc/nginx/conf.d/default.conf

View File

@ -1,20 +0,0 @@
## base image
FROM node:13.12.0-alpine
## set working directory
WORKDIR /usr/src/app
## add `/usr/src/app/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH
## install and cache app dependencies
COPY package.json /usr/src/app/package.json
## install git
RUN apk add --no-cache git
## install app dependencies
RUN npm install
## start app
CMD ["npm", "start"]

View File

@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SOFTWARE.

View File

@ -1 +0,0 @@
web: bin/boot

141
README.md
View File

@ -1,15 +1,138 @@
<img src="https://i.imgur.com/4eps4gP.png" alt="Reactive Resume" width="256px" height="256px"/>
<img src="https://raw.githubusercontent.com/AmruthPillai/Reactive-Resume/develop/static/images/logo.png" width="256px" />
# Reactive Resume
## A free and open source resume builder.
[![Build & Deploy](https://github.com/AmruthPillai/Reactive-Resume/workflows/Build%20&%20Deploy/badge.svg)](https://github.com/AmruthPillai/Reactive-Resume/actions)
![Code Style](https://badgen.net/badge/code%20style/airbnb/ff5a5f?icon=airbnb)
[![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume)](https://hub.docker.com/r/amruthpillai/reactive-resume)
[![Localization](https://badges.crowdin.net/reactive-resume/localized.svg)](https://crowdin.com/project/reactive-resume)
[![Crowdin](https://badges.crowdin.net/reactive-resume/localized.svg)](https://crowdin.com/project/reactive-resume)
[![GitHub](https://img.shields.io/github/license/AmruthPillai/Reactive-Resume)](https://github.com/AmruthPillai/Reactive-Resume/blob/develop/LICENSE)
#### A Free and Open-Source Resume Builder That Respects Your Privacy
### [Go to App](https://rxresu.me/)
Welcome to the front page of **Reactive Resume**, a free and open-source Resume Builder web app that focuses on one thing, **Privacy**. And also few other important features such as minimalistic UI/UX, customizability, portability, regularly updated templates, etc. But the important thing is that, your personal data is yours alone.
### What is this app all about?
### [Go to App](https://rxresu.me/) | [Documentation](https://docs.rxresu.me/)
Reactive Resume is a free and open source resume builder thats built to make the mundane tasks of creating, updating and sharing your resume as easy as 1, 2, 3. With this app, you can create multiple resumes, share them with recruiters through a unique link and print as PDF, all for free, no advertisements, without losing the integrity and privacy of your data.
You have complete control over what goes into your resume, how it looks, what colors, what templates, even the layout in which sections placed. Want a dark mode resume? Its as easy as editing 3 values and youre done. You dont need to wait to see your changes either. Everything you type, everything you change, appears immediately on your resume and gets updated in real time.
### Features
- Manage multiple resumes with one account
- Sync your data across devices
- Sign in with Google, or sign in anonymously just to test the app
- Send your resume to others with a unique sharable link
- Choose from 6 vibrant templates and more coming soon
- Structure sections and change layouts the way you want to
- Rename sections according to your language/industry
- Mix and match colors to any degree, even a dark mode resume?
- Pick from a variety of crisp and clear fonts
- Easy to translate to your own language
- Import your existing [JSON Resume](https://jsonresume.org/) in one click
- No advertisements, no data sharing, no marketing emails
- **Everything is free, and theres no catch!**
### Screenshots
<img src="https://raw.githubusercontent.com/AmruthPillai/Reactive-Resume/develop/static/images/screenshots/screen-1.png" width="400px" />
&nbsp;
<img src="https://raw.githubusercontent.com/AmruthPillai/Reactive-Resume/develop/static/images/screenshots/screen-3.png" width="400px" />
&nbsp;
<img src="https://raw.githubusercontent.com/AmruthPillai/Reactive-Resume/develop/static/images/screenshots/screen-5.png" width="400px" />
### Translation
To translate the app, just fork the repository, go to `src/i18n/locales` and duplicate the `en.json` file to a new file `your-lang-code.json` and translate all of the strings inside. It's a simple process that would take just a few minutes, and by contributing, your name could also be added down below as a contributor.
For those of you familiar with the Crowdin Platform, you could do that too and just head to http://crowdin.com/project/reactive-resume/ to translate the app over there. They have a great interface that helps you navigate through various strings and manage translations.
##### Languages Currently Supported
- Arabic (عربى)
- Bengali (বাংলা)
- Czech (čeština)
- Chinese Simplified (简体中文)
- Danish (Dansk)
- Dutch (Nederlands)
- English (US)
- Finnish (Suomalainen)
- French (Français)
- German (Deutsch)
- Greek (Ελληνικά)
- Hebrew (עִברִית)
- Hindi (हिंदी)
- Indonesian (Bahasa Indonesia)
- Italian (Italiano)
- Japanese (日本人)
- Kannada (ಕನ್ನಡ)
- Lithuanian (Lietuvių)
- Norwegian (Norsk)
- Persian (Farsi)
- Polish (Polskie)
- Portuguese (Brazilian)
- Portuguese (Portugal)
- Romanian (Română)
- Russian (русский)
- Slovak (Slovenčina)
- Spanish (Español)
- Swedish (Svenska)
- Turkish (Türkçe)
- Ukrainian (Українська)
Thank you to all the amazing people who have contributed to Reactive Resume by translating it into their native language.
### Building from Source
Want to run your own instance of Reactive Resume? You are very much free to do so. The requirements to build from source are:
- NodeJS/NPM
- A Firebase Project
1. First, clone this project repository
```
git clone https://github.com/AmruthPillai/Reactive-Resume.git
cd Reactive-Resume
```
2. Run npm install to install dependencies for the project
```
npm install
```
3. Create a `.env` file and fill it with your Firebase credentials
You can get these by setting up a firebase web app [here](https://console.firebase.google.com/u/0/).
Also note that you'll need to set up a Realtime Database, _not_ a Firestore Database, to get the correct value for `FIREBASE_DATABASEURL`. Be sure to set it to test mode so you can read/write data. Just remember to either revert these or remove the database after your testing is completed.
```
FIREBASE_APIKEY=""
FIREBASE_APPID=""
FIREBASE_AUTHDOMAIN=""
FIREBASE_DATABASEURL=""
FIREBASE_MEASUREMENTID=""
FIREBASE_MESSAGINGSENDERID=""
FIREBASE_PROJECTID=""
FIREBASE_STORAGEBUCKET=""
```
4. Run `npm run start` to run the development server or `npm run build` to build the production app.
And that's it! 🎉
### Donation
I try to do what I can, but if you found the app helpful, or you're in a better position than the others who depend on this project for their first job, please consider donating as little as \$5 to help keep the project alive :)
#### https://www.buymeacoffee.com/AmruthPillai
![Please buy me a coffee](https://i.imgur.com/x7g6kvF.png)
### Appreciation
Thank you to everyone who made this project possible, including the many users who voiced their opinions, created issues and PRs to the original Reactive Resume project, and helped me along the way to make this a reality.
---
![The Great Gatsby](https://camo.githubusercontent.com/a615c7e1ef9a850f5427cdc153186763305bb853/68747470733a2f2f692e696d6775722e636f6d2f4472386a3569762e676966)
###### Made with Love by [Amruth Pillai](https://amruthpillai.com/)

12
SECURITY.md Normal file
View File

@ -0,0 +1,12 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 2.0.0 | :white_check_mark: |
| 1.0.0 | :x: |
## Reporting a Vulnerability
Use the [GitHub Issues](https://github.com/AmruthPillai/Reactive-Resume/issues) tab to report a vulnerability

View File

@ -0,0 +1,17 @@
import { delay } from '../../src/utils/index';
const ReachRouter = jest.requireActual('@reach/router');
const defaultDelayInMilliseconds = 100;
// eslint-disable-next-line no-unused-vars
const navigate = async (to, options) => {
await delay(defaultDelayInMilliseconds);
return Promise.resolve();
};
module.exports = {
...ReachRouter,
navigate: jest.fn(navigate),
};

View File

@ -0,0 +1,35 @@
import FirebaseStub, { AuthConstants } from '../../gatsby-plugin-firebase';
test('sets current user to anonymous user 1', async () => {
await FirebaseStub.auth().signInAnonymously();
const { currentUser } = FirebaseStub.auth();
expect(currentUser).toBeTruthy();
expect(currentUser.uid).toEqual(AuthConstants.anonymousUser1.uid);
});
test('calls onAuthStateChanged observer with anonymous user 1', async () => {
let user = null;
let error = null;
FirebaseStub.auth().onAuthStateChanged(
(_user) => {
user = _user;
},
(_error) => {
error = _error;
},
);
await FirebaseStub.auth().signInAnonymously();
expect(user).toBeTruthy();
expect(user.uid).toEqual(AuthConstants.anonymousUser1.uid);
expect(error).toBeNull();
});
test('returns anonymous user 1', async () => {
const user = await FirebaseStub.auth().signInAnonymously();
expect(user).toBeTruthy();
expect(user.uid).toEqual(AuthConstants.anonymousUser1.uid);
});

View File

@ -0,0 +1,54 @@
import FirebaseStub, { AuthConstants } from '../../gatsby-plugin-firebase';
describe('with Google auth provider', () => {
test('sets current user to Google user 3', async () => {
await FirebaseStub.auth().signInWithPopup(
new FirebaseStub.auth.GoogleAuthProvider(),
);
const { currentUser } = FirebaseStub.auth();
expect(currentUser).toBeTruthy();
expect(currentUser.uid).toEqual(AuthConstants.googleUser3.uid);
});
test('sets current user provider data', async () => {
const provider = new FirebaseStub.auth.GoogleAuthProvider();
await FirebaseStub.auth().signInWithPopup(provider);
const { currentUser } = FirebaseStub.auth();
expect(currentUser).toBeTruthy();
expect(currentUser.providerData).toBeTruthy();
expect(currentUser.providerData).toHaveLength(1);
expect(currentUser.providerData[0].providerId).toEqual(provider.providerId);
});
test('calls onAuthStateChanged observer with Google user 3', async () => {
let user = null;
let error = null;
FirebaseStub.auth().onAuthStateChanged(
(_user) => {
user = _user;
},
(_error) => {
error = _error;
},
);
await FirebaseStub.auth().signInWithPopup(
new FirebaseStub.auth.GoogleAuthProvider(),
);
expect(user).toBeTruthy();
expect(user.uid).toEqual(AuthConstants.googleUser3.uid);
expect(error).toBeNull();
});
test('returns Google user 3', async () => {
const user = await FirebaseStub.auth().signInWithPopup(
new FirebaseStub.auth.GoogleAuthProvider(),
);
expect(user).toBeTruthy();
expect(user.uid).toEqual(AuthConstants.googleUser3.uid);
});
});

View File

@ -0,0 +1,29 @@
import FirebaseStub from '../../gatsby-plugin-firebase';
test('sets current user to null', async () => {
await FirebaseStub.auth().signInAnonymously();
await FirebaseStub.auth().signOut();
const { currentUser } = FirebaseStub.auth();
expect(currentUser).toBeNull();
});
test('calls onAuthStateChanged observer with null', async () => {
let user = null;
let error = null;
FirebaseStub.auth().onAuthStateChanged(
(_user) => {
user = _user;
},
(_error) => {
error = _error;
},
);
await FirebaseStub.auth().signInAnonymously();
await FirebaseStub.auth().signOut();
expect(user).toBeNull();
expect(error).toBeNull();
});

View File

@ -0,0 +1,35 @@
import FirebaseStub from '../../gatsby-plugin-firebase';
test('reuses existing Auth instance', () => {
const auth1 = FirebaseStub.auth();
const auth2 = FirebaseStub.auth();
expect(auth1.uuid).toBeTruthy();
expect(auth2.uuid).toBeTruthy();
expect(auth1.uuid).toEqual(auth2.uuid);
});
test('onAuthStateChanged unsubscribe removes observer', () => {
const observer = () => {};
const unsubscribe = FirebaseStub.auth().onAuthStateChanged(observer);
expect(unsubscribe).toBeTruthy();
expect(
FirebaseStub.auth().onAuthStateChangedObservers.indexOf(observer),
).toBeGreaterThanOrEqual(0);
unsubscribe();
expect(
FirebaseStub.auth().onAuthStateChangedObservers.indexOf(observer),
).not.toBeGreaterThanOrEqual(0);
});
test('current user delete calls signOut', async () => {
const mockSignOut = jest.spyOn(FirebaseStub.auth(), 'signOut');
await FirebaseStub.auth().signInAnonymously();
const { currentUser } = FirebaseStub.auth();
await currentUser.delete();
expect(mockSignOut).toHaveBeenCalledTimes(1);
});

View File

@ -0,0 +1,53 @@
import { waitFor } from '@testing-library/react';
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('can filter resumes by user', async () => {
FirebaseStub.database().initializeData();
let snapshotValue = null;
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo(DatabaseConstants.user1.uid)
.on('value', (snapshot) => {
snapshotValue = snapshot.val();
});
await waitFor(() =>
snapshotValue ? Promise.resolve(true) : Promise.reject(),
);
expect(snapshotValue).not.toBeNull();
expect(Object.keys(snapshotValue)).toHaveLength(2);
Object.values(snapshotValue).forEach((resume) =>
expect(resume.user).toEqual(DatabaseConstants.user1.uid),
);
});
test('previously set query parameters are not kept when retrieving reference again', () => {
FirebaseStub.database().initializeData();
let reference = null;
reference = FirebaseStub.database().ref(DatabaseConstants.resumesPath);
expect(reference).toBeTruthy();
const { uuid } = reference;
expect(reference.orderByChildPath).toHaveLength(0);
expect(reference.equalToValue).toHaveLength(0);
reference = FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo('testuser1');
expect(reference).toBeTruthy();
expect(reference.uuid).toBe(uuid);
expect(reference.orderByChildPath).toBe('user');
expect(reference.equalToValue).toBe('testuser1');
reference = FirebaseStub.database().ref(DatabaseConstants.resumesPath);
expect(reference).toBeTruthy();
expect(reference.uuid).toBe(uuid);
expect(reference.orderByChildPath).toHaveLength(0);
expect(reference.equalToValue).toHaveLength(0);
});

View File

@ -0,0 +1,51 @@
import { waitFor } from '@testing-library/react';
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('removes event callbacks', async () => {
FirebaseStub.database().initializeData();
const userUid = DatabaseConstants.user1.uid;
let valueCallbackSnapshotValue = null;
const valueCallback = jest.fn((snapshot) => {
valueCallbackSnapshotValue = snapshot.val();
});
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo(userUid)
.on('value', valueCallback);
await waitFor(() => valueCallback.mock.calls[0][0]);
valueCallback.mockClear();
valueCallbackSnapshotValue = null;
let childRemovedCallbackSnapshotValue = null;
const childRemovedCallback = jest.fn((snapshot) => {
childRemovedCallbackSnapshotValue = snapshot.val();
});
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo(userUid)
.on('child_removed', childRemovedCallback);
const removedResume = (
await FirebaseStub.database()
.ref(
`${DatabaseConstants.resumesPath}/${DatabaseConstants.demoStateResume1Id}`,
)
.once('value')
).val();
expect(removedResume).toBeTruthy();
FirebaseStub.database().ref(DatabaseConstants.resumesPath).off();
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${removedResume.id}`)
.remove();
expect(childRemovedCallback.mock.calls).toHaveLength(0);
expect(childRemovedCallbackSnapshotValue).toBeNull();
expect(valueCallback.mock.calls).toHaveLength(0);
expect(valueCallbackSnapshotValue).toBeNull();
});

View File

@ -0,0 +1,45 @@
import { waitFor } from '@testing-library/react';
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('triggers event with true if on the connected reference path', async () => {
FirebaseStub.database().initializeData();
let snapshotValue = null;
FirebaseStub.database()
.ref(DatabaseConstants.connectedPath)
.on('value', (snapshot) => {
snapshotValue = snapshot.val();
});
await waitFor(() =>
snapshotValue ? Promise.resolve(true) : Promise.reject(),
);
expect(snapshotValue).not.toBeNull();
expect(snapshotValue).toBe(true);
});
test('triggers event with resumes if on the resumes reference path', async () => {
FirebaseStub.database().initializeData();
const resumesDataSnapshot = await FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.once('value');
const resumes = resumesDataSnapshot.val();
let snapshotValue = null;
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.on('value', (snapshot) => {
snapshotValue = snapshot.val();
});
await waitFor(() =>
snapshotValue ? Promise.resolve(true) : Promise.reject(),
);
expect(snapshotValue).not.toBeNull();
expect(snapshotValue).toEqual(resumes);
});

View File

@ -0,0 +1,59 @@
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('retrieves resume if it exists', async () => {
FirebaseStub.database().initializeData();
const resumeId = DatabaseConstants.demoStateResume1Id;
const resume = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.once('value')
).val();
expect(resume).toBeTruthy();
expect(resume.id).toEqual(resumeId);
});
test('retrieves null if resume does not exist', async () => {
FirebaseStub.database().initializeData();
const resumeId = 'invalidResumeId';
const resume = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.once('value')
).val();
expect(resume).toBeNull();
});
test('retrieves user if it exists', async () => {
FirebaseStub.database().initializeData();
const expectedUser = DatabaseConstants.user1;
const user = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.usersPath}/${expectedUser.uid}`)
.once('value')
).val();
expect(user).toBeTruthy();
expect(user).toEqual(expectedUser);
});
test('retrieves null if user does not exist', async () => {
FirebaseStub.database().initializeData();
const userId = 'invalidUserId';
const user = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.usersPath}/${userId}`)
.once('value')
).val();
expect(user).toBeNull();
});

View File

@ -0,0 +1,77 @@
import { waitFor } from '@testing-library/react';
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('deletes data', async () => {
FirebaseStub.database().initializeData();
const resumeId = DatabaseConstants.demoStateResume1Id;
const removedResume = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.once('value')
).val();
expect(removedResume).toBeTruthy();
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.remove();
const actualResume = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.once('value')
).val();
expect(actualResume).toBeNull();
});
test('triggers events', async () => {
FirebaseStub.database().initializeData();
const userUid = DatabaseConstants.user1.uid;
let valueCallbackSnapshotValue = null;
const valueCallback = jest.fn((snapshot) => {
valueCallbackSnapshotValue = snapshot.val();
});
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo(userUid)
.on('value', valueCallback);
await waitFor(() => valueCallback.mock.calls[0][0]);
valueCallback.mockClear();
valueCallbackSnapshotValue = null;
let childRemovedCallbackSnapshotValue = null;
const childRemovedCallback = jest.fn((snapshot) => {
childRemovedCallbackSnapshotValue = snapshot.val();
});
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo(userUid)
.on('child_removed', childRemovedCallback);
const removedResume = (
await FirebaseStub.database()
.ref(
`${DatabaseConstants.resumesPath}/${DatabaseConstants.demoStateResume1Id}`,
)
.once('value')
).val();
expect(removedResume).toBeTruthy();
expect(removedResume.user).toEqual(userUid);
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${removedResume.id}`)
.remove();
await waitFor(() => childRemovedCallback.mock.calls[0][0]);
expect(childRemovedCallback.mock.calls).toHaveLength(1);
expect(childRemovedCallbackSnapshotValue).toBeTruthy();
expect(childRemovedCallbackSnapshotValue).toEqual(removedResume);
await waitFor(() => valueCallback.mock.calls[0][0]);
expect(valueCallback.mock.calls).toHaveLength(1);
expect(valueCallbackSnapshotValue).toBeTruthy();
expect(removedResume.id in valueCallbackSnapshotValue).toBe(false);
});

View File

@ -0,0 +1,71 @@
import { waitFor } from '@testing-library/react';
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('inserts data', async () => {
FirebaseStub.database().initializeData();
const existingResume = (
await FirebaseStub.database()
.ref(
`${DatabaseConstants.resumesPath}/${DatabaseConstants.demoStateResume1Id}`,
)
.once('value')
).val();
expect(existingResume).toBeTruthy();
const newResume = JSON.parse(JSON.stringify(existingResume));
newResume.id = 'newre1';
newResume.name = `Test Resume ${newResume.id}`;
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${newResume.id}`)
.set(newResume);
const actualResume = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${newResume.id}`)
.once('value')
).val();
expect(actualResume).toBeTruthy();
expect(actualResume).toEqual(newResume);
});
test('triggers events', async () => {
FirebaseStub.database().initializeData();
let snapshotValue = null;
const callback = jest.fn((snapshot) => {
snapshotValue = snapshot.val();
});
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo(DatabaseConstants.user1.uid)
.on('value', callback);
await waitFor(() => callback.mock.calls[0][0]);
callback.mockClear();
snapshotValue = null;
const existingResume = (
await FirebaseStub.database()
.ref(
`${DatabaseConstants.resumesPath}/${DatabaseConstants.demoStateResume1Id}`,
)
.once('value')
).val();
expect(existingResume).toBeTruthy();
const newResume = JSON.parse(JSON.stringify(existingResume));
newResume.id = 'newre1';
newResume.name = `Test Resume ${newResume.id}`;
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${newResume.id}`)
.set(newResume);
await waitFor(() => callback.mock.calls[0][0]);
expect(callback.mock.calls).toHaveLength(1);
expect(snapshotValue).not.toBeNull();
expect(Object.keys(snapshotValue)).toHaveLength(3);
expect(snapshotValue[newResume.id]).toBeTruthy();
expect(snapshotValue[newResume.id]).toEqual(newResume);
});

View File

@ -0,0 +1,26 @@
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('reuses existing Reference instance', () => {
const ref1 = FirebaseStub.database().ref(
`${DatabaseConstants.resumesPath}/123`,
);
const ref2 = FirebaseStub.database().ref(
`${DatabaseConstants.resumesPath}/123`,
);
expect(ref1).toBeTruthy();
expect(ref2).toBeTruthy();
expect(ref1).toEqual(ref2);
});
test('leading slash in reference path is ignored', () => {
const path = `${DatabaseConstants.resumesPath}/123`;
const ref1 = FirebaseStub.database().ref(path);
expect(ref1).toBeTruthy();
expect(ref1.path).toEqual(path);
const ref2 = FirebaseStub.database().ref(`/${path}`);
expect(ref2).toBeTruthy();
expect(ref2).toEqual(ref1);
});

View File

@ -0,0 +1,86 @@
import { waitFor } from '@testing-library/react';
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('can spy on it', async () => {
FirebaseStub.database().initializeData();
const referencePath = `${DatabaseConstants.resumesPath}/123456`;
const functionSpy = jest.spyOn(
FirebaseStub.database().ref(referencePath),
'update',
);
const updateArgument = 'test value 123';
await FirebaseStub.database().ref(referencePath).update(updateArgument);
expect(functionSpy).toHaveBeenCalledTimes(1);
const functionCallArgument = functionSpy.mock.calls[0][0];
expect(functionCallArgument).toBeTruthy();
expect(functionCallArgument).toEqual(updateArgument);
});
test('updates data', async () => {
FirebaseStub.database().initializeData();
const resumeId = DatabaseConstants.demoStateResume1Id;
const existingResume = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.once('value')
).val();
expect(existingResume).toBeTruthy();
const resumeName = 'Test Resume renamed';
existingResume.name = resumeName;
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.update(existingResume);
const actualResume = (
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
.once('value')
).val();
expect(actualResume).toBeTruthy();
expect(existingResume).toEqual(actualResume);
expect(actualResume.name).toEqual(resumeName);
});
test('triggers events', async () => {
FirebaseStub.database().initializeData();
let snapshotValue = null;
const callback = jest.fn((snapshot) => {
snapshotValue = snapshot.val();
});
FirebaseStub.database()
.ref(DatabaseConstants.resumesPath)
.orderByChild('user')
.equalTo(DatabaseConstants.user1.uid)
.on('value', callback);
await waitFor(() => callback.mock.calls[0][0]);
callback.mockClear();
snapshotValue = null;
const existingResume = (
await FirebaseStub.database()
.ref(
`${DatabaseConstants.resumesPath}/${DatabaseConstants.demoStateResume1Id}`,
)
.once('value')
).val();
expect(existingResume).toBeTruthy();
existingResume.name = 'Test Resume renamed';
await FirebaseStub.database()
.ref(`${DatabaseConstants.resumesPath}/${existingResume.id}`)
.update(existingResume);
await waitFor(() => callback.mock.calls[0][0]);
expect(callback.mock.calls).toHaveLength(1);
expect(snapshotValue).not.toBeNull();
expect(Object.keys(snapshotValue)).toHaveLength(2);
expect(snapshotValue[existingResume.id]).toBeTruthy();
expect(snapshotValue[existingResume.id]).toEqual(existingResume);
});

View File

@ -0,0 +1,67 @@
import FirebaseStub, { DatabaseConstants } from '../../gatsby-plugin-firebase';
test('reuses existing Database instance', () => {
const database1 = FirebaseStub.database();
const database2 = FirebaseStub.database();
expect(database1.uuid).toBeTruthy();
expect(database2.uuid).toBeTruthy();
expect(database1.uuid).toEqual(database2.uuid);
});
test('ServerValue.TIMESTAMP returns current time in milliseconds', () => {
const now = new Date().getTime();
const timestamp = FirebaseStub.database.ServerValue.TIMESTAMP;
expect(timestamp).toBeTruthy();
expect(timestamp).toBeGreaterThanOrEqual(now);
});
test('initializing data sets up resumes and users', async () => {
FirebaseStub.database().initializeData();
const resumesRef = FirebaseStub.database().ref(DatabaseConstants.resumesPath);
const resumesDataSnapshot = await resumesRef.once('value');
const resumes = resumesDataSnapshot.val();
expect(resumes).toBeTruthy();
expect(Object.keys(resumes)).toHaveLength(5);
const demoStateResume1 = resumes[DatabaseConstants.demoStateResume1Id];
expect(demoStateResume1).toBeTruthy();
expect(demoStateResume1.id).toEqual(DatabaseConstants.demoStateResume1Id);
expect(demoStateResume1.user).toEqual(DatabaseConstants.user1.uid);
const demoStateResume2 = resumes[DatabaseConstants.demoStateResume2Id];
expect(demoStateResume2).toBeTruthy();
expect(demoStateResume2.id).toEqual(DatabaseConstants.demoStateResume2Id);
expect(demoStateResume2.user).toEqual(DatabaseConstants.user2.uid);
const initialStateResume1 = resumes[DatabaseConstants.initialStateResume1Id];
expect(initialStateResume1).toBeTruthy();
expect(initialStateResume1.id).toEqual(
DatabaseConstants.initialStateResume1Id,
);
expect(initialStateResume1.user).toEqual(DatabaseConstants.user1.uid);
const demoStateResume3 = resumes[DatabaseConstants.demoStateResume3Id];
expect(demoStateResume3).toBeTruthy();
expect(demoStateResume3.id).toEqual(DatabaseConstants.demoStateResume3Id);
expect(demoStateResume3.user).toEqual(DatabaseConstants.user3.uid);
const initialStateResume2 = resumes[DatabaseConstants.initialStateResume2Id];
expect(initialStateResume2).toBeTruthy();
expect(initialStateResume2.id).toEqual(
DatabaseConstants.initialStateResume2Id,
);
expect(initialStateResume2.user).toEqual(DatabaseConstants.user3.uid);
const usersRef = FirebaseStub.database().ref(DatabaseConstants.usersPath);
const usersDataSnapshot = await usersRef.once('value');
const users = usersDataSnapshot.val();
expect(users).toBeTruthy();
expect(Object.keys(users)).toHaveLength(3);
const anonymousUser1 = users[DatabaseConstants.user1.uid];
expect(anonymousUser1).toBeTruthy();
expect(anonymousUser1).toEqual(DatabaseConstants.user1);
const anonymousUser2 = users[DatabaseConstants.user2.uid];
expect(anonymousUser2).toBeTruthy();
expect(anonymousUser2).toEqual(DatabaseConstants.user2);
const googleUser3 = users[DatabaseConstants.user3.uid];
expect(googleUser3).toBeTruthy();
expect(googleUser3).toEqual(DatabaseConstants.user3);
});

View File

@ -0,0 +1,19 @@
import FirebaseStub from '../../gatsby-plugin-firebase';
test('reuses existing Functions instance', () => {
const functions1 = FirebaseStub.functions();
const functions2 = FirebaseStub.functions();
expect(functions1.uuid).toBeTruthy();
expect(functions2.uuid).toBeTruthy();
expect(functions1.uuid).toEqual(functions2.uuid);
});
test('deleteUser function returns true', async () => {
const deleteUser = FirebaseStub.functions().httpsCallable('deleteUser');
const result = await deleteUser();
expect(result).toBeTruthy();
expect(result.data).toEqual(true);
});

2
__mocks__/file-mock.js Normal file
View File

@ -0,0 +1,2 @@
const mockFile = 'test-file-stub';
export default mockFile;

View File

@ -0,0 +1,33 @@
import Auth from './gatsby-plugin-firebase/auth/auth';
import AuthConstants from './gatsby-plugin-firebase/constants/auth';
import Database from './gatsby-plugin-firebase/database/database';
import DatabaseConstants from './gatsby-plugin-firebase/constants/database';
import Functions from './gatsby-plugin-firebase/functions/functions';
import FunctionsConstants from './gatsby-plugin-firebase/constants/functions';
import GoogleAuthProvider from './gatsby-plugin-firebase/auth/googleAuthProvider';
class FirebaseStub {
static auth() {
return Auth.instance;
}
static database() {
return Database.instance;
}
static functions() {
return Functions.instance;
}
}
FirebaseStub.auth.GoogleAuthProvider = GoogleAuthProvider;
FirebaseStub.database.ServerValue = {};
Object.defineProperty(FirebaseStub.database.ServerValue, 'TIMESTAMP', {
get() {
return new Date().getTime();
},
});
export default FirebaseStub;
export { AuthConstants, DatabaseConstants, FunctionsConstants };

View File

@ -0,0 +1,125 @@
/* eslint-disable no-underscore-dangle */
import { v4 as uuidv4 } from 'uuid';
import { delay } from '../../../src/utils/index';
import AuthProvider from './authProvider';
import Constants from '../constants/auth';
import GoogleAuthProvider from './googleAuthProvider';
import User from './user';
const singleton = Symbol('');
const singletonEnforcer = Symbol('');
class Auth {
constructor(enforcer) {
if (enforcer !== singletonEnforcer) {
throw new Error('Cannot construct singleton');
}
this._uuid = uuidv4();
this._currentUser = null;
this._onAuthStateChangedObservers = [];
}
static get instance() {
if (!this[singleton]) {
this[singleton] = new Auth(singletonEnforcer);
}
return this[singleton];
}
get currentUser() {
return this._currentUser;
}
get uuid() {
return this._uuid;
}
get onAuthStateChangedObservers() {
return this._onAuthStateChangedObservers;
}
onAuthStateChanged(observer) {
this.onAuthStateChangedObservers.push(observer);
return () => {
this._onAuthStateChangedObservers =
this.onAuthStateChangedObservers.filter((obs) => obs !== observer);
};
}
async signInAnonymously() {
const user = Constants.anonymousUser1;
this._currentUser = new User(
user.displayName,
user.email,
user.providerId,
user.uid,
user.isAnonymous,
this.signOut.bind(this),
);
await delay(Constants.defaultDelayInMilliseconds);
this.onAuthStateChangedObservers.forEach((observer) =>
observer(this._currentUser),
);
return this._currentUser;
}
/**
* Authenticates with popup.
*
* @param {AuthProvider} provider The provider to authenticate.
*/
async signInWithPopup(provider) {
if (!provider) {
throw new Error('provider must be provided.');
} else if (!(provider instanceof AuthProvider)) {
throw new Error('provider should be an AuthProvider.');
}
if (!(provider instanceof GoogleAuthProvider)) {
throw new Error(
`${provider.constructor.name} is currently not supported.`,
);
}
const user = Constants.googleUser3;
this._currentUser = new User(
user.displayName,
user.email,
user.providerId,
user.uid,
user.isAnonymous,
this.signOut.bind(this),
);
await delay(Constants.defaultDelayInMilliseconds);
this.onAuthStateChangedObservers.forEach((observer) =>
observer(this._currentUser),
);
return this._currentUser;
}
async signOut() {
if (this._currentUser === null) {
return;
}
this._currentUser = null;
await delay(Constants.defaultDelayInMilliseconds);
this.onAuthStateChangedObservers.forEach((observer) => observer(null));
}
}
export default Auth;

View File

@ -0,0 +1,23 @@
/* eslint-disable no-underscore-dangle */
class AuthProvider {
/**
* Creates a new auth provider.
*
* @param {string} providerId Provider ID.
*/
constructor(providerId) {
if (!providerId) {
throw new Error('providerId must be provided.');
} else if (typeof providerId !== 'string') {
throw new Error('providerId should be a string.');
} else {
this._providerId = providerId;
}
}
get providerId() {
return this._providerId;
}
}
export default AuthProvider;

View File

@ -0,0 +1,10 @@
import AuthProvider from './authProvider';
import Constants from '../constants/auth';
class GoogleAuthProvider extends AuthProvider {
constructor() {
super(Constants.googleAuthProviderId);
}
}
export default GoogleAuthProvider;

View File

@ -0,0 +1,67 @@
/* eslint-disable no-underscore-dangle */
import Constants from '../constants/auth';
// eslint-disable-next-line no-unused-vars
import AuthProvider from './authProvider';
import UserInfo from './userInfo';
import { delay } from '../../../src/utils/index';
class User extends UserInfo {
/**
* Creates a new user.
*
* @param {string|null} displayName Display name.
* @param {string|null} email Email.
* @param {string} providerId Auth provider ID.
* @param {string} uid The user's unique ID.
* @param {boolean} isAnonymous Is anonymous.
* @param {function():Promise<void>} deleteUser Delete user callback.
*/
constructor(displayName, email, providerId, uid, isAnonymous, deleteUser) {
super(displayName, email, providerId, uid);
if (!deleteUser) {
throw new Error('deleteUser must be provided.');
} else if (typeof deleteUser !== 'function') {
throw new Error('deleteUser should be a function.');
} else {
this._deleteUser = deleteUser;
}
this._isAnonymous = isAnonymous;
this._providerData = [];
if (!isAnonymous) {
this._providerData.push(
new UserInfo(displayName, email, providerId, uid),
);
}
}
get isAnonymous() {
return this._isAnonymous;
}
get providerData() {
return this._providerData;
}
async delete() {
await delay(Constants.defaultDelayInMilliseconds);
await this._deleteUser();
}
/**
* Reauthenticates the user with popup.
*
* @param {AuthProvider} provider The provider to authenticate.
*/
// eslint-disable-next-line no-unused-vars
async reauthenticateWithPopup(provider) {
await delay(Constants.defaultDelayInMilliseconds);
return this;
}
}
export default User;

View File

@ -0,0 +1,47 @@
/* eslint-disable no-underscore-dangle */
class UserInfo {
/**
* Creates a new user profile information.
*
* @param {string|null} displayName Display name.
* @param {string|null} email Email.
* @param {string} providerId Auth provider ID.
* @param {string} uid The user's unique ID.
*/
constructor(displayName, email, providerId, uid) {
if (!uid) {
throw new Error('uid must be provided.');
} else if (typeof uid !== 'string') {
throw new Error('uid should be a string.');
} else {
this._uid = uid;
}
if (typeof providerId !== 'string') {
throw new Error('providerId should be a string.');
} else {
this._providerId = providerId;
}
this._displayName = displayName;
this._email = email;
}
get displayName() {
return this._displayName;
}
get email() {
return this._email;
}
get providerId() {
return this._providerId;
}
get uid() {
return this._uid;
}
}
export default UserInfo;

View File

@ -0,0 +1,51 @@
const googleAuthProviderId = 'google.com';
const anonymousUser1 = {
displayName: 'Anonymous User 1',
email: 'anonymous1@noemail.com',
isAnonymous: true,
providerId: '',
uid: 'anonym1',
};
const anonymousUser2 = {
displayName: 'Anonymous User 2',
email: 'anonymous2@noemail.com',
isAnonymous: true,
providerId: '',
uid: 'anonym2',
};
const googleUser3 = {
displayName: 'Google User 3',
email: 'google3@noemail.com',
isAnonymous: false,
providerId: googleAuthProviderId,
uid: 'google3',
};
const defaultDelayInMilliseconds = 100;
class Auth {
static get googleAuthProviderId() {
return googleAuthProviderId;
}
static get anonymousUser1() {
return anonymousUser1;
}
static get anonymousUser2() {
return anonymousUser2;
}
static get googleUser3() {
return googleUser3;
}
static get defaultDelayInMilliseconds() {
return defaultDelayInMilliseconds;
}
}
export default Auth;

View File

@ -0,0 +1,89 @@
import AuthConstants from './auth';
const valueEventType = 'value';
const childRemovedEventType = 'child_removed';
const resumesPath = 'resumes';
const usersPath = 'users';
const connectedPath = '.info/connected';
const demoStateResume1Id = 'demo_1';
const demoStateResume2Id = 'demo_2';
const demoStateResume3Id = 'demo_3';
const initialStateResume1Id = 'init_1';
const initialStateResume2Id = 'init_2';
const user1 = {
uid: AuthConstants.anonymousUser1.uid,
isAnonymous: AuthConstants.anonymousUser1.isAnonymous,
};
const user2 = {
uid: AuthConstants.anonymousUser2.uid,
isAnonymous: AuthConstants.anonymousUser2.isAnonymous,
};
const user3 = {
uid: AuthConstants.googleUser3.uid,
isAnonymous: AuthConstants.googleUser3.isAnonymous,
};
const defaultDelayInMilliseconds = 100;
class Database {
static get valueEventType() {
return valueEventType;
}
static get childRemovedEventType() {
return childRemovedEventType;
}
static get resumesPath() {
return resumesPath;
}
static get usersPath() {
return usersPath;
}
static get connectedPath() {
return connectedPath;
}
static get demoStateResume1Id() {
return demoStateResume1Id;
}
static get demoStateResume2Id() {
return demoStateResume2Id;
}
static get demoStateResume3Id() {
return demoStateResume3Id;
}
static get initialStateResume1Id() {
return initialStateResume1Id;
}
static get initialStateResume2Id() {
return initialStateResume2Id;
}
static get user1() {
return user1;
}
static get user2() {
return user2;
}
static get user3() {
return user3;
}
static get defaultDelayInMilliseconds() {
return defaultDelayInMilliseconds;
}
}
export default Database;

View File

@ -0,0 +1,15 @@
const deleteUserFunctionName = 'deleteUser';
const defaultDelayInMilliseconds = 100;
class Functions {
static get deleteUserFunctionName() {
return deleteUserFunctionName;
}
static get defaultDelayInMilliseconds() {
return defaultDelayInMilliseconds;
}
}
export default Functions;

View File

@ -0,0 +1,24 @@
/* eslint-disable no-underscore-dangle */
class DataSnapshot {
constructor(getData, value = undefined) {
if (!getData) {
throw new Error('getData must be provided.');
} else if (typeof getData !== 'function') {
throw new Error('getData should be a function.');
}
this._getData = getData;
this._value = value;
}
get value() {
return this._value;
}
val() {
return typeof this.value !== 'undefined' ? this.value : this._getData();
}
}
export default DataSnapshot;

View File

@ -0,0 +1,170 @@
/* eslint-disable no-underscore-dangle */
import { v4 as uuidv4 } from 'uuid';
import fs from 'fs';
import path from 'path';
import DatabaseConstants from '../constants/database';
import Reference from './reference';
const singleton = Symbol('');
const singletonEnforcer = Symbol('');
const readFile = (fileRelativePath) => {
const fileAbsolutePath = path.resolve(__dirname, fileRelativePath);
const fileBuffer = fs.readFileSync(fileAbsolutePath);
const fileData = JSON.parse(fileBuffer);
return fileData;
};
class Database {
constructor(enforcer) {
if (enforcer !== singletonEnforcer) {
throw new Error('Cannot construct singleton');
}
this._uuid = uuidv4();
this._data = {};
this._references = {};
}
static get instance() {
if (!this[singleton]) {
this[singleton] = new Database(singletonEnforcer);
}
return this[singleton];
}
get uuid() {
return this._uuid;
}
_getData(dataPath) {
if (!dataPath) {
throw new Error('dataPath must be provided.');
}
const dataPathElements = dataPath.split('/');
if (!(dataPathElements[0] in this._data)) {
return null;
}
if (dataPathElements.length === 1) {
return this._data[dataPathElements[0]];
}
if (dataPathElements.length === 2) {
if (!(dataPathElements[1] in this._data[dataPathElements[0]])) {
return null;
}
return this._data[dataPathElements[0]][dataPathElements[1]];
}
return null;
}
_getReference(referencePath) {
return referencePath in this._references
? this._references[referencePath]
: null;
}
_setData(dataPath, value) {
if (!dataPath) {
throw new Error('dataPath must be provided.');
}
if (typeof value === 'undefined') {
throw new Error('value is undefined.');
}
const dataPathElements = dataPath.split('/');
if (dataPathElements.length !== 2) {
return;
}
if (!(dataPathElements[0] in this._data)) {
return;
}
if (!dataPathElements[1]) {
return;
}
if (value === null) {
delete this._data[dataPathElements[0]][dataPathElements[1]];
} else {
this._data[dataPathElements[0]][dataPathElements[1]] = value;
}
}
initializeData() {
const resumes = {};
const date = new Date('December 15, 2020 11:20:25');
const demoStateResume1 = readFile('../../../src/data/demoState.json');
demoStateResume1.updatedAt = date.valueOf();
date.setMonth(date.getMonth() - 2);
demoStateResume1.createdAt = date.valueOf();
demoStateResume1.user = DatabaseConstants.user1.uid;
resumes[DatabaseConstants.demoStateResume1Id] = demoStateResume1;
const demoStateResume2 = JSON.parse(JSON.stringify(demoStateResume1));
demoStateResume2.user = DatabaseConstants.user2.uid;
resumes[DatabaseConstants.demoStateResume2Id] = demoStateResume2;
const initialStateResume1 = readFile('../../../src/data/initialState.json');
initialStateResume1.updatedAt = date.valueOf();
initialStateResume1.createdAt = date.valueOf();
initialStateResume1.user = DatabaseConstants.user1.uid;
resumes[DatabaseConstants.initialStateResume1Id] = initialStateResume1;
const demoStateResume3 = readFile('../../../src/data/demoState.json');
demoStateResume3.updatedAt = date.valueOf();
date.setMonth(date.getMonth() - 2);
demoStateResume3.createdAt = date.valueOf();
demoStateResume3.user = DatabaseConstants.user3.uid;
resumes[DatabaseConstants.demoStateResume3Id] = demoStateResume3;
const initialStateResume2 = readFile('../../../src/data/initialState.json');
initialStateResume2.updatedAt = date.valueOf();
initialStateResume2.createdAt = date.valueOf();
initialStateResume2.user = DatabaseConstants.user3.uid;
resumes[DatabaseConstants.initialStateResume2Id] = initialStateResume2;
Object.keys(resumes).forEach((key) => {
const resume = resumes[key];
resume.id = key;
resume.name = `Test Resume ${key}`;
});
this._data[DatabaseConstants.resumesPath] = resumes;
const users = {};
users[DatabaseConstants.user1.uid] = DatabaseConstants.user1;
users[DatabaseConstants.user2.uid] = DatabaseConstants.user2;
users[DatabaseConstants.user3.uid] = DatabaseConstants.user3;
this._data[DatabaseConstants.usersPath] = users;
}
ref(referencePath) {
const newRef = new Reference(
referencePath,
(dataPath) => this._getData(dataPath),
(dataPath, value) => this._setData(dataPath, value),
(refPath) => this._getReference(refPath),
);
const existingRef = this._getReference(newRef.path);
if (existingRef) {
existingRef.initializeQueryParameters();
return existingRef;
}
this._references[newRef.path] = newRef;
return newRef;
}
}
export default Database;

View File

@ -0,0 +1,215 @@
/* eslint-disable no-underscore-dangle */
import { v4 as uuidv4 } from 'uuid';
import { delay } from '../../../src/utils/index';
import DataSnapshot from './dataSnapshot';
import DatabaseConstants from '../constants/database';
const parsePath = (path) => {
if (!path) {
throw new Error('path must be provided.');
} else if (typeof path !== 'string') {
throw new Error('path should be a string.');
} else {
let parsedPath = path.trim();
if (parsedPath[0] === '/') {
parsedPath = parsedPath.substring(1);
}
return parsedPath;
}
};
class Reference {
constructor(path, getDatabaseData, setDatabaseData, getReference) {
this._path = parsePath(path);
this._uuid = uuidv4();
if (this.path === DatabaseConstants.connectedPath) {
this._dataSnapshot = new DataSnapshot(() => {}, true);
} else {
this._dataSnapshot = new DataSnapshot(() => this._getData());
}
if (!getDatabaseData) {
throw new Error('getDatabaseData must be provided.');
} else if (typeof getDatabaseData !== 'function') {
throw new Error('getDatabaseData should be a function.');
}
this._getDatabaseData = getDatabaseData;
if (!setDatabaseData) {
throw new Error('setDatabaseData must be provided.');
} else if (typeof getDatabaseData !== 'function') {
throw new Error('setDatabaseData should be a function.');
}
this._setDatabaseData = setDatabaseData;
if (!getReference) {
throw new Error('getReference must be provided.');
} else if (typeof getDatabaseData !== 'function') {
throw new Error('getReference should be a function.');
}
this._getReference = getReference;
this._eventCallbacks = {};
this.initializeQueryParameters();
}
get path() {
return this._path;
}
get uuid() {
return this._uuid;
}
get eventCallbacks() {
return this._eventCallbacks;
}
get orderByChildPath() {
return this._orderByChildPath;
}
get equalToValue() {
return this._equalToValue;
}
_getData() {
const databaseData = this._getDatabaseData(this.path);
if (!databaseData) {
return null;
}
if (this.orderByChildPath && this.equalToValue) {
return Object.fromEntries(
Object.entries(databaseData).filter(
([, value]) => value[this.orderByChildPath] === this.equalToValue,
),
);
}
return databaseData;
}
_getParent() {
const pathElements = this.path.split('/');
let parent = null;
if (pathElements.length === 2) {
parent = this._getReference(pathElements[0]);
}
return parent;
}
_handleDataUpdate(value) {
if (typeof value === 'undefined') {
throw new Error('value must be provided.');
}
const currentData = this._getData();
const parentReference = this._getParent();
this._setDatabaseData(this.path, value);
if (value === null) {
if (parentReference) {
parentReference.triggerEventCallback(
DatabaseConstants.childRemovedEventType,
currentData,
);
}
} else {
this.triggerEventCallback(DatabaseConstants.valueEventType);
}
if (parentReference) {
parentReference.triggerEventCallback(DatabaseConstants.valueEventType);
}
}
triggerEventCallback(eventType, snapshotValue = undefined) {
if (!(eventType in this.eventCallbacks)) {
return;
}
const snapshot =
this.path === DatabaseConstants.connectedPath
? this._dataSnapshot
: new DataSnapshot(() => this._getData(), snapshotValue);
this.eventCallbacks[eventType](snapshot);
}
equalTo(value) {
this._equalToValue = value;
return this;
}
initializeQueryParameters() {
this._orderByChildPath = '';
this._equalToValue = '';
}
off() {
this._eventCallbacks = {};
}
on(eventType, callback) {
this.eventCallbacks[eventType] = callback;
if (eventType === DatabaseConstants.valueEventType) {
setTimeout(() => {
this.triggerEventCallback(eventType);
}, DatabaseConstants.defaultDelayInMilliseconds);
}
return callback;
}
async once(eventType) {
if (!eventType) {
throw new Error('eventType must be provided.');
} else if (typeof eventType !== 'string') {
throw new Error('eventType should be a string.');
}
await delay(DatabaseConstants.defaultDelayInMilliseconds);
return this._dataSnapshot;
}
orderByChild(path) {
this._orderByChildPath = path;
return this;
}
async update(value) {
await delay(DatabaseConstants.defaultDelayInMilliseconds);
this._handleDataUpdate(value);
}
async remove() {
await delay(DatabaseConstants.defaultDelayInMilliseconds);
this._handleDataUpdate(null);
}
async set(value) {
await delay(DatabaseConstants.defaultDelayInMilliseconds);
this._handleDataUpdate(value);
}
}
export default Reference;

View File

@ -0,0 +1,53 @@
/* eslint-disable no-underscore-dangle */
import { v4 as uuidv4 } from 'uuid';
import FunctionsConstants from '../constants/functions';
import HttpsCallableResult from './httpsCallableResult';
import { delay } from '../../../src/utils/index';
const singleton = Symbol('');
const singletonEnforcer = Symbol('');
const deleteUser = async () => {
await delay(FunctionsConstants.defaultDelayInMilliseconds);
return new HttpsCallableResult(true);
};
class Functions {
constructor(enforcer) {
if (enforcer !== singletonEnforcer) {
throw new Error('Cannot construct singleton');
}
this._uuid = uuidv4();
this._httpsCallables = {};
this._httpsCallables[FunctionsConstants.deleteUserFunctionName] =
deleteUser;
}
static get instance() {
if (!this[singleton]) {
this[singleton] = new Functions(singletonEnforcer);
}
return this[singleton];
}
get uuid() {
return this._uuid;
}
httpsCallable(name) {
if (!name) {
throw new Error('name must be provided.');
} else if (typeof name !== 'string') {
throw new Error('name should be a string.');
}
return this._httpsCallables[name];
}
}
export default Functions;

View File

@ -0,0 +1,19 @@
/* eslint-disable no-underscore-dangle */
import { v4 as uuidv4 } from 'uuid';
class HttpsCallableResult {
constructor(data) {
this._uuid = uuidv4();
this._data = data;
}
get data() {
return this._data;
}
get uuid() {
return this._uuid;
}
}
export default HttpsCallableResult;

71
__mocks__/gatsby.js Normal file
View File

@ -0,0 +1,71 @@
import React from 'react';
import { delay } from '../src/utils/index';
const Gatsby = jest.requireActual('gatsby');
const imageData = {
images: {
fallback: {
src: `image_src.jpg`,
srcSet: `image_src_set.jpg 1x`,
},
},
layout: `fixed`,
width: 1,
height: 2,
};
const childImageSharp = { gatsbyImageData: imageData };
const useStaticQuery = () => ({
site: {
siteMetadata: {
title: 'Test title',
description: 'Test description',
author: 'Test author',
siteUrl: 'https://testsiteurl/',
},
},
file: {
childImageSharp,
},
onyx: {
childImageSharp,
},
pikachu: {
childImageSharp,
},
gengar: {
childImageSharp,
},
castform: {
childImageSharp,
},
glalie: {
childImageSharp,
},
celebi: {
childImageSharp,
},
});
const defaultDelayInMilliseconds = 100;
const navigate = async () => {
await delay(defaultDelayInMilliseconds);
return Promise.resolve();
};
module.exports = {
...Gatsby,
graphql: jest.fn(),
Link: jest.fn().mockImplementation(({ to, ...rest }) =>
React.createElement('a', {
...rest,
href: to,
}),
),
navigate: jest.fn(navigate),
useStaticQuery,
};

View File

@ -1,13 +0,0 @@
{
"name": "Reactive Resume",
"description": "A one-of-a-kind resume builder that's not out to get your data. Completely secure, customizable, portable, open-source and free forever.",
"website": "https://rxresu.me/",
"repository": "https://github.com/AmruthPillai/Reactive-Resume",
"logo": "https://i.imgur.com/ugpElge.png",
"buildpacks": [
{
"url": "mars/create-react-app"
}
],
"keywords": ["react", "resume", "static"]
}

View File

@ -1,3 +1,3 @@
files:
- source: /src/i18n/locales/en/**/*.json
translation: /src/i18n/locales/%two_letters_code%/**/%original_file_name%
- source: /src/i18n/locales/en.json
translation: /src/i18n/locales/%two_letters_code%.json

19
database.rules.json Normal file
View File

@ -0,0 +1,19 @@
{
"rules": {
"resumes": {
".indexOn": "user",
".read": "auth !== null && query.orderByChild === 'user' && query.equalTo === auth.uid",
"$rid": {
".read": "data.child('public').val() === true || data.child('user').val() === auth.uid",
".write": " !data.exists() || data.child('user').val() === auth.uid || (!newData.exists() && data.child('user').val() === auth.uid)"
}
},
"users": {
".indexOn": "isAnonymous",
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}

View File

@ -1,19 +0,0 @@
version: '3.7'
services:
reactive-resume:
container_name: reactive-resume
tty: true
build:
context: .
dockerfile: Dockerfile-dev
volumes:
- '.:/usr/src/app'
- '/usr/src/app/node_modules'
expose:
- '3001'
ports:
- '3001:3000'
environment:
- NODE_ENV=development
- CHOKIDAR_USEPOLLING=true

View File

@ -1,12 +0,0 @@
version: '3.7'
services:
reactive-resume:
container_name: reactive-resume
build:
context: .
dockerfile: Dockerfile
expose:
- '80'
ports:
- '80:80'

View File

@ -1,41 +0,0 @@
<template>
<div class="contributors">
<div v-for="i in items">
<a :href="i.html_url" target="_blank" rel="noopener noreferrer">
<img :src="i.avatar_url" />
</a>
</div>
</div>
</template>
<script>
const axios = require('axios');
const repo = 'AmruthPillai/Reactive-Resume';
export default {
data() {
return {
items: [],
};
},
beforeMount() {
axios
.get(`https://api.github.com/repos/${repo}/contributors`)
.then(response => {
this.$data.items = response.data;
})
.catch(error => {
console.log(error);
});
},
};
</script>
<style>
.contributors {
margin-top: 20px;
display: grid;
grid-template-columns: repeat(10, minmax(0, 1fr));
gap: 1rem;
}
</style>

View File

@ -1,33 +0,0 @@
module.exports = {
title: 'Reactive Resume',
description:
"A one-of-a-kind resume builder that's not out to get your data. Completely secure, customizable, portable, open-source and free forever.",
themeConfig: {
logo: '/logo.png',
repo: 'AmruthPillai/Reactive-Resume',
nav: [
{ text: 'Home', link: '/' },
{ text: 'Go to App', link: 'https://rxresu.me/' },
],
sidebar: [
'/',
'/features/',
'/templates/',
'/technology/',
'/contributing/',
'/translation/',
'/building-from-source/',
'/deployment/',
'/changelog/',
],
smoothScroll: true,
},
plugins: [
[
'@vuepress/google-analytics',
{
ga: 'UA-161860275-1',
},
],
],
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,29 +0,0 @@
---
title: Home
---
<img src="./images/logo.png" width="256px">
# Reactive Resume
#### A Free and Open-Source Resume Builder That Respects Your Privacy
![Build & Deploy](https://github.com/AmruthPillai/Reactive-Resume/workflows/Build%20&%20Deploy/badge.svg)
![Code Style](https://badgen.net/badge/code%20style/airbnb/ff5a5f?icon=airbnb)
![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume)
![Localization](https://badges.crowdin.net/reactive-resume/localized.svg)
![GitHub](https://img.shields.io/github/license/AmruthPillai/Reactive-Resume)
Welcome to the front page of **Reactive Resume**, a free and open-source Resume Builder web app that focuses on one thing, **Privacy**. And also few other important features such as minimalistic UI/UX, customizability, portability, regularly updated templates, etc. But the important thing is that, your personal data is yours alone.
We're going to use this coveted space to discuss about the features of the application, new changes that were introduced since the release and also other information like how to keep the project running through donations and open-source code contribution.
Let's begin, shall we?
## Links of Interest
- [Web App ](https://rxresu.me/)
- [GitHub Repository ](https://github.com/AmruthPillai/Reactive-Resume)
- [Open Collective ](https://opencollective.com/reactive-resume)
- [Product Hunt ](https://www.producthunt.com/posts/reactive-resume)
- [Hacker News ](https://news.ycombinator.com/item?id=22709183)

View File

@ -1,86 +0,0 @@
---
title: Building from Source
---
# Building from Source
So, you would like to run the project on your local machine, or your own network server? You've come to the right place. It takes about 5-6 minutes to get the project running on your local, and this is how:
## Building the App
### 1. Install Node.js & NPM
You might have already setup Node.js on your system before, but in case you haven't, this is where you can download and install the required applications from: [nodejs.org ](https://nodejs.org/en/)
Verify whether you are able to run `node` and `npm` commands on your command line:
```
> node -v
v13.11.0
> npm -v
6.14.4
```
### 2. Clone the Repository
Download the repository as an archive from GitHub, or clone the repository from the command line depending on whether you require the latest updates or not.
```
wget https://github.com/AmruthPillai/Reactive-Resume/archive/master.zip
```
<p style="text-align: center">
<strong>OR</strong>
</p>
```
git clone https://github.com/AmruthPillai/Reactive-Resume.git
cd Reactive-Resume
```
### 3. Install Project Dependencies
Install the dependencies required for the project to run. For a bird's eye view of all the dependencies it would install, you can check `package.json`.
```
npm install
```
### 4. Start the Development Server
You can run the project locally to check if everything is working alright, through this command:
```
npm start
```
### 5. Build Production App
This will produce a production version of the app and return a folder `build` which contains static files ready to be uploaded on the web. For more info on how to deploy, go to the Deployment page.
```
npm build
```
## Building the Documentation
### 1. Follow Steps 1 - 3 from [Building the App](#building-the-app)
The initial steps to build and install the documentation server is similar to how you would build the app, as both of them reside in a monorepo.
### 2. Start the Development Server
You can edit the documentation and run it locally using this command:
```
npm run docs:dev
```
### 3. Build Static Documentation
This will produce static files under the folder `docs/.vuepress/dist`. This folder can be uploaded anywhere such as Shared Hosting/Firebase/Netlify/Cloud etc.
```
npm run docs:build
```

View File

@ -1,154 +0,0 @@
---
title: Changelog
---
# Changelog
All notable changes to this project will be documented in this file.
## June 2020
- Added Language: Russian
## May 2020
### May 6, 2020
- Fix Demo Data not including Hobbies section
- Updated translations for all languages
- Added Language: Hebrew
- Added Language: Italian
## April 2020
### April 28, 2020
- Added Feature to Reorder Skills/Hobbies
- Added Hobbies Section to Left Sidebar
- Updated Templates to Add Hobbies
### April 23, 2020
- Fix Issue with Page Controller Icon Size
- Fix Issue with Checkbox Icon Toggle
### April 23, 2020
- Transfer all external resources to local, self-host everything
- Shorten entry animation by a second
- Optimize Images through `imgbot`
### April 22, 2020
- Display Original Language Name alongside English Language Name
- Added Language: Tamil
- Added Language: Vietnamese
### April 17, 2020
- Updated Dependencies across App
- Added Language: Arabic
### April 16, 2020
- Brought Back Browser Print Method, you can now print parseable resumes
- Modified Templates to use ID as Key in items, instead of names
- Added Language: Polish
### April 11, 2020
- Added Language: Danish
- Added Language: Dutch
- Added Language: Portuguese
### April 10, 2020
- Bugfix: Photo not visible in PDF export, Celebi
### April 8, 2020
- Added Language: Spanish
### April 6, 2020
- Designed Celebi Template
### April 5, 2020
- Added Print Dialog to set Quality & Print Type before Exporting PDF
- Added Pan-Zoom Animation to indicate the artboard is interactive
### April 3, 2020
- Added Language: German
### April 2, 2020
- Fix type in Contributing section of Documentation
- Fix issue where PDF was printing in A4, instead print whole page
- Fix Castform Templates not updating when Skills Heading is updated
### April 1, 2020
- Designed Glalie Template
- Added Page Controller for Quick Actions
- Implemented `react-easy-panzoom` for Pan & Zoom abilities in the artboard
- Added Language: Chinese
## March 2020
### March 31, 2020
- Migrated to PDF Generation using `html2canvas` & `jsPDF`
- Added Language: French
- Added Language: Kannada
### March 30, 2020
- Dockerize App for Faster Development/Deployments
- Added Translation Systems
- Added Language: Hindi
### March 29, 2020
- Add Issue Templates in GitHub for Bug Reports and Feature Requests
- Revised Documentation in VuePress
- Add Google Analytics to VuePress Documentation
- Implement "Deploy to Netlify" button, by [hwang381](https://github.com/hwang381)
### March 28, 2020
- Add About Tab in the Right Sidebar
- JSON Migration Bugfix, by [Panzki](https://github.com/Panzki)
- Designed Castform Template
### March 27, 2020
- Add Google Site Verification Tag
- Fix bug with Gengar Template not respecting enable values
- Add Language & References Section to Resumes
- Update Onyx, Pikachu & Gengar Templates
- Add Nunito Font, removed few other fonts
- Add Entry Animation using [animate.css](https://daneden.github.io/animate.css/)
- Fix Awkward Page Breaks in Resume when Printing
- Make Links Clickable in the Resume PDF
### March 26, 2020
- Fix bug in Pikachu Template where photo was not visible
- Add option to enter any font family stored locally on system
- Allow printing of more than one page
- Add Markdown Support to Descriptions
- Designed Gengar Template
### March 25, 2020
- Released App to Public through Firebase Hosting
- Add Firebase Analytics
- Add Progressive Web App Caching
- Designed Pikachu Template
### March 24, 2020
- Initiating Development of App
- Designed Onyx Template

View File

@ -1,43 +0,0 @@
---
title: Contributing
---
# Contributing
I've tried to make the project as simple and accessible to everyone: developers, translators and users alike. The project grows in quality and features through your feedback and support, so please do reach out to me whenever you have a new feature request, or when you find a bug, and we as a team will get it squashed as soon as possible.
**Here are a few ways you can contribute to the project:**
## Donate/Sponsor
This is an open that's open to most. Even the smallest donation can help the project thrive and keep the website running. I didn't think I would ever reach my Firebase Hosting limits until I released this project, and it makes me both worried and happy.
If you would like to support the development and uptime of the project, you can donate through Open Collective, which is a recognized non-profit organization that funnels in donations only to those who are verified. For example, every time you donate, I get the money only after I show an invoice related to the project expense. So you have complete transparency in where your money is going.
[Donate on Open Collective ](https://opencollective.com/reactive-resume)
## Find & Report Bugs
This is quite possible the easiest of the options, other than donating. All you have to do is keep using the app and if you run into any trouble, just let me know by raising an issue on GitHub. The progress of fixing that bug can be tracked from there.
[Raise an Issue on GitHub ](https://github.com/AmruthPillai/Reactive-Resume/issues/new/choose)
## Request New Features
Something that's missing on the app that's halting your progress from making the best version of your resume? Let us know and we'll try and implement that for you. GitHub's Issue Tracking System is pretty flexible when it comes to things like these, so all you need to do to suggest a new feature is raise an issue on GitHub with the Feature Request template.
[Raise an Issue on GitHub ](https://github.com/AmruthPillai/Reactive-Resume/issues/new/choose)
## Translation
Translating the app into your language has never been easier. Thanks to [Crowdin](https://crowdin.com/), a localization management tool, anyone can translate strings without having to mess around with a bunch of files. For information on how to translate the app into your own language, please visit the [Translation Secion](/translation/) of the documentation.
## Commit Code
If you are a developer, and a ReactJS developer at that, then you're in demand! Take a look at the code and see how you can make it better, cause I definitely would have made a lot of mistakes. You can setup test cases or extract a particular section of code into a function to improve code reuse. All you need to do is fork the repository on GitHub, make your changes and submit a Pull Request for the same and we'll review it.
[GitHub Repository ](https://github.com/AmruthPillai/Reactive-Resume)
## GitHub Contributors
<GitHubContributors />

View File

@ -1,57 +0,0 @@
---
title: Deployment
---
# Deployment
You've built the source code successfully and now you're on your way to deploying the app. There are some methods setup to deploy a version of the app without even having to build the source, so we'll run through all the steps here:
## Docker
If you are a fan of Docker as I am, you'd be happy to know that the app can be set up and running within seconds thanks to having set up both environments of Docker.
If you would like to run the **development server** through Docker, which also supports hot-reloads, just run:
```
npm run docker:dev
OR
docker-compose -f docker-compose-dev.yml up -d --build
```
If you would like to run the **production version of the app**, powered by NGINX, just run:
```
npm run docker
OR
docker-compose up -d --build
```
You can also alternatively pull the image from [Docker Hub](https://hub.docker.com/r/amruthpillai/reactive-resume) where the latest image is always built from source control.
```
docker pull amruthpillai/reactive-resume
```
## Deploying to Heroku
Heroku is a cloud platform that lets companies build, deliver, monitor and scale apps — we're the fastest way to go from idea to URL, bypassing all those infrastructure headaches.
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/AmruthPillai/Reactive-Resume)
## Deploying to Netlify
Used by more than 800,000 web developers and businesses, the Netlify platform provides modern build workflows, serverless functions and a global Application Delivery Network to deliver the most performant, secure and scalable websites and applications.
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/AmruthPillai/Reactive-Resume)
## Deploy to Synology NAS
**NAS Hosted** has written a great tutorial on how to deploy the app on Synology NAS,
read more about it here: [Host your own Resume Builder on Synology using Docker](https://nashosted.com/host-your-own-resume-builder-on-synology-using-docker/)
## Deploy to Shared Hosting/VPS
Here, you're kinda on your own as there are no one-click buttons to help you through, but it's a simple process. Once you've built the app, you can copy the contents of the `build` folder to your `public_html` folder and you will have the app running on your designated domain or IP address.
Here is a great tutorial on how to set up a web server on your machine by DigitalOcean:
[How To Install Nginx on Ubuntu 18.04 ](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04)

View File

@ -1,59 +0,0 @@
---
title: Features
---
# Features
I've tried to maintain some core principles to the app that will always remain unchanged, just to set a fixed direction in which development and ideas can move forward.
<p style="text-align: center">
<iframe width="100%" height="420" src="https://www.youtube.com/embed/4OM0LEPzDO8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</p>
## Secure
![](./images/4.png)
It is entirely secure, as in, your information never leaves the browser, powered by web technologies (HTML5 Local Storage API) that allow for data to be stored locally and quickly.
## Offline
![](./images/7.png)
The app is a PWA and also has no connection to any servers, thus keeping it entirely offline. It survives refreshes, disconnections, and can also be exported or imported through JSON.
## Customizable
![](./images/9.png)
Choose your fonts, play with the colors, pick any layout by merely enabling/disabling sections. A simple and easy to use interface that helps you get a resume in no time!
## Templates
![](./images/8.png)
I've been continuously designing new templates and will be releasing new ones as I have the time. Please support development by using the app and leaving a like/comment or sharing it with your peers.
## Portable
![](./images/2.png)
Your information can be exported to JSON and imported back into the application from anywhere, all you need is your JSON file. This feature makes it easy to update your resume, upload your file (or have it preloaded from local storage), edit the resume and download it again or print it as PDF.
## Minimalistic Design
![](./images/1.png)
As a designer, I felt I had to put this over the top of all other features. Built with minimalism and minimal interaction in mind, it looks clean, is simple to use, and I only hope to make the process more streamlined through your inputs and feedback.
## Progressive Web App
![](./images/4.png)
The web app is responsive, which means you can edit your resume on your phone as well and even install it as an app if you're on Android/Chrome. The app is quick to load and would also work if your internet is disconnected.
## Free and Open-Source
![](./images/7.png)
As with all my projects, I made the app only to help others, so it will always remain free, and I would not be monetizing on it at any point. But if you do feel generous, [I'm open to donations](https://opencollective.com/reactive-resume).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

View File

@ -1,69 +0,0 @@
---
title: Technology
---
# Technology
A credit to all the projects and open source packages that have helped during the building of this project. Truly, without these projects, Reactive Resume wouldn't exist.
## ReactJS + Hooks 🎉
React makes it painless to create interactive UIs. Design simple views for each state in your application, and React will efficiently update and render just the right components when your data changes.
Hooks solve a wide variety of seemingly unconnected problems in React that weve encountered over five years of writing and maintaining tens of thousands of components. Whether youre learning React, use it daily, or even prefer a different library with a similar component model, you might recognize some of these problems.
[Learn more &rarr; ](https://reactjs.org/)
## Tailwind CSS
Tailwind CSS is a highly customizable, low-level CSS framework that gives you all of the building blocks you need to build bespoke designs without any annoying opinionated styles you have to fight to override.
[Learn more &rarr; ](https://tailwindcss.com/)
## Lodash
A modern JavaScript utility library delivering modularity, performance & extras. Lodash makes JavaScript easier by taking the hassle out of working with arrays, numbers, objects, strings, etc.
[Learn more &rarr; ](https://lodash.com/)
## html2canvas
The script allows you to take "screenshots" of webpages or parts of it, directly on the users browser. The screenshot is based on the DOM and as such may not be 100% accurate to the real representation as it does not make an actual screenshot, but builds the screenshot based on the information available on the page.
[Learn more &rarr; ](https://github.com/niklasvh/html2canvas)
## jsPDF
A library to generate PDFs in JavaScript.
[Learn more &rarr; ](https://github.com/MrRio/jsPDF)
## Google Fonts
Google Fonts is a great repository of open type fonts that are allowed to be used on the web. Reactive Resume uses Google Fonts to load different font families and allow the user to choose which font he/she would like on their resume.
[Learn more &rarr; ](https://fonts.google.com/)
## Material Icons
Material icons are delightful, beautifully crafted symbols for common actions and items. Download on desktop to use them in your digital products for Android, iOS, and web.
[Learn more &rarr; ](https://material.io/resources/icons/)
## PostCSS
PostCSS is a tool for transforming styles with JS plugins. These plugins can lint your CSS, support variables and mixins, transpile future CSS syntax, inline images, and more.
[Learn more &rarr; ](https://postcss.org/)
## PurgeCSS
PurgeCSS analyzes your content and your css files. Then it matches the selectors used in your files with the one in your content files. It removes unused selectors from your css, resulting in smaller css files.
[Learn more &rarr; ](https://github.com/FullHuman/purgecss)
## VuePress
VuePress is what made this documentation possible, with it's clean design and quick setup as well as the ability to use markdown to generate content, VuePress seemed like the best way to set up a cleaner documentation.
[Learn more &rarr; ](https://vuepress.vuejs.org/)

View File

@ -1,33 +0,0 @@
---
title: Templates
---
# Templates
<div style="display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem;
">
<div>
<h2 id="onyx"><a href="#onyx" class="header-anchor">#</a> Onyx</h2>
<img src="./images/Onyx.png" />
</div>
<div>
<h2 id="pikachu"><a href="#pikachu" class="header-anchor">#</a> Pikachu</h2>
<img src="./images/Pikachu.png" />
</div>
<div>
<h2 id="gengar"><a href="#gengar" class="header-anchor">#</a> Gengar</h2>
<img src="./images/Gengar.png" />
</div>
<div>
<h2 id="castform"><a href="#castform" class="header-anchor">#</a> Castform</h2>
<img src="./images/Castform.png" />
</div>
<div>
<h2 id="glalie"><a href="#glalie" class="header-anchor">#</a> Glalie</h2>
<img src="./images/Glalie.png" />
</div>
<div>
<h2 id="celebi"><a href="#celebi" class="header-anchor">#</a> Celebi</h2>
<img src="./images/Celebi.png" />
</div>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 KiB

View File

@ -1,133 +0,0 @@
---
title: Translation
---
# Translation
Translating the app into your own language has never been easier. The project makes use of a powerful online tool called [Crowdin](https://crowdin.com/) to help manage translations and updates made to the app.
::: tip TL;DR
If you are already familiar with the Crowdin platform and want to contribute your time to translating a few strings, just head to the link below and get started!
### **[translate.rxresu.me](https://translate.rxresu.me/)**
:::
## Current Status
### Completed Translations
- Arabic `ar`
- Chinese Simplified `zh`
- Danish `da`
- Dutch `nl`
- English `en`
- French `fr`
- German `de`
- Hebrew `he`
- Hindi `hi`
- Italian `it`
- Kannada `kn`
- Polish `pl`
- Portuguese `pt`
- Russian `ru`
- Spanish `es`
- Tamil `ta`
- Vietnamese `vi`
### Pending Translations
- Afrikaans `af`
- Assamese `as`
- Catalan `ca`
- Czech `cs`
- Finnish `fi`
- Greek `el`
- Hebrew `he`
- Hungarian `hu`
- Japanese `ja`
- Korean `ko`
- Malayalam `ml`
- Marathi `mr`
- Norwegian `no`
- Punjabi `pa`
- Romanian `ro`
- Swedish `sv`
- Turkish `tr`
- Ukrainian `uk`
::: warning
If your language is not available in the list above, send me an email at <a href="mailto:im.amruth@gmail.com">im.amruth@gmail.com</a> with your request or raise an issue on GitHub and I'll add it on the Crowdin Platform.
:::
## Translating through Crowdin
### Step 1: Choose your Language
<p style="text-align: center">
<img src="./images/language-options.png" alt="Choose your Language" width="50%" />
</p>
As mentioned above, all you need to do is go to the [Translation Portal ](https://translate.rxresu.me/) of Reactive Resume and select the language you want to begin translating to.
### Step 2: Click on `Translate All`
The PR would be accepted and merged only when the translations are 100% complete, which you can track through Crowdin.
<p style="text-align: center">
<img src="./images/translate-all.png" alt="Translate All" width="40%" />
</p>
### Step 3: Create an Account with Crowdin
You can use your email address and password, or for a quick getaway, use one of the many social providers to login quickly and get started.
### Step 4.1: List of Strings to be Translated
On the left sidebar, you can see a list of strings that are ready to be translated. The red box means it's not translated yet, and a green box means it has been translated to the target language.
<p style="text-align: center">
<img src="./images/list-of-strings.png" alt="List of Strings to be Translated" width="40%" />
</p>
### Step 4.2: Enter the Translation using the Editor
You can enter the translated string in the editor below. It is powerul enough to suggest you whether you have made any mistakes in the formatting of the string as well, and autocorrect them. Once you are done with the translation, click on the `Save` button.
::: tip
To make the process faster, you may also use Keyboard Shortcuts such as `Cmd/Ctrl + S`.
:::
<p style="text-align: center">
<img src="./images/translation-editor.png" alt="Enter the Translation using the Editor" width="80%" />
</p>
### Step 4.3: Make Use of the Translation Suggestions
Crowdin is extremely powerful with NLP capabilities to understand your language and translate it automatically through numerous training provided through Open Source development. This will make your job much easier when translating from one language to another.
<p style="text-align: center">
<img src="./images/translation-helper.png" alt="Make Use of the Translation Suggestions" width="80%" />
</p>
### Step 5: That's All Folks!
Once you have translated all the strings, the integration between Crowdin and GitHub would kick in and start replacing the updated strings in the repo. I would get a notification around the same time to merge the PR, and once that's done you can use the app in your own language and share it with others in your community!
## Translating through GitHub
For those who don't want to go through the process of creating an account with Crowdin and be continuous contributors to the project's translation, you can also perform a one-off translation by editing the JSON files through GitHub. Here's how:
### Step 1: Choose your Language
Go to the `src/i18n/locales` folder in the master branch of the repository and choose the language of your choice. Alternatively, you can [click this link](https://github.com/AmruthPillai/Reactive-Resume/tree/master/src/i18n/locales) to go the specific folder in GitHub.
Be careful as the folder only contains ISO-639-1 Two Letter Language Codes, so refer the [list above](#current-status) to find the corresponding language folder.
### Step 2: Fork the Repository, Edit the `.json` Files
By clicking on the Edit button in any of the files, it immediately creates a fork of the repository where you can edit the files at once. You may also choose to clone the forked repository locally and translate the strings using your favorite editor, then create a Pull Request for the changes.
---
While this is a bit more time consuming because of the structure of files that has been set up, for those who know what they are doing and want to get translating quickly without any help, this is the quickest method. But for those who would like to stay in constant touch with the project and provide translations for future updates to come, the Crowdin path is recommended.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Some files were not shown because too many files have changed in this diff Show More