{"id":15177649,"url":"https://github.com/bamof25th/ip-tracker","last_synced_at":"2026-03-09T02:32:31.528Z","repository":{"id":255222241,"uuid":"848903774","full_name":"Bamof25th/Ip-tracker","owner":"Bamof25th","description":"📌 A website to track and obtain information based on an IP address or a domain","archived":false,"fork":false,"pushed_at":"2024-08-28T18:55:41.000Z","size":5155,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-16T17:18:56.179Z","etag":null,"topics":["api","api-integeration","leflet","react","react-leaflet","tyepscript"],"latest_commit_sha":null,"homepage":"https://ip-tracker-xcpn-gmr3v6g3s-bamof25ths-projects.vercel.app/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Bamof25th.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-28T16:07:11.000Z","updated_at":"2024-10-16T19:40:41.000Z","dependencies_parsed_at":"2024-08-28T18:16:38.124Z","dependency_job_id":"69eb767e-379f-4b8f-b899-0f18e647e8d2","html_url":"https://github.com/Bamof25th/Ip-tracker","commit_stats":{"total_commits":11,"total_committers":1,"mean_commits":11.0,"dds":0.0,"last_synced_commit":"c89fea337179e94ac614583cf29df6d1cd57c561"},"previous_names":["bamof25th/ip-tracker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bamof25th%2FIp-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bamof25th%2FIp-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bamof25th%2FIp-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bamof25th%2FIp-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Bamof25th","download_url":"https://codeload.github.com/Bamof25th/Ip-tracker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":232542067,"owners_count":18539150,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-integeration","leflet","react","react-leaflet","tyepscript"],"created_at":"2024-09-27T14:41:35.632Z","updated_at":"2025-12-08T02:04:31.136Z","avatar_url":"https://github.com/Bamof25th.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IP address tracker\n\n📍A website to track and obtain information based on an IP address or a domain. This is a solution to the [IP address tracker challenge on Frontend Mentor](https://www.frontendmentor.io/challenges/ip-address-tracker-I8-0yYAH0). To get the IP Address info I used the [IP Geolocation API by IPify](https://geo.ipify.org/). To generate the map I used [LeafletJS](https://leafletjs.com/).\n\n [Live Page][live-page]\n\n\u003c/div\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eTable of contents\u003c/summary\u003e\n\n- [Overview](#overview)\n  - [The challenge](#the-challenge)\n  - [Screenshots](#screenshots)\n  - [Links](#links)\n- [My process](#my-process)\n  - [Built with](#built-with)\n  - [What I learned](#what-i-learned)\n  - [Useful resources](#useful-resources)\n- [Author](#author)\n\n\u003c/details\u003e\n\n## Overview\n\n### The challenge\n\nUsers should be able to:\n\n- View the optimal layout for each page depending on their device's screen size\n- See hover states for all interactive elements on the page\n- See their own IP address on the map on the initial page load\n- Search for any IP addresses or domains and see the key information and location\n\n\n\n### Links\n\n- [Live Page][live-page]\n\n## My process\n\n### Built with\n\n- [React](https://reactjs.org/) - JS library\n- [Styled Components](https://styled-components.com/) - For styles\n- [Vitejs](https://vitejs.dev)\n- [Axios](https://axios-http.com)\n- [LeafletJS](https://leafletjs.com/) - For map generation\n- [IP Geolocation API by IPify](https://geo.ipify.org/) - To obtain the information of the IP or domain\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### What I learned\n\nThis challenge in particular was easy except for one thing: updating the map when getting the information, in the official Leaflet documentation it is made clear that the map is immutable, so I decided to investigate and found [React Leaflet](https://react-leaflet.js.org), which made it much easier for me. To update the map I used React's key.\n\nAt the end the code of the map is as follows:\n\n```js\n\u003cMapContainer\n  key={JSON.stringify([info.location.lat, info.location.lng])}\n  center={[info.location.lat || 0, info.location.lng || 0]}\n  zoom={17.5}\n  id=\"map\"\n\u003e\n  \u003cTileLayer\n    attribution='\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors'\n    url=\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n  /\u003e\n  \u003cMarker\n    position={[info.location.lat || 0, info.location.lng || 0]}\n    icon={locationIcon}\n  \u003e\u003c/Marker\u003e\n\u003c/MapContainer\u003e\n```\n\n\n\n### Useful resources\n\n- [React Leaflet](https://react-leaflet.js.org) - Made it easy for me to use leaflet in React\n\n\n\n\n\n[live-page]: https://ip-tracker-xcpn.vercel.app/\n\n\n# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default tseslint.config({\n  languageOptions: {\n    // other options...\n    parserOptions: {\n      project: [\"./tsconfig.node.json\", \"./tsconfig.app.json\"],\n      tsconfigRootDir: import.meta.dirname,\n    },\n  },\n});\n```\n\n- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked`\n- Optionally add `...tseslint.configs.stylisticTypeChecked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config:\n\n```js\n// eslint.config.js\nimport react from \"eslint-plugin-react\";\n\nexport default tseslint.config({\n  // Set the react version\n  settings: { react: { version: \"18.3\" } },\n  plugins: {\n    // Add the react plugin\n    react,\n  },\n  rules: {\n    // other rules...\n    // Enable its recommended rules\n    ...react.configs.recommended.rules,\n    ...react.configs[\"jsx-runtime\"].rules,\n  },\n});\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbamof25th%2Fip-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbamof25th%2Fip-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbamof25th%2Fip-tracker/lists"}