{"version":3,"sources":["static/images/profile.jpg","components/blog-posts/posts sync /^/.//.*/.md$","components/blog-posts/posts/deploy_elastic_stack_to_kubernetes.md","components/blog-posts/posts/enable_touchpad_tap_clicking.md","components/blog-posts/posts/generate_static_site.md","components/blog-posts/posts/golang_nil_channel.md","components/blog-posts/posts/implementing_fabric_acl_with_cid.md","components/blog-posts/posts/start_of_a_journey.md","components/blog-posts/posts/testing_software_and_mocking_services_with_loopback.md","components/work-posts/posts sync /^/.//.*/.md$","components/work-posts/posts/anon_chat.md","components/work-posts/posts/road_surface_estimator.md","components/utilities/NavigationBar/NavigationBar.jsx","components/pages/Home/Home.jsx","components/pages/About/About.jsx","components/pages/Works/posts.js","components/pages/Works/Works.jsx","components/pages/Blog/posts.js","components/pages/Blog/Blog.jsx","components/pages/Contact/Contact.jsx","components/blog-posts/CodeBlock.jsx","components/blog-posts/Data.js","components/blog-posts/BlogTemplate.jsx","components/work-posts/CodeBlock.jsx","components/work-posts/Data.js","components/work-posts/WorkTemplate.jsx","App.jsx","serviceWorker.js","index.js"],"names":["module","exports","__webpack_require__","p","map","./deploy_elastic_stack_to_kubernetes.md","./enable_touchpad_tap_clicking.md","./generate_static_site.md","./golang_nil_channel.md","./implementing_fabric_acl_with_cid.md","./start_of_a_journey.md","./testing_software_and_mocking_services_with_loopback.md","webpackContext","req","id","webpackContextResolve","e","Error","code","keys","Object","resolve","./anon_chat.md","./road_surface_estimator.md","NavigationBar","props","_this","classCallCheck","this","possibleConstructorReturn","getPrototypeOf","call","toggle","bind","assertThisInitialized","toggleCloseNav","state","isOpen","setState","react_default","a","createElement","Navbar","light","expand","NavbarBrand","onClick","tag","Link","to","NavbarToggler","Collapse","navbar","Nav","className","NavItem","NavLink","href","Component","Home","Helmet","name","content","profile","Jumbotron","fluid","Container","Row","Col","sm","md","size","offset","About","Media","object","src","posts","img","alt","title","date","description","link","Works","post","length","CardDeck","Card","deck","cardDeck","deckCollection","deckReturned","forEach","element","index","card","CardImg","top","width","CardBody","CardTitle","CardSubtitle","CardText","pathname","Button","push","getWorkPosts","Blog","getBlogPosts","Contact","CodeBlock","_this$props","language","value","default_highlight","showLineNumbers","startingLineNumber","style","atomOneDark","React","PureComponent","defaultProps","data","start_of_a_journey","image","generate_static_site","deploy_elastic_stack_to_kubernetes","implementing_fabric_acl_with_cid","enable_touchpad_tap_clicking","golang_nil_channel","testing_software_and_mocking_services_with_loopback","descriptiong","Image","assign","BlogTemplate","markdown","_this2","postname","match","params","_GetData","GetData","markdownFile","require","concat","fetch","then","response","text","postURL","react_markdown_default","source","renderers","escapeHtml","align","FacebookShareButton","url","quote","FacebookIcon","round","TwitterShareButton","TwitterIcon","LinkedinShareButton","windowWidth","windowHeight","LinkedinIcon","LineShareButton","LineIcon","RedditShareButton","RedditIcon","road_surface_estimator","anon_chat","WorkTemplate","App","BrowserRouter","basename","utilities_NavigationBar_NavigationBar","Route","exact","path","component","Boolean","window","location","hostname","rootElement","document","getElementById","hasChildNodes","hydrate","src_App_0","render","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.0cddb9d9.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/profile.7453ea93.jpg\";","var map = {\n\t\"./deploy_elastic_stack_to_kubernetes.md\": 492,\n\t\"./enable_touchpad_tap_clicking.md\": 493,\n\t\"./generate_static_site.md\": 494,\n\t\"./golang_nil_channel.md\": 495,\n\t\"./implementing_fabric_acl_with_cid.md\": 496,\n\t\"./start_of_a_journey.md\": 497,\n\t\"./testing_software_and_mocking_services_with_loopback.md\": 498\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) { // check for number or string\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn id;\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 491;","module.exports = __webpack_public_path__ + \"static/media/deploy_elastic_stack_to_kubernetes.80080fe2.md\";","module.exports = __webpack_public_path__ + \"static/media/enable_touchpad_tap_clicking.0980683e.md\";","module.exports = __webpack_public_path__ + \"static/media/generate_static_site.03690f64.md\";","module.exports = __webpack_public_path__ + \"static/media/golang_nil_channel.9642fec1.md\";","module.exports = __webpack_public_path__ + \"static/media/implementing_fabric_acl_with_cid.169fad38.md\";","module.exports = __webpack_public_path__ + \"static/media/start_of_a_journey.7bcdf59c.md\";","module.exports = __webpack_public_path__ + \"static/media/testing_software_and_mocking_services_with_loopback.11680eaa.md\";","var map = {\n\t\"./anon_chat.md\": 546,\n\t\"./road_surface_estimator.md\": 547\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) { // check for number or string\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn id;\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 545;","module.exports = __webpack_public_path__ + \"static/media/anon_chat.6c1dc76f.md\";","module.exports = __webpack_public_path__ + \"static/media/road_surface_estimator.f1facf95.md\";","import React, { Component } from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n Collapse,\n Navbar,\n NavbarToggler,\n NavbarBrand,\n Nav,\n NavItem,\n NavLink\n} from 'reactstrap';\n\nclass NavigationBar extends Component {\n constructor(props) {\n super(props);\n\n this.toggle = this.toggle.bind(this);\n this.toggleCloseNav = this.toggleCloseNav.bind(this);\n this.state = {\n isOpen: false\n };\n }\n \n toggle() {\n this.setState({\n isOpen: !this.state.isOpen\n });\n }\n\n toggleCloseNav() {\n this.setState({\n isOpen: this.state.isOpen ? !this.state.isOpen : this.state.isOpen\n });\n }\n\n render() {\n return (\n
\n \n Thanakrit Lee\n \n \n \n \n \n
\n );\n }\n}\n\nexport default NavigationBar;","import React, { Component } from 'react';\nimport './Home.css';\nimport { Container, Row, Col, Jumbotron } from 'reactstrap';\nimport { Helmet } from 'react-helmet';\n\nimport profile from '../../../static/images/profile.jpg';\n\nclass Home extends Component {\n render() {\n return (\n
\n \n Thanakrit Lee | Blockchain/Web/Software | Bangkok\n \n \n \n \n \n

Thanakrit Lee

\n

I'm a software engineer with background in API development and Blockchain technologies.

\n
\n
\n \n \n

\n I'm currently a software engineer at Feed Ingredients Trading Business Group (CP Group).\n

\n \n
\n \n \n

\n My interests include web technologies, blockchain, system administration, Linux, and DevOps.\n The purposes of this web site is to act as a personal portfolio showing my work, and to share my working knowledge \n through written blog posts.\n

\n \n
\n
\n );\n }\n}\n\nexport default Home;","import React, { Component } from 'react';\nimport './About.css';\nimport { Row, Col, Media } from 'reactstrap';\nimport { Helmet } from 'react-helmet';\n\nimport profile from '../../../static/images/profile.jpg';\n\nclass About extends Component {\n render() {\n return (\n
\n \n Thanakrit Lee | About\n \n \n \n \n \n \n

\n Hello, I'm Thanakrit Lee, and I'm currently a software engineer.\n I graduated with a bachelor degree in computer science at Monash University, \n Melbourne, Australia.\n

\n \n
\n \n \n

\n Anyhow, this is my web site. The client is written with React.js using create-react-app\n , it's served using Go's net/http server, and hosted on AWS.\n

\n \n
\n
\n );\n }\n}\n\nexport default About;","const posts = {\n \"posts\": [\n {\n \"img\": \"https://i.imgur.com/5zHbAYv.png\",\n \"alt\": \"Anon Chat\",\n \"title\": \"Anon Chat\",\n \"date\": \"02-04-2019\",\n \"description\": \"A web chat application where users are anonymous.\",\n \"link\": \"/projects/anon_chat\"\n },\n {\n \"img\": \"https://i.imgur.com/NxC3P4G.png\",\n \"alt\": \"Road Surface Estimator\",\n \"title\": \"Road Surface Estimator\",\n \"date\": \"10-05-2018\",\n \"description\": \"A web application use to calculate the estimated total surface area of all roads in a selected 1 square kilometre area.\",\n \"link\": \"/projects/road_surface_estimator\"\n },\n ]\n};\n\n\n\nexport default posts;","import React, { Component } from 'react';\nimport './Works.css';\nimport { Row, Col, Card, Button, CardImg, CardTitle, CardText, CardDeck, CardSubtitle, CardBody } from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport { Helmet } from 'react-helmet';\nimport posts from './posts';\n\nclass Works extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n posts: posts\n };\n }\n\n getWorkPosts(post) {\n\n // If there are no posts, then return empty card deck.\n if (post.posts.length === 0) {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n\n // Collect all cards in a deck, and return it once the deck is complete.\n let cardDeck = [];\n \n // A collection of cardDeck.\n let deckCollection = [];\n\n // Boolean to keep track if a card deck is returned.\n // This is needed in the case where there are not enough cards to complete a deck,\n // but a deck must be return any way. This will return the incomplete deck after the\n // forEach loop.\n let deckReturned = false;\n post.posts.forEach((element, index) => {\n let card = (\n \n \n \n {element.title}\n {element.date}\n \n {element.description}\n \n \n \n \n \n \n );\n\n // If current card is in a deck.\n if ((index + 1) % 3 !== 0) {\n // Set boolean to false.\n deckReturned = false;\n\n // If not last card in the deck yet, add the card to the cardDeck array.\n cardDeck.push(card);\n } else {\n // Else, if current is last card in the deck, then complete the deck and add it to the deck collection.\n deckCollection.push(\n \n \n \n {cardDeck[0]}\n {cardDeck[1]}\n {card}\n \n \n \n );\n\n // Empty the card deck.\n cardDeck = [];\n deckReturned = true;\n }\n })\n\n // If deck is incomplete, return the deck any way.\n if (!deckReturned) {\n let deck;\n if (cardDeck.length === 1) {\n deck = (\n \n { cardDeck[0] }\n \n \n \n \n \n );\n } else {\n deck = (\n \n { cardDeck[0] }\n { cardDeck[1] }\n \n \n \n );\n }\n // Add the incomplete card deck to the deck collection.\n deckCollection.push(\n \n \n { deck }\n \n \n )\n }\n\n // Return all deck inside the deck collection.\n return deckCollection;\n\n }\n\n render() {\n return (\n
\n \n Thanakrit Lee | Works\n \n \n { this.getWorkPosts(this.state.posts) }\n
\n );\n }\n\n}\n\nexport default Works;","const posts = {\n \"posts\": [\n {\n \"img\": \"https://upload.wikimedia.org/wikipedia/commons/4/4c/Typescript_logo_2020.svg\",\n \"alt\": \"Testing Software and Mocking Services\",\n \"title\": \"Testing Software and Mocking Services (with Loopback 4)\",\n \"date\": \"26-07-2021\",\n \"description\": \"Discuss method for testing software and mocking services with examples in NodeJS Loopback 4.\",\n \"link\": \"/posts/testing_software_and_mocking_services_with_loopback\"\n },\n {\n \"img\": \"https://i.imgur.com/8VWOLCs.png\",\n \"alt\": \"GoLang nil Channel\",\n \"title\": \"How to use GoLang's nil Channel\",\n \"date\": \"12-01-2020\",\n \"description\": \"A post showing a use case of a nil channel.\",\n \"link\": \"/posts/golang_nil_channel\"\n },\n {\n \"img\": \"https://i.imgur.com/uZumWRp.png\",\n \"alt\": \"Tap to Click Xorg with Libinput\",\n \"title\": \"How to Enable Touchpad Tap-to-Click in Xorg on Linux\",\n \"date\": \"14-11-2019\",\n \"description\": \"A tutorial describing the steps I took to enable touchpad tap-to-click function permanently.\",\n \"link\": \"/posts/enable_touchpad_tap_clicking\"\n },\n {\n \"img\": \"https://i.imgur.com/JqaUs41.png\",\n \"alt\": \"ACL\",\n \"title\": \"Implementing Fabric ACL with CID\",\n \"date\": \"20-05-2019\",\n \"description\": \"A tutorial on how to implement a basic Hyperledger Fabric ACL using the Fabric CID package.\",\n \"link\": \"/posts/implementing_fabric_acl_with_cid\"\n },\n {\n \"img\": \"https://i.imgur.com/9D5bVTr.png\",\n \"alt\": \"Kubernetes and Azure\",\n \"title\": \"Deploy Elastic Stack to Kubernetes\",\n \"date\": \"09-03-2019\",\n \"description\": \"Discuss how to test and deploy an Elastic Stack application to a Kubernetes cluster on Azure cloud service.\",\n \"link\": \"/posts/deploy_elastic_stack_to_kubernetes\"\n },\n {\n \"img\": \"https://i.imgur.com/Vlt0Q2q.jpg\",\n \"alt\": \"React-Helmet\",\n \"title\": \"React app into static HTML with meta tags\",\n \"date\": \"24-01-2019\",\n \"description\": \"A tutorial on how to pre-renders React App into static HTML, and add meta tags to your page.\",\n \"link\": \"/posts/generate_static_site\"\n },\n {\n \"img\": \"https://i.imgur.com/rn9uS6e.jpg\",\n \"alt\": \"Firework\",\n \"title\": \"The start of a journey\",\n \"date\": \"20-01-2019\",\n \"description\": \"A description of my journey in designing, developing, and deploying this website.\",\n \"link\": \"/posts/start_of_a_journey\"\n },\n ]\n};\n\n\n\nexport default posts;","import React, { Component } from 'react';\nimport './Blog.css';\nimport { Row, Col, Card, Button, CardImg, CardTitle, CardText, CardDeck, CardSubtitle, CardBody } from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport { Helmet } from 'react-helmet';\nimport posts from './posts';\n\nclass Blog extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n posts: posts\n };\n }\n\n getBlogPosts(post) {\n\n // If there are no posts, then return empty card deck.\n if (post.posts.length === 0) {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n\n // Collect all cards in a deck, and return it once the deck is complete.\n let cardDeck = [];\n \n // A collection of cardDeck.\n let deckCollection = [];\n\n // Boolean to keep track if a card deck is returned.\n // This is needed in the case where there are not enough cards to complete a deck,\n // but a deck must be return any way. This will return the incomplete deck after the\n // forEach loop.\n let deckReturned = false;\n post.posts.forEach((element, index) => {\n let card = (\n \n \n \n {element.title}\n {element.date}\n \n {element.description}\n \n \n \n \n \n \n );\n\n // If current card is in a deck.\n if ((index + 1) % 3 !== 0) {\n // Set boolean to false.\n deckReturned = false;\n\n // If not last card in the deck yet, add the card to the cardDeck array.\n cardDeck.push(card);\n } else {\n // Else, if current is last card in the deck, then complete the deck and add it to the deck collection.\n deckCollection.push(\n \n \n \n {cardDeck[0]}\n {cardDeck[1]}\n {card}\n \n \n \n );\n\n // Empty the card deck.\n cardDeck = [];\n deckReturned = true;\n }\n })\n\n // If deck is incomplete, return the deck any way.\n if (!deckReturned) {\n let deck;\n if (cardDeck.length === 1) {\n deck = (\n \n { cardDeck[0] }\n \n \n \n \n \n );\n } else {\n deck = (\n \n { cardDeck[0] }\n { cardDeck[1] }\n \n \n \n );\n }\n // Add the incomplete card deck to the deck collection.\n deckCollection.push(\n \n \n { deck }\n \n \n )\n }\n\n // Return all deck inside the deck collection.\n return deckCollection;\n\n }\n\n\n\n render() {\n return (\n
\n \n Thanakrit Lee | Blog\n \n \n { this.getBlogPosts(this.state.posts) }\n
\n );\n }\n}\n\nexport default Blog;","import React, { Component } from 'react';\nimport './Contact.css';\nimport { Row, Col } from 'reactstrap';\nimport { Helmet } from 'react-helmet';\n\nclass Contact extends Component {\n render() {\n return (\n
\n \n Thanakrit Lee | Contact\n \n \n \n \n

\n Email Address: thanakrit.lee.2014@gmail.com\n

\n \n
\n
\n );\n }\n}\n\nexport default Contact;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport { atomOneDark } from 'react-syntax-highlighter/dist/styles/hljs';\n\nclass CodeBlock extends React.PureComponent {\n static propTypes = {\n value: PropTypes.string.isRequired,\n language: PropTypes.string,\n }\n\n static defaultProps = {\n language: null,\n }\n\n render() {\n const { language, value } = this.props;\n\n return (\n \n {value}\n \n );\n }\n}\n\nexport default CodeBlock;","export default (postname) => {\n return data[postname];\n};\n\nconst data = {\n \"start_of_a_journey\": {\n title: \"The start of a Journey | Thanakrit Lee\", \n description: \"In this post, I'm going to be describing the steps I took in designing, developing, and deploying this web site.\", \n image: \"https://i.imgur.com/rn9uS6e.jpg\"\n },\n \"generate_static_site\": {\n title: \"React App into Static HTML with Meta Tags | Thanakrit Lee\", \n description: \"In this post, I'll show you how to pre-render a normal React app (created with create-react-app) into static HTML, and I'll also show you how to add meta tags to your page to help with SEO and SMO.\", \n image: \"https://i.imgur.com/Vlt0Q2q.jpg\"\n },\n \"deploy_elastic_stack_to_kubernetes\": {\n title: \"Deploy Elastic Stack to Kubernetes | Thanakrit Lee\", \n description: \"This post will discuss how to test and deploy an Elastic Stack application to a Kubernetes cluster on Azure cloud service.\", \n image: \"https://i.imgur.com/9D5bVTr.png\"\n },\n \"implementing_fabric_acl_with_cid\": {\n title: \"Implementing Fabric ACL with CID | Thanakrit Lee\",\n description: \"This post will show you how to implement a basic Hyperledger Fabric ACL using the Fabric CID package.\",\n image: \"https://i.imgur.com/JqaUs41.png\"\n },\n \"enable_touchpad_tap_clicking\": {\n title: \"How to Enable Touchpad Tap-to-Click in Xorg on Linux | Thanakrit Lee\",\n description: \"This tutorial describe the steps I took to enable touchpad tap-to-click function permanently.\",\n image: \"https://i.imgur.com/uZumWRp.png\"\n },\n \"golang_nil_channel\": {\n title: \"GoLang nil Channel | Thanakrit Lee\",\n description: \"A post showing a use case of a nil channel.\",\n image: \"https://i.imgur.com/8VWOLCs.png\"\n },\n \"testing_software_and_mocking_services_with_loopback\": {\n title: 'Testing Software and Mocking Services (with Loopback 4) | Thanakrit Lee',\n descriptiong: 'Discuss method for testing software and mocking services with examples in NodeJS Loopback 4.',\n image: 'https://upload.wikimedia.org/wikipedia/commons/4/4c/Typescript_logo_2020.svg'\n }\n};","import React, { Component } from 'react';\nimport './BlogTemplate.css';\nimport ReactMarkdown from 'react-markdown';\nimport { Row, Col } from 'reactstrap';\nimport { Helmet } from 'react-helmet';\nimport {\n FacebookShareButton,\n LinkedinShareButton,\n TwitterShareButton,\n RedditShareButton,\n LineShareButton,\n\n FacebookIcon,\n TwitterIcon,\n LinkedinIcon,\n RedditIcon,\n LineIcon,\n} from 'react-share';\n\nimport CodeBlock from './CodeBlock';\nimport GetData from './Data';\n\n// Markdown renderer for images (img tag).\nfunction Image(props) {\n return \"\"\n}\n\nclass BlogTemplate extends Component {\n constructor(props) {\n super(props);\n \n this.state = {\n markdown: null\n };\n }\n\n componentWillMount() {\n const { postname } = this.props.match.params;\n const { title, description, image } = GetData(postname);\n // const { title, description, image } = this.props.location.state\n const markdownFile = require(`./posts/${postname}.md`);\n\n fetch(markdownFile)\n .then((response) => {\n return response.text();\n })\n .then((markdown) => {\n this.setState({\n postname: postname,\n markdown: markdown,\n title: title,\n description: description,\n image: image,\n postURL: \"https://thanakritlee.dev/posts/\" + postname\n });\n });\n }\n\n render() {\n return (\n
\n \n { this.state.title }\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n );\n }\n}\n\nexport default BlogTemplate;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport { atomOneDark } from 'react-syntax-highlighter/dist/styles/hljs';\n\nclass CodeBlock extends React.PureComponent {\n static propTypes = {\n value: PropTypes.string.isRequired,\n language: PropTypes.string,\n }\n\n static defaultProps = {\n language: null,\n }\n\n render() {\n const { language, value } = this.props;\n\n return (\n \n {value}\n \n );\n }\n}\n\nexport default CodeBlock;","export default (postname) => {\n return data[postname];\n};\n\nconst data = {\n \"road_surface_estimator\": {\n title: \"Road Surface Estimator | Thanakrit Lee\", \n description: \"A web application use to calculate the estimated total surface area of all roads in a selected 1 square kilometre area.\", \n image: \"https://i.imgur.com/NxC3P4G.png\"\n },\n \"anon_chat\": {\n title: \"Anon Chat | Thanakrit Lee\", \n description: \"A web chat application where users are anonymous.\", \n image: \"https://i.imgur.com/5zHbAYv.png\"\n }\n};","import React, { Component } from 'react';\nimport './WorkTemplate.css';\nimport ReactMarkdown from 'react-markdown';\nimport { Row, Col } from 'reactstrap';\nimport { Helmet } from 'react-helmet';\n\nimport CodeBlock from './CodeBlock';\nimport GetData from './Data';\n\n// Markdown renderer for images (img tag).\nfunction Image(props) {\n return \"\"\n}\n\nclass WorkTemplate extends Component {\n constructor(props) {\n super(props);\n \n this.state = {\n markdown: null\n };\n }\n\n\n componentWillMount() {\n const { postname } = this.props.match.params;\n const { title, description, image } = GetData(postname);\n // const { title, description, image } = this.props.location.state\n const markdownFile = require(`./posts/${postname}.md`);\n\n fetch(markdownFile)\n .then((response) => {\n return response.text();\n })\n .then((markdown) => {\n this.setState({\n markdown: markdown,\n title: title,\n description: description,\n image: image,\n });\n });\n }\n\n render() {\n return (\n
\n \n { this.state.title }\n \n \n \n \n \n \n \n \n
\n );\n }\n}\n\nexport default WorkTemplate;","import React, { Component } from 'react';\nimport { Container } from 'reactstrap';\nimport { BrowserRouter as Router, Route } from 'react-router-dom';\nimport { Helmet } from 'react-helmet';\n\nimport './App.css';\n\nimport profile from './static/images/profile.jpg';\n\nimport NavigationBar from './components/utilities/NavigationBar/NavigationBar';\nimport Home from './components/pages/Home/Home';\nimport About from './components/pages/About/About';\nimport Works from './components/pages/Works/Works';\nimport Blog from './components/pages/Blog/Blog';\nimport Contact from './components/pages/Contact/Contact';\n// import Weather from './components/pages/Weather/Weather';\n\nimport BlogTemplate from './components/blog-posts/BlogTemplate';\nimport WorkTemplate from './components/work-posts/WorkTemplate';\n\nclass App extends Component {\n render() {\n return (\n // \n \n
\n \n Thanakrit Lee\n \n \n \n \n \n \n \n \n \n \n {/* */}\n \n \n \n
\n
\n );\n }\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import 'bootstrap/dist/css/bootstrap.min.css';\nimport React from 'react';\n// import ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport { hydrate, render } from \"react-dom\";\n\n// ReactDOM.render(, document.getElementById('root'));\n\nconst rootElement = document.getElementById(\"root\");\nif (rootElement.hasChildNodes()) {\n hydrate(, rootElement);\n} else {\n render(, rootElement);\n}\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}