Mercurial Hosting > linkmystyle
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:8f4df159f06b |
|---|---|
| 1 local Luan = require "luan:Luan.luan" | |
| 2 local error = Luan.error | |
| 3 local ipairs = Luan.ipairs or error() | |
| 4 local Number = require "luan:Number.luan" | |
| 5 local long = Number.long or error() | |
| 6 local float = Number.float or error() | |
| 7 local Db = require "site:/lib/Db.luan" | |
| 8 | |
| 9 | |
| 10 local Icon = {} | |
| 11 | |
| 12 local icon_names = { | |
| 13 applemusic = { | |
| 14 title = "Apple Music" | |
| 15 placeholder = "https://music.apple.com/" | |
| 16 } | |
| 17 cashapp = { | |
| 18 title = "Cashapp" | |
| 19 placeholder = "https://cash.app/$username" | |
| 20 } | |
| 21 discord = { | |
| 22 title = "Discord" | |
| 23 placeholder = "https://discord.com/invite/yourchannel" | |
| 24 } | |
| 25 email = { | |
| 26 title = "Email" | |
| 27 placeholder = "you@email.com" | |
| 28 type = "email" | |
| 29 } | |
| 30 facebook = { | |
| 31 title = "Facebook" | |
| 32 placeholder = "https://facebook.com/facebookpageurl" | |
| 33 } | |
| 34 instagram = { | |
| 35 title = "Instagram" | |
| 36 placeholder = "https://www.instagram.com/username" | |
| 37 } | |
| 38 patreon = { | |
| 39 title = "Patreon" | |
| 40 placeholder = "https://patreon.com/" | |
| 41 } | |
| 42 pinterest = { | |
| 43 title = "Pinterest" | |
| 44 placeholder = "https://www.pinterest.com/username/" | |
| 45 } | |
| 46 paypal = { | |
| 47 title = "PayPal" | |
| 48 placeholder = "https://www.paypal.me/username" | |
| 49 } | |
| 50 reddit = { | |
| 51 title = "Reddit" | |
| 52 placeholder = "https://www.reddit.com/" | |
| 53 } | |
| 54 snapchat = { | |
| 55 title = "Snapchat" | |
| 56 placeholder = "https://www.snapchat.com/add/username" | |
| 57 } | |
| 58 soundcloud = { | |
| 59 title = "SoundCloud" | |
| 60 placeholder = "https://soundcloud.com/username" | |
| 61 } | |
| 62 spotify = { | |
| 63 title = "Spotify" | |
| 64 placeholder = "https://open.spotify.com/artist/artistname" | |
| 65 } | |
| 66 threads = { | |
| 67 title = "Threads" | |
| 68 placeholder = "https://www.threads.net/@username" | |
| 69 } | |
| 70 tiktok = { | |
| 71 title = "TikTok" | |
| 72 placeholder = "https://www.tiktok.com/@username" | |
| 73 } | |
| 74 twitch = { | |
| 75 title = "Twitch" | |
| 76 placeholder = "https://twitch.tv/" | |
| 77 } | |
| 78 twitter = { | |
| 79 title = "Twitter" | |
| 80 placeholder = "https://twitter.com/username" | |
| 81 } | |
| 82 youtube = { | |
| 83 title = "YouTube" | |
| 84 placeholder = "https://youtube.com/channel/youtubechannelurl" | |
| 85 } | |
| 86 } | |
| 87 Icon.icon_names = icon_names | |
| 88 | |
| 89 local function from_doc(doc) | |
| 90 doc.type == "icon" or error "wrong type" | |
| 91 return Icon.new { | |
| 92 id = doc.id | |
| 93 name = doc.icon_name | |
| 94 url = doc.url | |
| 95 user_id = doc.icon_user_id | |
| 96 order = doc.icon_order | |
| 97 } | |
| 98 end | |
| 99 Icon.from_doc = from_doc | |
| 100 | |
| 101 local function to_doc(icon) | |
| 102 return { | |
| 103 type = "icon" | |
| 104 id = icon.id | |
| 105 icon_name = icon.name or error() | |
| 106 url = icon.url or error() | |
| 107 icon_user_id = long(icon.user_id) | |
| 108 icon_order = float(icon.order) | |
| 109 } | |
| 110 end | |
| 111 | |
| 112 function Icon.new(icon) | |
| 113 | |
| 114 function icon.save() | |
| 115 local doc = to_doc(icon) | |
| 116 Db.save(doc) | |
| 117 icon.id = doc.id | |
| 118 end | |
| 119 | |
| 120 function icon.title_attr() | |
| 121 return [[title="]]..icon_names[icon.name].title..[["]] | |
| 122 end | |
| 123 | |
| 124 function icon.move_after(prev) | |
| 125 local icons = Icon.get_user_icons(icon.user_id) | |
| 126 if prev == nil then | |
| 127 icon.order = icons[1].order - 1 | |
| 128 else | |
| 129 icon.owner_id==prev.owner_id or error() | |
| 130 for i, x in ipairs(icons) do | |
| 131 if prev.id == x.id then | |
| 132 if i == #icons then | |
| 133 icon.order = prev.order + 1 | |
| 134 else | |
| 135 local next = icons[i+1] | |
| 136 icon.order = (prev.order + next.order) / 2 | |
| 137 end | |
| 138 return | |
| 139 end | |
| 140 end | |
| 141 error() | |
| 142 end | |
| 143 end | |
| 144 | |
| 145 return icon | |
| 146 end | |
| 147 | |
| 148 function Icon.get_by_id(id) | |
| 149 local doc = Db.get_document("id:"..id) | |
| 150 return doc and from_doc(doc) | |
| 151 end | |
| 152 | |
| 153 local function from_docs(docs) | |
| 154 local icons = {} | |
| 155 for _, doc in ipairs(docs) do | |
| 156 local icon = from_doc(doc) | |
| 157 icons[#icons+1] = icon | |
| 158 end | |
| 159 return icons | |
| 160 end | |
| 161 | |
| 162 function Icon.get_user_icons(user_id) | |
| 163 local docs = Db.search("icon_user_id:"..user_id,1,1000,{sort="icon_order"}) | |
| 164 return from_docs(docs) | |
| 165 end | |
| 166 | |
| 167 return Icon |
