| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | import { IncomingMessage } from "connect"; | 
					
						
							| 
									
										
										
										
											2022-02-23 15:04:45 -09:00
										 |  |  | import { useDark } from "@vueuse/core"; | 
					
						
							|  |  |  | import { useContext } from "@nuxtjs/composition-api"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const useToggleDarkMode = () => { | 
					
						
							|  |  |  |   const isDark = useDark(); | 
					
						
							|  |  |  |   const { $vuetify } = useContext(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function toggleDark() { | 
					
						
							|  |  |  |     isDark.value = !$vuetify.theme.dark; | 
					
						
							|  |  |  |     $vuetify.theme.dark = !$vuetify.theme.dark; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return toggleDark; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 15:12:25 -08:00
										 |  |  | export const useAsyncKey = function () { | 
					
						
							|  |  |  |   return String(Date.now()); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-22 15:32:13 -09:00
										 |  |  | export const titleCase = function (str: string) { | 
					
						
							|  |  |  |   return str | 
					
						
							|  |  |  |     .split(" ") | 
					
						
							|  |  |  |     .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) | 
					
						
							|  |  |  |     .join(" "); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | export function detectServerBaseUrl(req?: IncomingMessage | null) { | 
					
						
							| 
									
										
										
										
											2021-12-06 17:14:14 -09:00
										 |  |  |   if (!req || req === undefined) { | 
					
						
							|  |  |  |     return ""; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (req.headers.referer) { | 
					
						
							|  |  |  |     const url = new URL(req.headers.referer); | 
					
						
							|  |  |  |     return `${url.protocol}//${url.host}`; | 
					
						
							|  |  |  |   } else if (req.headers.host) { | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     // TODO Socket.encrypted doesn't exist. What is needed here?
 | 
					
						
							| 
									
										
										
										
											2022-01-16 03:38:11 +01:00
										 |  |  |     // @ts-ignore See above
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     const protocol = req.socket.encrypted ? "https:" : "http:"; | 
					
						
							| 
									
										
										
										
											2021-12-06 17:14:14 -09:00
										 |  |  |     return `${protocol}//${req.headers.host}`; | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |   } else if (req.socket.remoteAddress) { | 
					
						
							| 
									
										
										
										
											2022-01-16 03:38:11 +01:00
										 |  |  |     // @ts-ignore See above
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     const protocol = req.socket.encrypted ? "https:" : "http:"; | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |     return `${protocol}//${req.socket.localAddress || ""}:${req.socket.localPort || ""}`; | 
					
						
							| 
									
										
										
										
											2021-12-06 17:14:14 -09:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ""; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  | export function uuid4() { | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |   return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => | 
					
						
							|  |  |  |     (parseInt(c) ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (parseInt(c) / 4)))).toString(16) | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  |   ); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // https://stackoverflow.com/questions/28876300/deep-copying-array-of-nested-objects-in-javascript
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | export function deepCopy<T>(obj: T): T { | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  |   let rv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   switch (typeof obj) { | 
					
						
							|  |  |  |     case "object": | 
					
						
							|  |  |  |       if (obj === null) { | 
					
						
							|  |  |  |         // null => null
 | 
					
						
							|  |  |  |         rv = null; | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |         switch (Object.prototype.toString.call(obj)) { | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  |           case "[object Array]": | 
					
						
							|  |  |  |             // It's an array, create a new array with
 | 
					
						
							|  |  |  |             // deep copies of the entries
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |             rv = (obj as unknown as Array<unknown>).map(deepCopy); | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  |             break; | 
					
						
							|  |  |  |           case "[object Date]": | 
					
						
							|  |  |  |             // Clone the date
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |             rv = new Date(obj as unknown as Date); | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  |             break; | 
					
						
							|  |  |  |           case "[object RegExp]": | 
					
						
							|  |  |  |             // Clone the RegExp
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |             rv = new RegExp(obj as unknown as RegExp); | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  |             break; | 
					
						
							|  |  |  |           // ...probably a few others
 | 
					
						
							|  |  |  |           default: | 
					
						
							|  |  |  |             // Some other kind of object, deep-copy its
 | 
					
						
							|  |  |  |             // properties into a new object
 | 
					
						
							|  |  |  |             rv = Object.keys(obj).reduce(function (prev, key) { | 
					
						
							| 
									
										
										
										
											2022-01-16 03:38:11 +01:00
										 |  |  |               // @ts-ignore This is hard to make type-safe
 | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  |               prev[key] = deepCopy(obj[key]); | 
					
						
							|  |  |  |               return prev; | 
					
						
							|  |  |  |             }, {}); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       // It's a primitive, copy via assignment
 | 
					
						
							|  |  |  |       rv = obj; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |   return rv as T; | 
					
						
							| 
									
										
										
										
											2021-11-06 14:32:55 -08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function downloadAsJson(data: any, filename: string) { | 
					
						
							|  |  |  |   const content = JSON.stringify(data); | 
					
						
							|  |  |  |   const blob = new Blob([content], { type: "application/json" }); | 
					
						
							|  |  |  |   const url = URL.createObjectURL(blob); | 
					
						
							|  |  |  |   const a = document.createElement("a"); | 
					
						
							|  |  |  |   a.download = filename; | 
					
						
							|  |  |  |   a.href = url; | 
					
						
							|  |  |  |   a.click(); | 
					
						
							|  |  |  |   URL.revokeObjectURL(url); | 
					
						
							|  |  |  | } |