diff src/lib/Icon.luan @ 0:8f4df159f06b

start public repo
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 11 Jul 2025 20:57:49 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/Icon.luan	Fri Jul 11 20:57:49 2025 -0600
@@ -0,0 +1,167 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local ipairs = Luan.ipairs or error()
+local Number = require "luan:Number.luan"
+local long = Number.long or error()
+local float = Number.float or error()
+local Db = require "site:/lib/Db.luan"
+
+
+local Icon = {}
+
+local icon_names = {
+	applemusic = {
+		title = "Apple Music"
+		placeholder = "https://music.apple.com/"
+	}
+	cashapp = {
+		title = "Cashapp"
+		placeholder = "https://cash.app/$username"
+	}
+	discord = {
+		title = "Discord"
+		placeholder = "https://discord.com/invite/yourchannel"
+	}
+	email = {
+		title = "Email"
+		placeholder = "you@email.com"
+		type = "email"
+	}
+	facebook = {
+		title = "Facebook"
+		placeholder = "https://facebook.com/facebookpageurl"
+	}
+	instagram = {
+		title = "Instagram"
+		placeholder = "https://www.instagram.com/username"
+	}
+	patreon = {
+		title = "Patreon"
+		placeholder = "https://patreon.com/"
+	}
+	pinterest = {
+		title = "Pinterest"
+		placeholder = "https://www.pinterest.com/username/"
+	}
+	paypal = {
+		title = "PayPal"
+		placeholder = "https://www.paypal.me/username"
+	}
+	reddit = {
+		title = "Reddit"
+		placeholder = "https://www.reddit.com/"
+	}
+	snapchat = {
+		title = "Snapchat"
+		placeholder = "https://www.snapchat.com/add/username"
+	}
+	soundcloud = {
+		title = "SoundCloud"
+		placeholder = "https://soundcloud.com/username"
+	}
+	spotify = {
+		title = "Spotify"
+		placeholder = "https://open.spotify.com/artist/artistname"
+	}
+	threads = {
+		title = "Threads"
+		placeholder = "https://www.threads.net/@username"
+	}
+	tiktok = {
+		title = "TikTok"
+		placeholder = "https://www.tiktok.com/@username"
+	}
+	twitch = {
+		title = "Twitch"
+		placeholder = "https://twitch.tv/"
+	}
+	twitter = {
+		title = "Twitter"
+		placeholder = "https://twitter.com/username"
+	}
+	youtube = {
+		title = "YouTube"
+		placeholder = "https://youtube.com/channel/youtubechannelurl"
+	}
+}
+Icon.icon_names = icon_names
+
+local function from_doc(doc)
+	doc.type == "icon" or error "wrong type"
+	return Icon.new {
+		id = doc.id
+		name = doc.icon_name
+		url = doc.url
+		user_id = doc.icon_user_id
+		order = doc.icon_order
+	}
+end
+Icon.from_doc = from_doc
+
+local function to_doc(icon)
+	return {
+		type = "icon"
+		id = icon.id
+		icon_name = icon.name or error()
+		url = icon.url or error()
+		icon_user_id = long(icon.user_id)
+		icon_order = float(icon.order)
+	}
+end
+
+function Icon.new(icon)
+
+	function icon.save()
+		local doc = to_doc(icon)
+		Db.save(doc)
+		icon.id = doc.id
+	end
+
+	function icon.title_attr()
+		return [[title="]]..icon_names[icon.name].title..[["]]
+	end
+
+	function icon.move_after(prev)
+		local icons = Icon.get_user_icons(icon.user_id)
+		if prev == nil then
+			icon.order = icons[1].order - 1
+		else
+			icon.owner_id==prev.owner_id or error()
+			for i, x in ipairs(icons) do
+				if prev.id == x.id then
+					if i == #icons then
+						icon.order = prev.order + 1
+					else
+						local next = icons[i+1]
+						icon.order = (prev.order + next.order) / 2
+					end
+					return
+				end
+			end
+			error()
+		end
+	end
+
+	return icon
+end
+
+function Icon.get_by_id(id)
+	local doc = Db.get_document("id:"..id)
+	return doc and from_doc(doc)
+end
+
+local function from_docs(docs)
+	local icons = {}
+	for _, doc in ipairs(docs) do
+		local icon = from_doc(doc)
+		icons[#icons+1] = icon
+	end
+	return icons
+end
+
+function Icon.get_user_icons(user_id)
+	local docs = Db.search("icon_user_id:"..user_id,1,1000,{sort="icon_order"})
+	return from_docs(docs)
+end
+
+return Icon