{"version":3,"sources":["components/NavMenu.js","components/Layout.js","components/Home.js","components/AboutMe.js","components/Overview.js","components/Dungeoncrawler.js","components/Snake.js","App.js","registerServiceWorker.js","index.js"],"names":["NavMenu","props","DropdownThing","route","name","style","padding","tag","Link","to","className","marginTop","marginBottom","display","flexDirection","justifyContent","marginRight","marginLeft","nav","caret","text","Projects","language","Overview","divider","AboutMe","Layout","children","Home","Title","Info","Body","A","href","B","C","Mail","Phone","Project","body","Dungeoncrawler","state","output","keyPressed","controller","id","inputAllow","document","onkeydown","this","OnKeyDown","bind","onkeyup","OnKeyUp","window","onbeforeunload","ProcessDelete","Reset","ButtonMobile","key","onClick","ProcessUpdate","textAlign","position","bottom","left","width","InputAllow","InputBlock","event","String","fromCharCode","keyCode","value","data","JSON","stringify","fetch","URI","method","headers","then","response","ok","Error","status","statusText","json","setState","TranformOutput","catch","error","ErrorOutput","console","log","message","ProcessStart","map","line","index","code","substr","Explaination","ButtonReset","Component","displayName","InputManual","addonType","onFocus","onBlur","onChange","HandleChange","autoComplete","HandleClick","target","Snake","config","height","length","food","interval","toggleDisplay","isMobile","innerWidth","Restart","KeyPress","clearInterval","intervalID","ButtonControl","func","DisplayGame","Movement","ToggleDisplay","player","SnakeSet","Player","Vector2i","Math","floor","obstacles","y","x","OnBorder","push","BorderObstacles","foodAmount","direction","directionPrev","setInterval","Update","forceUpdate","directions","Move","i","Equal","Head","splice","Grow","AddRandomFood","CollisionCheckArrayVector2i","slice","Number","isInteger","random","RandomNumberGenerator","icon","Array","fill","ChangeCharacter","positions","forEach","Vector2iToArrayIndex","reactStringReplace","RegExp","color","sizeBlock","spacing","DivBlocks","blocks","top","background","board","size","RenderGraphics","RenderCharacters","ConfigurationFormInput","temporary","Object","keys","InputBox","margin","OnClick","classname","placeholder","OnInputChange","parseInt","start","movement","Add","other","min","max","first","second","collision","one","two","require","App","colors","styles","Eng","backgroundColor","Swe","Position","right","LanguageSet","Route","exact","path","render","ButtonToggleLanguage","Boolean","location","hostname","match","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","BrowserRouter","basename","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.3731d9ad.chunk.js","sourcesContent":["import React from 'react';\r\nimport { Container, Nav, NavItem, NavLink, UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport './Styles.css';\r\n\r\nexport function NavMenu(props) {\r\n const DropdownThing = (route, name) => {\r\n return (\r\n \r\n \r\n {name}\r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst text = {\r\n Overview: {\r\n \"en\": \"Overview\",\r\n \"sv\": \"Översikt\"\r\n },\r\n AboutMe: {\r\n \"en\": \"About me\",\r\n \"sv\": \"Om mig\"\r\n },\r\n Projects: {\r\n \"en\": \"Projects\",\r\n \"sv\": \"Projekt\"\r\n }\r\n};","import React from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport { NavMenu } from './NavMenu';\r\nimport './Styles.css';\r\n\r\nexport function Layout(props) {\r\n return (\r\n
\r\n \r\n
\r\n
\r\n \r\n {props.children}\r\n \r\n
\r\n );\r\n}","import React from 'react';\r\nimport './Styles.css';\r\n\r\nexport function Home(props) {\r\n return (\r\n
\r\n
\r\n {text.Title[props.language]}\r\n
\r\n
\r\n {text.Info[props.language]}\r\n
\r\n {text.Body.A[props.language]}\r\n Github\r\n {text.Body.B[props.language]}\r\n Dockerhub\r\n {text.Body.C[props.language]}\r\n
\r\n );\r\n}\r\n\r\nconst text = {\r\n Title: {\r\n \"en\": \"Welcome!\",\r\n \"sv\": \"Välkommen!\"\r\n },\r\n Info: {\r\n \"en\": \"This website is a ASP.NET Core 3.1 Web App, deployed in a Docker container, with React.js as frontend, hosted with Nginx as reverse proxy on a DigitalOcean VPS with Ubuntu 18.04\",\r\n \"sv\": \"Denna hemsidan är en ASP.NET Core 3.1 Web App, körd i en Docker container, med React.js som frontend, hostad med Nginx som reverse proxy på en DigitalOcean VPS med Ubuntu 18.04\"\r\n },\r\n Body: {\r\n A: {\r\n \"en\": \"Visit my \",\r\n \"sv\": \"Besök min \"\r\n },\r\n B: {\r\n \"en\": \" for the source code of the website, alternatively visit my \",\r\n \"sv\": \" för källkoden av sidan, alternativt besök min \"\r\n },\r\n C: {\r\n \"en\": \" for a docker image built for Linux\",\r\n \"sv\": \" för en docker image byggd för Linux\"\r\n }\r\n }\r\n};","import React from 'react';\r\nimport './Styles.css';\r\n\r\nexport function AboutMe(props) {\r\n return (\r\n
\r\n
\r\n {text.Title[props.language]}\r\n
\r\n
\r\n {text.Mail[props.language]}\r\n
\r\n {text.Phone[props.language]}\r\n
\r\n );\r\n}\r\n\r\nconst text = {\r\n Title: {\r\n \"en\": \"Contact\",\r\n \"sv\": \"Kontakt\"\r\n },\r\n Mail: {\r\n \"en\": \"E-Mail: erik@hedaker.se\",\r\n \"sv\": \"E-Mail: erik@hedaker.se\"\r\n },\r\n Phone: {\r\n \"en\": \"Mobile: +46722182488\",\r\n \"sv\": \"Mobil: 0722182488\"\r\n }\r\n};","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport './Styles.css';\r\n\r\nexport function Overview(props) {\r\n const Project = (name, body) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n {name}\r\n
\r\n
\r\n {body}\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n
\r\n {Project(\"Dungeoncrawler\", \"Test\")}\r\n


\r\n {Project(\"Snake\", \"Test\")}\r\n
\r\n );\r\n}","import React, { Component } from 'react';\r\nimport { Button, InputGroup, InputGroupAddon, InputGroupText, Input } from 'reactstrap';\r\nimport './Styles.css';\r\n\r\nexport class Dungeoncrawler extends Component {\r\n static displayName = Dungeoncrawler.name;\r\n constructor(props) {\r\n super(props);\r\n this.state = { output: [] };\r\n this.keyPressed = false;\r\n this.controller = \"api/Dungeoncrawler\";\r\n this.id = \"\";\r\n this.inputAllow = true;\r\n }\r\n componentDidMount() {\r\n document.onkeydown = this.OnKeyDown.bind(this);\r\n document.onkeyup = this.OnKeyUp.bind(this);\r\n window.onbeforeunload = () => this.ProcessDelete();\r\n this.Reset();\r\n }\r\n componentWillUnmount() {\r\n this.ProcessDelete();\r\n }\r\n render() {\r\n let ButtonMobile = (key) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n
\r\n
\r\n {this.state.output}\r\n
\r\n
\r\n
\r\n
\r\n {ButtonMobile(\"W\")}\r\n
\r\n {ButtonMobile(\"A\")}\r\n {ButtonMobile(\"S\")}\r\n {ButtonMobile(\"D\")}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {ButtonMobile(\"1\")}\r\n {ButtonMobile(\"2\")}\r\n {ButtonMobile(\"3\")}\r\n {ButtonMobile(\"4\")}\r\n {ButtonMobile(\"5\")}\r\n
\r\n
\r\n
\r\n {ButtonMobile(\"E\")}\r\n
\r\n {ButtonMobile(\"F\")}\r\n {ButtonMobile(\"G\")}\r\n {ButtonMobile(\"H\")}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n URI() {\r\n return this.controller + \"/\" + this.id;\r\n }\r\n OnKeyUp() {\r\n this.keyPressed = false;\r\n }\r\n OnKeyDown(event) {\r\n event = event || window.event;\r\n\r\n if (!this.keyPressed && this.id && this.inputAllow) {\r\n this.keyPressed = true;\r\n this.ProcessUpdate(String.fromCharCode(event.keyCode));\r\n }\r\n }\r\n InputAllow() {\r\n this.inputAllow = true;\r\n }\r\n InputBlock() {\r\n this.inputAllow = false;\r\n }\r\n ProcessUpdate(value) {\r\n let data = JSON.stringify(value);\r\n fetch(this.URI(), {\r\n method: 'PATCH',\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n body: data\r\n }).then(response => {\r\n if (!response.ok) {\r\n throw Error(response.status + \" \" + response.statusText);\r\n }\r\n return response.json();\r\n }).then(data => {\r\n this.setState({ output: this.TranformOutput(data) })\r\n }).catch(error => {\r\n this.setState({ output: this.ErrorOutput(error) });\r\n console.log(error.message);\r\n });\r\n }\r\n ProcessDelete() {\r\n fetch(this.URI(), {\r\n method: 'DELETE'\r\n }).then(response => {\r\n if (!response.ok) {\r\n throw Error(response.status + \" \" + response.statusText);\r\n }\r\n }).catch(error => {\r\n this.setState({ output: this.ErrorOutput(error) });\r\n console.log(error.message);\r\n });\r\n }\r\n ProcessStart() {\r\n fetch(this.controller, {\r\n method: 'POST',\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(response => {\r\n if (!response.ok) {\r\n throw Error(response.status + \" \" + response.statusText);\r\n }\r\n return response.json();\r\n }).then(body => {\r\n this.setState({ output: this.TranformOutput(body.output) });\r\n this.id = body.id;\r\n }).catch(error => {\r\n this.setState({ output: this.ErrorOutput(error) });\r\n console.log(error.message);\r\n });\r\n }\r\n Reset() {\r\n this.setState({\r\n output:\r\n
\r\n \r\n Loading, please wait\r\n \r\n
\r\n });\r\n\r\n if (this.id) {\r\n this.ProcessDelete();\r\n }\r\n\r\n this.ProcessStart();\r\n }\r\n ButtonReset() {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n TranformOutput(data) {\r\n const OutputLines = lines => {\r\n return lines.map((line, index) => {\r\n return (\r\n

\r\n {line}\r\n

\r\n );\r\n });\r\n };\r\n\r\n return (\r\n
\r\n {OutputLines(data)}\r\n
\r\n );\r\n }\r\n ErrorOutput(error) {\r\n const Explaination = message => {\r\n const code = message.substr(0, 3);\r\n if (code === \"404\") return \"The server killed the Dungeoncrawler process after being idle for 60 seconds\";\r\n if (code === \"500\") return \"The server encountered an unexpected error and was unable to handle it\";\r\n return \"The server has responded with an http error code (4xx and 5xx)\";\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n HTTP Error\r\n
\r\n
\r\n \r\n {error.message}\r\n \r\n
\r\n


\r\n
\r\n {Explaination(error.message)}\r\n
\r\n


\r\n {this.ButtonReset()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass InputManual extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n value: \"\"\r\n };\r\n }\r\n render() {\r\n return (\r\n \r\n \r\n \r\n Manual\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n HandleClick() {\r\n this.props.InputAllow();\r\n this.props.ProcessUpdate(this.state.value);\r\n this.setState({ value: \"\" });\r\n }\r\n HandleChange(event) {\r\n this.setState({ value: event.target.value });\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { Button, InputGroup, InputGroupAddon, InputGroupText, Input } from 'reactstrap';\r\nimport './Styles.css';\r\n\r\nexport class Snake extends Component {\r\n static displayName = Snake.name;\r\n constructor(props) {\r\n super(props);\r\n this.config = {\r\n width: 17,\r\n height: 17,\r\n length: 5,\r\n food: 2,\r\n interval: 100\r\n };\r\n this.toggleDisplay = true;\r\n this.isMobile = window.innerWidth <= 750;\r\n this.Restart();\r\n }\r\n componentDidMount() {\r\n document.onkeydown = this.KeyPress.bind(this);\r\n }\r\n componentWillUnmount() {\r\n clearInterval(this.intervalID);\r\n }\r\n render() {\r\n const ButtonControl = (text, func) => {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {this.DisplayGame()}\r\n
\r\n
\r\n
\r\n {ButtonControl(\"W\", this.Movement.bind(this, \"W\"))}\r\n
\r\n {ButtonControl(\"A\", this.Movement.bind(this, \"A\"))}\r\n {ButtonControl(\"S\", this.Movement.bind(this, \"S\"))}\r\n {ButtonControl(\"D\", this.Movement.bind(this, \"D\"))}\r\n
\r\n
\r\n {ButtonControl(\"R\", this.Restart.bind(this))} Restart\r\n
\r\n {ButtonControl(\"F\", this.ToggleDisplay.bind(this))} Display\r\n
\r\n
\r\n
\r\n
\r\n Current length: {this.player.body.length}\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n Restart() {\r\n clearInterval(this.intervalID);\r\n this.width = this.config.width;\r\n this.height = this.config.height;\r\n this.player = new Player(new Vector2i(1, Math.floor(this.height / 2)), this.config.length);\r\n this.obstacles = BorderObstacles(this.width, this.height);\r\n this.foodAmount = this.config.food;\r\n this.food = [];\r\n this.direction = \"east\";\r\n this.directionPrev = this.direction;\r\n this.intervalID = setInterval(this.Update.bind(this), this.config.interval);\r\n }\r\n ToggleDisplay() {\r\n this.toggleDisplay = !this.toggleDisplay;\r\n this.forceUpdate();\r\n }\r\n KeyPress(event) {\r\n event = event || window.event;\r\n const key = String.fromCharCode(event.keyCode);\r\n\r\n switch (key) {\r\n case \"W\":\r\n case \"D\":\r\n case \"S\":\r\n case \"A\":\r\n this.Movement(key);\r\n break;\r\n case \"R\":\r\n this.Restart();\r\n break;\r\n case \"F\":\r\n this.ToggleDisplay();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n Movement(key) {\r\n const opposite = {\r\n \"north\": \"south\",\r\n \"east\": \"west\",\r\n \"south\": \"north\",\r\n \"west\": \"east\"\r\n };\r\n const directions = {\r\n \"W\": \"north\",\r\n \"D\": \"east\",\r\n \"S\": \"south\",\r\n \"A\": \"west\"\r\n };\r\n\r\n if (directions[key] !== opposite[this.directionPrev]) {\r\n this.direction = directions[key];\r\n }\r\n }\r\n Update() {\r\n this.player.Move(this.direction);\r\n this.directionPrev = this.direction;\r\n for (let i = this.food.length - 1; i >= 0; i--) {\r\n if (this.food[i].Equal(this.player.Head())) {\r\n this.food.splice(i, 1);\r\n this.player.Grow();\r\n }\r\n }\r\n while (this.food.length < this.foodAmount &&\r\n (this.width - 2) * (this.height - 2) > this.food.length + this.player.body.length) {\r\n this.AddRandomFood();\r\n }\r\n if (CollisionCheckArrayVector2i([this.player.Head()], this.obstacles) ||\r\n CollisionCheckArrayVector2i([this.player.Head()], this.player.body.slice(1))) {\r\n clearInterval(this.intervalID);\r\n }\r\n this.forceUpdate();\r\n }\r\n SnakeSet(config) {\r\n this.config.width = Number.isInteger(config.width) && config.width > 0 ? config.width : this.config.width;\r\n this.config.height = Number.isInteger(config.height) && config.height > 0 ? config.height : this.config.height;\r\n this.config.length = Number.isInteger(config.length) && config.length > 1 ? config.length : this.config.length;\r\n this.config.food = Number.isInteger(config.food) && config.food > 0 ? config.food : this.config.food;\r\n this.config.interval = Number.isInteger(config.interval) && config.interval > 0 ? config.interval : this.config.interval;\r\n this.Restart();\r\n }\r\n AddRandomFood() {\r\n while (true) {\r\n const random = new Vector2i(\r\n RandomNumberGenerator(1, this.width - 2),\r\n RandomNumberGenerator(1, this.height - 2)\r\n );\r\n if (!CollisionCheckArrayVector2i([random], this.obstacles) &&\r\n !CollisionCheckArrayVector2i([random], this.player.body) &&\r\n !CollisionCheckArrayVector2i([random], this.food)) {\r\n this.food.push(random);\r\n return;\r\n }\r\n }\r\n }\r\n RenderCharacters() {\r\n const icon = {\r\n empty: '-',\r\n obstacle: 'H',\r\n food: 'X',\r\n snake: 'O',\r\n snakeHeadTemp: 'S'\r\n };\r\n let output = new Array(this.width * this.height).fill(icon.empty);\r\n let ChangeCharacter = (positions, icon) => {\r\n positions.forEach(position => {\r\n output[Vector2iToArrayIndex(position, this.width)] = icon;\r\n }, this);\r\n };\r\n ChangeCharacter(this.obstacles, icon.obstacle);\r\n ChangeCharacter(this.food, icon.food);\r\n ChangeCharacter(this.player.body, icon.snake);\r\n ChangeCharacter([this.player.Head()], icon.snakeHeadTemp);\r\n for (let i = this.height - 1; i > 0; i--) {\r\n output.splice(this.width * i, 0, '\\n');\r\n }\r\n output = reactStringReplace(output, new RegExp(\"(\" + icon.obstacle + \")\", \"g\"), () => {icon.obstacle});\r\n output = reactStringReplace(output, new RegExp(\"(\" + icon.food + \")\", \"g\"), () => {icon.food});\r\n output = reactStringReplace(output, new RegExp(\"(\" + icon.snake + \")\", \"g\"), () => {icon.snake});\r\n output = reactStringReplace(output, new RegExp(\"(\" + icon.snakeHeadTemp + \")\", \"g\"), () => {icon.snake});\r\n return (\r\n
\r\n
\r\n {output}\r\n
\r\n
\r\n );\r\n }\r\n RenderGraphics(sizeBlock, spacing) {\r\n const DivBlocks = (positions, color) => {\r\n return positions.map((position, index) => {\r\n const blocks = {\r\n top: ((position.y / this.height) * 100) + \"%\",\r\n left: ((position.x / this.width) * 100) + \"%\",\r\n width: (sizeBlock - spacing) + \"px\",\r\n height: (sizeBlock - spacing) + \"px\",\r\n position: \"absolute\",\r\n background: color\r\n };\r\n return
;\r\n })\r\n };\r\n const board = {\r\n width: this.width * sizeBlock,\r\n height: this.height * sizeBlock\r\n }\r\n return (\r\n
\r\n
\r\n {DivBlocks(this.obstacles, \"red\")}\r\n {DivBlocks(this.food, \"green\")}\r\n {DivBlocks(this.player.body.slice(1), \"skyblue\")}\r\n {DivBlocks([this.player.Head()], \"blue\")}\r\n
\r\n

\r\n
\r\n );\r\n }\r\n DisplayGame() {\r\n const size = this.isMobile ? 15 : 30;\r\n return this.toggleDisplay ? this.RenderGraphics(size, 1) : this.RenderCharacters();\r\n }\r\n}\r\n\r\nclass ConfigurationFormInput extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { ...this.props.config };\r\n this.temporary = { ...this.props.config };\r\n Object.keys(this.temporary).forEach(key => this.temporary[key] = \"\");\r\n }\r\n render() {\r\n return (\r\n
\r\n

\r\n Game configuration\r\n

\r\n {this.InputBox(\"Game width\", \"width\", \"input-responsive-pad-large\")}\r\n {this.InputBox(\"Game height\", \"height\", \"input-responsive-pad-small\")}\r\n {this.InputBox(\"Food amount\", \"food\", \"input-responsive-pad-small\")}\r\n {this.InputBox(\"Start length\", \"length\", \"\")}\r\n {this.InputBox(\"Update speed\", \"interval\", \"\")}\r\n \r\n
\r\n );\r\n }\r\n InputBox(text, key, classname) {\r\n return (\r\n \r\n \r\n \r\n {text}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n OnInputChange(event) {\r\n this.setState({\r\n [event.target.name]: event.target.value\r\n });\r\n this.temporary[event.target.name] = event.target.value;\r\n }\r\n OnClick() {\r\n this.props.SnakeSet({\r\n width: parseInt(this.state.width),\r\n height: parseInt(this.state.height),\r\n length: parseInt(this.state.length),\r\n food: parseInt(this.state.food),\r\n interval: parseInt(this.state.interval)\r\n });\r\n Object.keys(this.temporary).forEach(key => this.temporary[key] = \"\");\r\n }\r\n}\r\n\r\nclass Player {\r\n constructor(start, length) {\r\n this.body = new Array(length).fill(start);\r\n }\r\n Head() {\r\n return this.body[0];\r\n }\r\n Grow() {\r\n this.body.push(this.body[this.body.length - 1]);\r\n }\r\n Move(direction) {\r\n const movement =\r\n {\r\n \"north\": new Vector2i(0, -1),\r\n \"east\": new Vector2i(1, 0),\r\n \"south\": new Vector2i(0, 1),\r\n \"west\": new Vector2i(-1, 0)\r\n };\r\n for (let i = this.body.length - 1; i > 0; i--) {\r\n this.body[i] = { ...this.body[i - 1] };\r\n }\r\n this.Head().Add(movement[direction]);\r\n }\r\n}\r\n\r\nclass Vector2i {\r\n constructor(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n Add(other) {\r\n this.x += other.x;\r\n this.y += other.y;\r\n return this;\r\n }\r\n Equal(other) {\r\n return (\r\n this.x === other.x &&\r\n this.y === other.y\r\n );\r\n }\r\n}\r\n\r\nfunction RandomNumberGenerator(min, max) {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n}\r\nfunction Vector2iToArrayIndex(position, width) {\r\n return (position.y * width) + position.x;\r\n}\r\nfunction OnBorder(position, width, height) {\r\n return (\r\n position.x === 0 ||\r\n position.y === 0 ||\r\n position.x === width - 1 ||\r\n position.y === height - 1\r\n );\r\n}\r\nfunction BorderObstacles(width, height) {\r\n let obstacles = [];\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const position = new Vector2i(x, y);\r\n if (OnBorder(position, width, height)) {\r\n obstacles.push(position);\r\n }\r\n }\r\n }\r\n return obstacles;\r\n}\r\nfunction CollisionCheckArrayVector2i(first, second) {\r\n let collision = false;\r\n first.forEach(one => {\r\n second.forEach(two => {\r\n if (one.Equal(two)) {\r\n collision = true;\r\n }\r\n });\r\n });\r\n return collision;\r\n}\r\nconst reactStringReplace = require('react-string-replace');","import React, { Component } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Layout } from './components/Layout';\r\nimport { Home } from './components/Home';\r\nimport { AboutMe } from './components/AboutMe';\r\nimport { Overview } from './components/Overview';\r\nimport { Dungeoncrawler } from './components/Dungeoncrawler';\r\nimport { Snake } from './components/Snake';\r\nimport { Button, ButtonGroup } from 'reactstrap';\r\n\r\nexport default class App extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n language: \"sv\"\r\n };\r\n }\r\n\r\n LanguageSet( key ) {\r\n this.setState({ language: key });\r\n }\r\n\r\n ButtonToggleLanguage() {\r\n const colors = {\r\n On: \"deepskyblue\",\r\n Off: \"slategray\"\r\n }\r\n const styles = {\r\n Eng: { backgroundColor: this.state.language === \"en\" ? colors.On : colors.Off },\r\n Swe: { backgroundColor: this.state.language === \"sv\" ? colors.On : colors.Off },\r\n Position: {\r\n position: \"absolute\",\r\n bottom: \"0\",\r\n right: \"0\",\r\n margin: \"1px\"\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n \r\n {this.ButtonToggleLanguage()}\r\n
\r\n );\r\n }\r\n}","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register () {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport { unregister } from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\ndocument.body.style = 'background: #FAFAFA;';\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement\r\n);\r\nunregister();"],"sourceRoot":""}