Mercurial Hosting > linkmystyle
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