Display blog post

This commit is contained in:
MD. Ariful Alam 2021-08-24 12:07:09 +06:00
parent 154d1ebf99
commit 3b48d147d1
7 changed files with 405 additions and 124 deletions

342
package-lock.json generated
View File

@ -12,6 +12,7 @@
"@testing-library/jest-dom": "^5.11.4", "@testing-library/jest-dom": "^5.11.4",
"@testing-library/react": "^11.1.0", "@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10", "@testing-library/user-event": "^12.1.10",
"article-api": "^1.0.5",
"axios": "^0.21.1", "axios": "^0.21.1",
"daisyui": "^1.12.1", "daisyui": "^1.12.1",
"moment": "^2.29.1", "moment": "^2.29.1",
@ -19,7 +20,6 @@
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-icons": "^4.2.0", "react-icons": "^4.2.0",
"react-lazyload": "^3.2.0",
"react-redux": "^7.2.4", "react-redux": "^7.2.4",
"react-scripts": "4.0.3", "react-scripts": "4.0.3",
"sass": "^1.38.0", "sass": "^1.38.0",
@ -1238,11 +1238,14 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.12.18", "version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.18.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==", "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.13.4" "regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
} }
}, },
"node_modules/@babel/runtime-corejs3": { "node_modules/@babel/runtime-corejs3": {
@ -2210,17 +2213,6 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/@testing-library/dom/node_modules/@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@testing-library/jest-dom": { "node_modules/@testing-library/jest-dom": {
"version": "5.14.1", "version": "5.14.1",
"resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz",
@ -2242,17 +2234,6 @@
"yarn": ">=1" "yarn": ">=1"
} }
}, },
"node_modules/@testing-library/jest-dom/node_modules/@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@testing-library/jest-dom/node_modules/chalk": { "node_modules/@testing-library/jest-dom/node_modules/chalk": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
@ -2281,17 +2262,6 @@
"react-dom": "*" "react-dom": "*"
} }
}, },
"node_modules/@testing-library/react/node_modules/@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@testing-library/user-event": { "node_modules/@testing-library/user-event": {
"version": "12.8.3", "version": "12.8.3",
"resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz",
@ -2307,17 +2277,6 @@
"@testing-library/dom": ">=7.21.4" "@testing-library/dom": ">=7.21.4"
} }
}, },
"node_modules/@testing-library/user-event/node_modules/@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@types/anymatch": { "node_modules/@types/anymatch": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
@ -3468,6 +3427,15 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/article-api": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/article-api/-/article-api-1.0.5.tgz",
"integrity": "sha512-96bPduc0VL4IeQsl3WW/q25X8Rq24qYKlqa98JhKQA3BesP6BE2+yf8M1XWZvfUC2/xMGaVPFdGrE67wuEKAbQ==",
"dependencies": {
"axios": "^0.21.1",
"string-strip-html": "^8.3.0"
}
},
"node_modules/asap": { "node_modules/asap": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@ -10965,6 +10933,16 @@
"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
"integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
}, },
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
},
"node_modules/lodash.memoize": { "node_modules/lodash.memoize": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@ -10998,11 +10976,21 @@
"integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=",
"dev": true "dev": true
}, },
"node_modules/lodash.trim": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz",
"integrity": "sha1-NkJefukL5KpeJ7zruFt9EepHqlc="
},
"node_modules/lodash.uniq": { "node_modules/lodash.uniq": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
}, },
"node_modules/lodash.without": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz",
"integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw="
},
"node_modules/loglevel": { "node_modules/loglevel": {
"version": "1.7.1", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
@ -14148,6 +14136,44 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/ranges-apply": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ranges-apply/-/ranges-apply-5.1.0.tgz",
"integrity": "sha512-VF3a0XUuYS/BQHv2RaIyX1K7S1hbfrs64hkGKgPVk0Y7p4XFwSucjTTttrBqmkcmB/PZx5ISTZdxErRZi/89aQ==",
"dependencies": {
"@babel/runtime": "^7.14.0",
"ranges-merge": "^7.1.0"
}
},
"node_modules/ranges-merge": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/ranges-merge/-/ranges-merge-7.1.0.tgz",
"integrity": "sha512-coTHcyAEIhoEdsBs9f5f+q0rmy7UHvS/5nfuXzuj5oLX/l/tbqM5uxRb6eh8WMdetXia3lK67ZO4tarH4ieulQ==",
"dependencies": {
"@babel/runtime": "^7.14.0",
"ranges-push": "^5.1.0",
"ranges-sort": "^4.1.0"
}
},
"node_modules/ranges-push": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ranges-push/-/ranges-push-5.1.0.tgz",
"integrity": "sha512-vqGcaGq7GWV1zBa9w83E+dzYkOvE9/3pIRUPvLf12c+mGQCf1nesrkBI7Ob8taN2CC9V1HDSJx0KAQl0SgZftA==",
"dependencies": {
"@babel/runtime": "^7.14.0",
"ranges-merge": "^7.1.0",
"string-collapse-leading-whitespace": "^5.1.0",
"string-trim-spaces-only": "^3.1.0"
}
},
"node_modules/ranges-sort": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ranges-sort/-/ranges-sort-4.1.0.tgz",
"integrity": "sha512-GOQgk6UtsrfKFeYa53YLiBVnLINwYmOk5l2QZG1csZpT6GdImUwooh+/cRrp7b+fYawZX/rnyA3Ul+pdgQBIzA==",
"dependencies": {
"@babel/runtime": "^7.14.0"
}
},
"node_modules/raw-body": { "node_modules/raw-body": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
@ -14354,15 +14380,6 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz",
"integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="
}, },
"node_modules/react-lazyload": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/react-lazyload/-/react-lazyload-3.2.0.tgz",
"integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==",
"peerDependencies": {
"react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
"react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
}
},
"node_modules/react-redux": { "node_modules/react-redux": {
"version": "7.2.4", "version": "7.2.4",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz",
@ -16582,6 +16599,24 @@
"safe-buffer": "~5.2.0" "safe-buffer": "~5.2.0"
} }
}, },
"node_modules/string-collapse-leading-whitespace": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-5.1.0.tgz",
"integrity": "sha512-mYz9/Kb5uvRB4DZj46zILwI4y9lD9JsvXG9Xb7zjbwm0I/R40G7oFfMsqJ28l2d7gWMTLJL569NfJQVLQbnHCw==",
"dependencies": {
"@babel/runtime": "^7.14.0"
}
},
"node_modules/string-left-right": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/string-left-right/-/string-left-right-4.1.0.tgz",
"integrity": "sha512-ic/WvfNVUygWWsgg8akzSzp2NuttfhrdbH7QmSnda5b5RFmT9aCEDiS/M+gmTJwtFy7+b/2AXU4Z6vejcePQqQ==",
"dependencies": {
"@babel/runtime": "^7.14.0",
"lodash.clonedeep": "^4.5.0",
"lodash.isplainobject": "^4.0.6"
}
},
"node_modules/string-length": { "node_modules/string-length": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
@ -16599,6 +16634,34 @@
"resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
"integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw=="
}, },
"node_modules/string-strip-html": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/string-strip-html/-/string-strip-html-8.3.0.tgz",
"integrity": "sha512-1+rjTPt0JjpFr1w0bfNL1S6O0I9fJDqM+P3pFTpC6eEEpIXhmBvPLnaQoEuWarswiH219qCefDSxTLxGQyHKUg==",
"dependencies": {
"@babel/runtime": "^7.14.0",
"html-entities": "^2.3.2",
"lodash.isplainobject": "^4.0.6",
"lodash.trim": "^4.5.1",
"lodash.without": "^4.4.0",
"ranges-apply": "^5.1.0",
"ranges-push": "^5.1.0",
"string-left-right": "^4.1.0"
}
},
"node_modules/string-strip-html/node_modules/html-entities": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
"integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ=="
},
"node_modules/string-trim-spaces-only": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-trim-spaces-only/-/string-trim-spaces-only-3.1.0.tgz",
"integrity": "sha512-AW7RSi3+QtE6wR+4m/kmwlyy39neBbCIzrzzu1/RGzNRiPKQOeB3rGzr4ubg4UIQgYtr2w0PrxhKPXgyqJ0vaQ==",
"dependencies": {
"@babel/runtime": "^7.14.0"
}
},
"node_modules/string-width": { "node_modules/string-width": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
@ -20369,9 +20432,9 @@
} }
}, },
"@babel/runtime": { "@babel/runtime": {
"version": "7.12.18", "version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.18.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==", "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"requires": { "requires": {
"regenerator-runtime": "^0.13.4" "regenerator-runtime": "^0.13.4"
} }
@ -21060,16 +21123,6 @@
"dom-accessibility-api": "^0.5.6", "dom-accessibility-api": "^0.5.6",
"lz-string": "^1.4.4", "lz-string": "^1.4.4",
"pretty-format": "^26.6.2" "pretty-format": "^26.6.2"
},
"dependencies": {
"@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
} }
}, },
"@testing-library/jest-dom": { "@testing-library/jest-dom": {
@ -21088,14 +21141,6 @@
"redent": "^3.0.0" "redent": "^3.0.0"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
},
"chalk": { "chalk": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
@ -21114,16 +21159,6 @@
"requires": { "requires": {
"@babel/runtime": "^7.12.5", "@babel/runtime": "^7.12.5",
"@testing-library/dom": "^7.28.1" "@testing-library/dom": "^7.28.1"
},
"dependencies": {
"@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
} }
}, },
"@testing-library/user-event": { "@testing-library/user-event": {
@ -21132,16 +21167,6 @@
"integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==",
"requires": { "requires": {
"@babel/runtime": "^7.12.5" "@babel/runtime": "^7.12.5"
},
"dependencies": {
"@babel/runtime": {
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
} }
}, },
"@types/anymatch": { "@types/anymatch": {
@ -22073,6 +22098,15 @@
"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
}, },
"article-api": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/article-api/-/article-api-1.0.5.tgz",
"integrity": "sha512-96bPduc0VL4IeQsl3WW/q25X8Rq24qYKlqa98JhKQA3BesP6BE2+yf8M1XWZvfUC2/xMGaVPFdGrE67wuEKAbQ==",
"requires": {
"axios": "^0.21.1",
"string-strip-html": "^8.3.0"
}
},
"asap": { "asap": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@ -27979,6 +28013,16 @@
"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
"integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
}, },
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
},
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
},
"lodash.memoize": { "lodash.memoize": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@ -28012,11 +28056,21 @@
"integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=",
"dev": true "dev": true
}, },
"lodash.trim": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz",
"integrity": "sha1-NkJefukL5KpeJ7zruFt9EepHqlc="
},
"lodash.uniq": { "lodash.uniq": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
}, },
"lodash.without": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz",
"integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw="
},
"loglevel": { "loglevel": {
"version": "1.7.1", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
@ -30469,6 +30523,44 @@
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
}, },
"ranges-apply": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ranges-apply/-/ranges-apply-5.1.0.tgz",
"integrity": "sha512-VF3a0XUuYS/BQHv2RaIyX1K7S1hbfrs64hkGKgPVk0Y7p4XFwSucjTTttrBqmkcmB/PZx5ISTZdxErRZi/89aQ==",
"requires": {
"@babel/runtime": "^7.14.0",
"ranges-merge": "^7.1.0"
}
},
"ranges-merge": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/ranges-merge/-/ranges-merge-7.1.0.tgz",
"integrity": "sha512-coTHcyAEIhoEdsBs9f5f+q0rmy7UHvS/5nfuXzuj5oLX/l/tbqM5uxRb6eh8WMdetXia3lK67ZO4tarH4ieulQ==",
"requires": {
"@babel/runtime": "^7.14.0",
"ranges-push": "^5.1.0",
"ranges-sort": "^4.1.0"
}
},
"ranges-push": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ranges-push/-/ranges-push-5.1.0.tgz",
"integrity": "sha512-vqGcaGq7GWV1zBa9w83E+dzYkOvE9/3pIRUPvLf12c+mGQCf1nesrkBI7Ob8taN2CC9V1HDSJx0KAQl0SgZftA==",
"requires": {
"@babel/runtime": "^7.14.0",
"ranges-merge": "^7.1.0",
"string-collapse-leading-whitespace": "^5.1.0",
"string-trim-spaces-only": "^3.1.0"
}
},
"ranges-sort": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ranges-sort/-/ranges-sort-4.1.0.tgz",
"integrity": "sha512-GOQgk6UtsrfKFeYa53YLiBVnLINwYmOk5l2QZG1csZpT6GdImUwooh+/cRrp7b+fYawZX/rnyA3Ul+pdgQBIzA==",
"requires": {
"@babel/runtime": "^7.14.0"
}
},
"raw-body": { "raw-body": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
@ -30631,12 +30723,6 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz",
"integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="
}, },
"react-lazyload": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/react-lazyload/-/react-lazyload-3.2.0.tgz",
"integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==",
"requires": {}
},
"react-redux": { "react-redux": {
"version": "7.2.4", "version": "7.2.4",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz",
@ -32394,6 +32480,24 @@
"safe-buffer": "~5.2.0" "safe-buffer": "~5.2.0"
} }
}, },
"string-collapse-leading-whitespace": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-5.1.0.tgz",
"integrity": "sha512-mYz9/Kb5uvRB4DZj46zILwI4y9lD9JsvXG9Xb7zjbwm0I/R40G7oFfMsqJ28l2d7gWMTLJL569NfJQVLQbnHCw==",
"requires": {
"@babel/runtime": "^7.14.0"
}
},
"string-left-right": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/string-left-right/-/string-left-right-4.1.0.tgz",
"integrity": "sha512-ic/WvfNVUygWWsgg8akzSzp2NuttfhrdbH7QmSnda5b5RFmT9aCEDiS/M+gmTJwtFy7+b/2AXU4Z6vejcePQqQ==",
"requires": {
"@babel/runtime": "^7.14.0",
"lodash.clonedeep": "^4.5.0",
"lodash.isplainobject": "^4.0.6"
}
},
"string-length": { "string-length": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
@ -32408,6 +32512,36 @@
"resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
"integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw=="
}, },
"string-strip-html": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/string-strip-html/-/string-strip-html-8.3.0.tgz",
"integrity": "sha512-1+rjTPt0JjpFr1w0bfNL1S6O0I9fJDqM+P3pFTpC6eEEpIXhmBvPLnaQoEuWarswiH219qCefDSxTLxGQyHKUg==",
"requires": {
"@babel/runtime": "^7.14.0",
"html-entities": "^2.3.2",
"lodash.isplainobject": "^4.0.6",
"lodash.trim": "^4.5.1",
"lodash.without": "^4.4.0",
"ranges-apply": "^5.1.0",
"ranges-push": "^5.1.0",
"string-left-right": "^4.1.0"
},
"dependencies": {
"html-entities": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
"integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ=="
}
}
},
"string-trim-spaces-only": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-trim-spaces-only/-/string-trim-spaces-only-3.1.0.tgz",
"integrity": "sha512-AW7RSi3+QtE6wR+4m/kmwlyy39neBbCIzrzzu1/RGzNRiPKQOeB3rGzr4ubg4UIQgYtr2w0PrxhKPXgyqJ0vaQ==",
"requires": {
"@babel/runtime": "^7.14.0"
}
},
"string-width": { "string-width": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",

View File

@ -8,6 +8,7 @@
"@testing-library/jest-dom": "^5.11.4", "@testing-library/jest-dom": "^5.11.4",
"@testing-library/react": "^11.1.0", "@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10", "@testing-library/user-event": "^12.1.10",
"article-api": "^1.0.5",
"axios": "^0.21.1", "axios": "^0.21.1",
"daisyui": "^1.12.1", "daisyui": "^1.12.1",
"moment": "^2.29.1", "moment": "^2.29.1",

View File

@ -153,6 +153,7 @@ function App() {
<div className="lg:col-span-2 col-span-1"> <div className="lg:col-span-2 col-span-1">
<div className="grid grid-cols-1 gap-6"> <div className="grid grid-cols-1 gap-6">
<Project /> <Project />
<Blog />
</div> </div>
</div> </div>
</div> </div>

View File

@ -39,13 +39,15 @@ const AvatarCard = () => {
</div> </div>
</div> </div>
<div className="text-center mx-8"> <div className="text-center mx-8">
<div className="text-lg font-extrabold"> <span class="opacity-60">
{ <h5 className="card-title font-extrabold">
{
loading ? ( loading ? (
skeleton({ width: 'w-48', height: 'h-8' }) skeleton({ width: 'w-48', height: 'h-8' })
) : profile.name ) : <span className="opacity-60">{profile.name}</span>
} }
</div> </h5>
</span>
<div className="mt-3 text-sm text-base-content text-opacity-60"> <div className="mt-3 text-sm text-base-content text-opacity-60">
{ {
loading ? ( loading ? (

View File

@ -1,24 +1,163 @@
import { useSelector } from "react-redux"; import { getDevtoArticle, getMediumArticle } from "article-api";
import moment from "moment";
import { Fragment, memo, useEffect, useState } from "react";
import { CgHashtag } from 'react-icons/cg';
import config from "../config";
import { skeleton } from "../helpers/utils"; import { skeleton } from "../helpers/utils";
const { Fragment } = require("react")
const Blog = () => { const Blog = () => {
const loading = useSelector(state => state.loading); const [articles, setArticles] = useState(null);
useEffect(() => {
if (
typeof config.blog !== 'undefined' &&
typeof config.blog.source !== 'undefined' &&
typeof config.blog.username !== 'undefined' &&
config.blog.source &&
config.blog.username
) {
if (config.blog.source === 'medium') {
getMediumArticle({
user: config.blog.username
})
.then(res => {
setArticles(res);
});
} else if (config.blog.source === 'dev.to') {
getDevtoArticle({
user: config.blog.username
})
.then(res => {
setArticles(res);
});
}
}
}, [])
return ( return (
<div className="card shadow-lg compact bg-base-100"> <>
<div className="flex-row items-center space-x-4 card-body"> <div className="col-span-1 lg:col-span-2">
<div className="flex-1"> <div className="grid grid-cols-2 gap-6">
<div className="section-title"> <div className="col-span-2">
<h5 className="card-title"> <div className="card compact bg-base-100">
{loading ? skeleton({width: 'w-20', height: 'h-8'}) : 'Blog'} <div className="card-body">
</h5> <ul className="menu row-span-3 bg-base-100 text-base-content text-opacity-40">
<li>
<div className="section-title pb-0-important mx-5 flex items-center">
<h5 className="card-title mr-3">
{!articles ? skeleton({width: 'w-28', height: 'h-8'}) : 'Recent Posts'}
</h5>
{
!articles ? skeleton({width: 'w-8', height: 'h-8'}) : (
<svg className="animate-bounce w-4 h-4" fill="none" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" stroke="currentColor">
<path d="M19 14l-7 7m0 0l-7-7m7 7V3"></path>
</svg>
)
}
</div>
</li>
</ul>
</div>
</div>
</div>
<div className="col-span-2">
<div className="grid grid-cols-1 gap-6">
{
articles && articles.slice(0, 5).map((article, index) => (
<a href={article.link} target="_blank" rel="noreferrer" className="card shadow-lg compact bg-base-100" key={index}>
<div class="p-8 h-full w-full">
<a class="flex items-center flex-col md:flex-row" href={article.link} target="_blank">
<div class="avatar mb-5 md:mb-0">
<div class="w-24 h-24 mask mask-squircle">
<img src={article.thumbnail} />
</div>
</div>
<div className="w-full">
<div class="flex items-start px-4">
<div class="text-center md:text-left">
<h2 class="text-lg font-semibold text-gray-900 -mt-1">{article.title}</h2>
<p class="text-gray-700">{moment(article.publishedAt).fromNow()}</p>
<p class="mt-3 text-gray-700 text-sm">
{article.description}
</p>
<div class="mt-4 flex items-center flex-wrap justify-center md:justify-start">
{
article.categories.map((category, index2) => (
<div class="flex text-gray-700 text-sm mr-3 items-center">
<CgHashtag/>
<span>{category}</span>
</div>
))
}
</div>
</div>
</div>
</div>
</a>
</div>
</a>
))
}
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
{/* <div className="card shadow-lg compact bg-base-100 col-span-1 lg:col-span-2">
<div className="flex flex-col p-8 h-full w-full">
<div className="mb-2">
<div className="opacity-60">
<span>
<h5 className="card-title">
Recent Posts
</h5>
</span>
</div>
</div>
<div className="grid grid-cols-1 gap-6">
{
articles && articles.slice(0, 5).map((article, index) => (
<div class="card">
<div class="card-body">
<a class="flex items-center flex-col md:flex-row" href={article.link} target="_blank">
<div class="avatar">
<div class="w-24 h-24 mask mask-squircle">
<img src={article.thumbnail} />
</div>
</div>
<div className="w-full">
<div class="flex items-start px-4">
<div class="">
<div class="flex items-center justify-between">
<h2 class="text-lg font-semibold text-gray-900 -mt-1">{article.title}</h2>
</div>
<p class="text-gray-700">{moment(article.publishedAt).fromNow()}</p>
<p class="mt-3 text-gray-700 text-sm">
{article.description}
</p>
<div class="mt-4 flex items-center">
{
article.categories.map((category, index2) => (
<div class="flex text-gray-700 text-sm mr-3">
# {category}
</div>
))
}
</div>
</div>
</div>
</div>
</a>
</div>
</div>
))
}
</div>
</div>
</div> */}
</>
) )
} }
export default Blog; export default memo(Blog);

View File

@ -95,8 +95,8 @@ const Project = () => {
<Fragment> <Fragment>
<div className="col-span-1 lg:col-span-2"> <div className="col-span-1 lg:col-span-2">
<div className="grid grid-cols-2 gap-6"> <div className="grid grid-cols-2 gap-6">
{/* <div className="col-span-2"> <div className="col-span-2">
<div className="card shadow-lg compact bg-base-100"> <div className="card compact bg-base-100">
<div className="card-body"> <div className="card-body">
<ul className="menu row-span-3 bg-base-100 text-base-content text-opacity-40"> <ul className="menu row-span-3 bg-base-100 text-base-content text-opacity-40">
<li> <li>
@ -116,7 +116,7 @@ const Project = () => {
</ul> </ul>
</div> </div>
</div> </div>
</div> */} </div>
<div className="col-span-2"> <div className="col-span-2">
<div className="grid grid-cols-1 md:grid-cols-2 gap-6"> <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{(loading || !repo) ? renderSkeleton() : renderProjects()} {(loading || !repo) ? renderSkeleton() : renderProjects()}

View File

@ -3,6 +3,10 @@ module.exports = {
email: 'contact@arifszn.com', // optional email: 'contact@arifszn.com', // optional
linkedinUsername: 'ariful-alam', // optional linkedinUsername: 'ariful-alam', // optional
dribbbleUsername: '', // optional dribbbleUsername: '', // optional
blog: {
source: 'dev.to', // medium | dev.to
username: 'arifszn',
},
skills: [ skills: [
'PHP', 'PHP',
'Laravel', 'Laravel',