view 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 source

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