Compare commits
	
		
			19 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5f81f55987 | |||
| 8bcab4661b | |||
| f2ec82762e | |||
| 0327bdc7a0 | |||
| b3b6731c09 | |||
| 36de0a3eb3 | |||
| 839c658075 | |||
| 12aa8eeb3e | |||
| b655ff2372 | |||
| 58adc6511a | |||
| 29c4b0013a | |||
| 8ed16adeff | |||
| 09219ff798 | |||
| d9cd552c89 | |||
| 2b82f8798c | |||
| d9715139cf | |||
| c731323b0b | |||
| 0d8db9f41f | |||
| 6706c9b0d1 | 
							
								
								
									
										44
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,13 +2,57 @@ | ||||
|  | ||||
| All notable changes to this project will be documented in this file. Dates are displayed in UTC. | ||||
|  | ||||
| #### [0.3.0](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.4...0.3.0) | ||||
|  | ||||
| - Added new "visits" page [`b655ff2`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/b655ff2372655d1fb7fa6cea8a10b193805f315c) | ||||
| - Added visits overview to sidebar [`36de0a3`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/36de0a3eb305317c829bace18a9661308c8cf0f3) | ||||
| - Added apiclient method [`839c658`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/839c65807524646c1c6a677f10042988fb2bccdf) | ||||
| - Added safeguard for random updates [`8bcab46`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/8bcab4661bec3c748cc65078e5187d936be9cdf9) | ||||
| - Fixed link to details [`f2ec827`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/f2ec82762e9bc107f29952709555bc3d893def49) | ||||
| - Enabled y scrolling (whyever that was disabled...) [`0327bdc`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/0327bdc7a0cefda343168c911faa51cd42271673) | ||||
| - Fixed typo in visits query [`b3b6731`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/b3b6731c09d47fff9df96903c75914e7042e28c5) | ||||
| - Missing copy-paste :D [`12aa8ee`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/12aa8eeb3e345ccee10bdb6abca93c5fd84a071a) | ||||
|  | ||||
| #### [0.2.4](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.3...0.2.4) | ||||
|  | ||||
| > 21 August 2021 | ||||
|  | ||||
| - 🚀RELEASE 0.2.4 [`58adc65`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/58adc6511aa1ee573abcf21a176131bf10354747) | ||||
| - Fixed logout redirect [`29c4b00`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/29c4b0013abb0466f59239ae3717f60216cecc1f) | ||||
| - Fixed details link [`8ed16ad`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/8ed16adeffed9e1368615caf6022d8a376337b8a) | ||||
|  | ||||
| #### [0.2.3](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.2...0.2.3) | ||||
|  | ||||
| > 21 August 2021 | ||||
|  | ||||
| - 🚀RELEASE 0.2.3 [`09219ff`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/09219ff7987e6088245d8a871e3a5aaca3f855fd) | ||||
| - Updated login text color [`d9cd552`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/d9cd552c89415625c22c1adcb892c5a789823ce9) | ||||
| - Fixed login replace [`2b82f87`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/2b82f8798cd23f15dc48a5375dc1f5ad1a3abbfd) | ||||
|  | ||||
| #### [0.2.2](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.1...0.2.2) | ||||
|  | ||||
| > 21 August 2021 | ||||
|  | ||||
| - 🚀RELEASE 0.2.2 [`d971513`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/d9715139cf0c5583cb1db43953c34e3293345f68) | ||||
| - Fixxed routing links [`c731323`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/c731323b0bd1b757297b601e7bbc3f5034c04e9c) | ||||
|  | ||||
| #### [0.2.1](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.0...0.2.1) | ||||
|  | ||||
| > 21 August 2021 | ||||
|  | ||||
| - 🚀RELEASE 0.2.1 [`0d8db9f`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/0d8db9f41f84ccaba3211d61e6521d57f43e1b88) | ||||
| - Static links (yay) [`6706c9b`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/6706c9b0d1e396b0c6df6bb9b05d2d25c2a45cba) | ||||
|  | ||||
| #### [0.2.0](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.1.3...0.2.0) | ||||
|  | ||||
| > 21 August 2021 | ||||
|  | ||||
| - Added comments to fix [`#1`](https://git.odit.services/kauft.es/linkylinky-dashboard/issues/1) | ||||
| - More userstore fixes [`84ab757`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/84ab757e1159eac3cd160aac158873deaf51bb3f) | ||||
| - Added comments to apiclient [`47f7583`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/47f75836597ff13a32660e03d61629ddd173f86c) | ||||
| - No longer showing logged out users the profile pic thingy [`2010cc3`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/2010cc326019085ca37fcdc8b8dab8445006b6fa) | ||||
| - Weired fucking fix for the userstore data not being instantly loaded.... [`cd3508d`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/cd3508dcb61f165a7c83d6f0f9332f799677cb9f) | ||||
| - 🚀RELEASE 0.2.0 [`0dc6fe6`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/0dc6fe670498b6d1022a1ef6c4e5c4b3fcd7e352) | ||||
| - First mitigations for localforage error stuff [`4f5b7f3`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/4f5b7f38fb625e4da0ea3f432df958029ee8d25c) | ||||
| - Now ignoring status on logout [`8c1a2d3`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/8c1a2d319b9fb6e63c3e27163392bad1becba8dd) | ||||
| - Removed unused function [`b57aa53`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/b57aa535de94e22f19754b729cc6b63166a07a9d) | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "@odit/linkylinky-dashboard", | ||||
| 	"version": "0.2.0", | ||||
| 	"version": "0.3.0", | ||||
| 	"scripts": { | ||||
| 		"dev": "svelte-kit dev", | ||||
| 		"build": "svelte-kit build", | ||||
|   | ||||
| @@ -62,6 +62,18 @@ export default class Apiclient { | ||||
| 		).data; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * API-Getter for the linkylinky api all vists endpoint (needs auth) | ||||
| 	 * @returns Url visit details for each visit in an array of objects. | ||||
| 	 */ | ||||
| 	static async getVisits() { | ||||
| 		return ( | ||||
| 			await axios.get(`https://kauft.es/api/visits`, { | ||||
| 				headers: { Authorization: `Bearer ${UserStore.state.token}` } | ||||
| 			}) | ||||
| 		).data; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * API-Delet for the linkylinky api url deletion endpoint (needs auth) | ||||
| 	 * @param {*} shortcode The shortcode of your most hated url | ||||
|   | ||||
| @@ -46,7 +46,7 @@ | ||||
| 		<nav> | ||||
| 			<a | ||||
| 				class="flex items-center px-4 py-2 text-gray-700 bg-gray-200 rounded-md dark:bg-gray-700 dark:text-gray-200" | ||||
| 				href="/" | ||||
| 				href="./" | ||||
| 			> | ||||
| 				<svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> | ||||
| 					<path | ||||
| @@ -66,7 +66,7 @@ | ||||
| 			{#if logged_in} | ||||
| 				<a | ||||
| 					class="flex items-center px-4 py-2 mt-5 text-gray-600 transition-colors duration-200 transform rounded-md dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 dark:hover:text-gray-200 hover:text-gray-700" | ||||
| 					href="/links" | ||||
| 					href="./links" | ||||
| 				> | ||||
| 					<svg | ||||
| 						xmlns="http://www.w3.org/2000/svg" | ||||
| @@ -85,6 +85,33 @@ | ||||
|  | ||||
| 					<span class="mx-4 font-medium">Manage Links</span> | ||||
| 				</a> | ||||
| 				<a | ||||
| 					class="flex items-center px-4 py-2 mt-5 text-gray-600 transition-colors duration-200 transform rounded-md dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 dark:hover:text-gray-200 hover:text-gray-700" | ||||
| 					href="./visits" | ||||
| 				> | ||||
| 					<svg | ||||
| 						xmlns="http://www.w3.org/2000/svg" | ||||
| 						class="h-5 w-5" | ||||
| 						fill="none" | ||||
| 						viewBox="0 0 24 24" | ||||
| 						stroke="currentColor" | ||||
| 					> | ||||
| 						<path | ||||
| 							stroke-linecap="round" | ||||
| 							stroke-linejoin="round" | ||||
| 							stroke-width="2" | ||||
| 							d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" | ||||
| 						/> | ||||
| 						<path | ||||
| 							stroke-linecap="round" | ||||
| 							stroke-linejoin="round" | ||||
| 							stroke-width="2" | ||||
| 							d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" | ||||
| 						/> | ||||
| 					</svg> | ||||
|  | ||||
| 					<span class="mx-4 font-medium">All Visits</span> | ||||
| 				</a> | ||||
|  | ||||
| 				<!-- <a | ||||
| 					class="flex items-center px-4 py-2 mt-5 text-gray-600 transition-colors duration-200 transform rounded-md dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 dark:hover:text-gray-200 hover:text-gray-700" | ||||
| @@ -133,7 +160,7 @@ | ||||
| 			{:else} | ||||
| 				<a | ||||
| 					class="flex items-center px-4 py-2 mt-5 text-gray-600 transition-colors duration-200 transform rounded-md dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 dark:hover:text-gray-200 hover:text-gray-700" | ||||
| 					href="/login" | ||||
| 					href="./login" | ||||
| 				> | ||||
| 					<svg | ||||
| 						xmlns="http://www.w3.org/2000/svg" | ||||
| @@ -162,7 +189,9 @@ | ||||
| 					src="https://images.unsplash.com/photo-1531427186611-ecfd6d936c79?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=634&q=80" | ||||
| 					alt="avatar" | ||||
| 				/> | ||||
| 				<h4 class="mx-2 font-medium text-gray-800 dark:text-gray-200 hover:underline">Username here</h4> | ||||
| 				<h4 class="mx-2 font-medium text-gray-800 dark:text-gray-200 hover:underline"> | ||||
| 					Username here | ||||
| 				</h4> | ||||
| 			</div> | ||||
| 		{/if} | ||||
| 	</div> | ||||
|   | ||||
| @@ -46,7 +46,7 @@ const userStore = () => { | ||||
|                 // | ||||
|                 return state; | ||||
|             }); | ||||
|             location.replace("/"); | ||||
|             location.replace("./"); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
| <div style="min-height: 640px;" class="bg-white dark:bg-gray-800"> | ||||
| 	<div class="h-screen flex overflow-hidden"> | ||||
| 		<Sidebar /> | ||||
| 		<div class="px-4 py-8 flex flex-col w-0 flex-1 overflow-hidden"> | ||||
| 		<div class="px-4 py-8 flex flex-col w-0 flex-1 overflow-y-scroll"> | ||||
| 			<slot /> | ||||
| 		</div> | ||||
| 	</div> | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|  | ||||
| 	// Yes i know this isn't the best way to implement this, but linkylinky dashboard is just a oneshot sideproject r/n. | ||||
| 	const unsubscribe = UserStore.subscribe((value) => { | ||||
| 		if (value.isLoggedIn) { | ||||
| 		if (value.isLoggedIn && urls.length == 0) { | ||||
| 			urlQuery = Apiclient.getUrls().then((res) => { | ||||
| 				urls = res; | ||||
| 			}); | ||||
| @@ -82,7 +82,7 @@ | ||||
| 								Delete | ||||
| 							</button> | ||||
| 							<a | ||||
| 								href={`/details?shortcode=${url.shortcode}`} | ||||
| 								href={`./details?shortcode=${url.shortcode}`} | ||||
| 								class="px-4 py-2 font-medium tracking-wide text-white capitalize transition-colors duration-200 transform bg-blue-600 rounded-md hover:bg-blue-700 focus:outline-none focus:bg-blue-700" | ||||
| 							> | ||||
| 								Details | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import Apiclient from '$lib/Apiclient'; | ||||
| 		try { | ||||
| 			const login = await Apiclient.login(username, password); | ||||
| 			UserStore.login(login); | ||||
| 			location.replace("/"); | ||||
| 			location.replace("./"); | ||||
| 		} catch (error) { | ||||
| 			 | ||||
| 		} | ||||
| @@ -30,7 +30,7 @@ import Apiclient from '$lib/Apiclient'; | ||||
|  | ||||
| 			<div class="w-full mt-4"> | ||||
| 				<input | ||||
| 					class="block w-full px-4 py-2 mt-2 text-gray-700 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring" | ||||
| 					class="block w-full px-4 py-2 mt-2 text-gray-700 dark:text-gray-400 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring" | ||||
| 					type="text" | ||||
| 					placeholder="Username" | ||||
| 					aria-label="Username" | ||||
| @@ -40,7 +40,7 @@ import Apiclient from '$lib/Apiclient'; | ||||
|  | ||||
| 			<div class="w-full mt-4"> | ||||
| 				<input | ||||
| 					class="block w-full px-4 py-2 mt-2 text-gray-700 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring" | ||||
| 					class="block w-full px-4 py-2 mt-2 text-gray-700 dark:text-gray-400 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring" | ||||
| 					type="password" | ||||
| 					placeholder="Password" | ||||
| 					aria-label="Password" | ||||
|   | ||||
							
								
								
									
										69
									
								
								src/routes/visits.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/routes/visits.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| <script> | ||||
| 	import Apiclient from '$lib/Apiclient'; | ||||
| 	import UserStore from '$lib/UserStore'; | ||||
| 	import { onDestroy } from 'svelte'; | ||||
|  | ||||
| 	$: visits = []; | ||||
| 	let visitQuery; | ||||
|  | ||||
| 	// Yes i know this isn't the best way to implement this, but linkylinky dashboard is just a oneshot sideproject r/n. | ||||
| 	const unsubscribe = UserStore.subscribe((value) => { | ||||
| 		if (value.isLoggedIn && visits.length == 0) { | ||||
| 			visitQuery = Apiclient.getVisits().then((res) => { | ||||
| 				visits = res; | ||||
| 			}); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	onDestroy(unsubscribe); | ||||
| </script> | ||||
|  | ||||
| <h2 class="text-3xl font-bold text-gray-800 dark:text-gray-100 pb-6">View all visits</h2> | ||||
| <div class="rounded-xl"> | ||||
| 	<table class="min-w-full divide-y divide-gray-200"> | ||||
| 		<thead class="bg-gray-50 dark:bg-gray-900 text-gray-800 dark:text-gray-100"> | ||||
| 			<tr> | ||||
| 				<th scope="col" class="px-6 py-3 text-left text-xs font-medium  uppercase tracking-wider"> | ||||
| 					Shortcode | ||||
| 				</th> | ||||
| 				<th scope="col" class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider"> | ||||
| 					Provider | ||||
| 				</th> | ||||
| 				<th scope="col" class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider"> | ||||
| 					Timestamp | ||||
| 				</th> | ||||
| 			</tr> | ||||
| 		</thead> | ||||
| 		<tbody class="bg-white dark:bg-gray-700 divide-y divide-gray-200 dark:text-gray-100" x-max="1"> | ||||
| 			{#await visitQuery} | ||||
| 				<tr> | ||||
| 					<td | ||||
| 						class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900 dark:text-gray-200" | ||||
| 					> | ||||
| 						Loading data... | ||||
| 					</td> | ||||
| 					<td class="px-6 py-4 whitespace-nowrap text-sm"> Loading data... </td> | ||||
| 					<td class="px-6 py-4 whitespace-nowrap text-sm"> Loading data... </td> | ||||
| 				</tr> | ||||
| 			{:then} | ||||
| 				{#each visits as visit} | ||||
| 					<tr> | ||||
| 						<td | ||||
| 							class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900 dark:text-gray-200" | ||||
| 						> | ||||
|                             {#if visit.provider == "native"} | ||||
| 							<a href={`./details?shortcode=${visit.shortcode}`}>{visit.shortcode}</a> | ||||
|                             {:else} | ||||
|                                 {visit.shortcode} | ||||
|                             {/if} | ||||
| 						</td> | ||||
| 						<td class="px-6 py-4 whitespace-nowrap text-sm"> | ||||
| 							{visit.provider} | ||||
| 						</td> | ||||
| 						<td class="px-6 py-4 whitespace-nowrap text-sm"> {visit.timestamp} </td> | ||||
| 					</tr> | ||||
| 				{/each} | ||||
| 			{/await} | ||||
| 		</tbody> | ||||
| 	</table> | ||||
| </div> | ||||
		Reference in New Issue
	
	Block a user