|
1 | 1 | import ajax from "@deadlyjack/ajax"; |
2 | 2 | import "./style.scss"; |
3 | 3 | import Page from "components/page"; |
| 4 | +import toast from "components/toast"; |
4 | 5 | import Ref from "html-tag-js/ref"; |
5 | 6 | import actionStack from "lib/actionStack"; |
6 | 7 | import constants from "lib/constants"; |
@@ -110,48 +111,72 @@ export default function Sponsors() { |
110 | 111 | app.append(page); |
111 | 112 |
|
112 | 113 | async function render() { |
| 114 | + let sponsors = []; |
113 | 115 | try { |
114 | 116 | const res = await ajax.get(`${constants.API_BASE}/sponsors`); |
115 | 117 | if (res.error) { |
116 | | - helpers.error(res.error); |
| 118 | + toast("Unable to load sponsors..."); |
| 119 | + console.error("Error loading sponsors:", res.error); |
117 | 120 | } else { |
118 | | - titaniumSponsors.content = ""; |
119 | | - platinumSponsors.content = ""; |
120 | | - goldSponsors.content = ""; |
121 | | - silverSponsors.content = ""; |
122 | | - bronzeSponsors.content = ""; |
123 | | - crystalSponsors.content = ""; |
124 | | - |
125 | | - for (const sponsor of res) { |
126 | | - // Append each sponsor to the corresponding tier |
127 | | - switch (sponsor.tier) { |
128 | | - case "titanium": |
129 | | - titaniumSponsors.append(<SponsorCard {...sponsor} />); |
130 | | - break; |
131 | | - case "platinum": |
132 | | - platinumSponsors.append(<SponsorCard {...sponsor} />); |
133 | | - break; |
134 | | - case "gold": |
135 | | - goldSponsors.append(<SponsorCard {...sponsor} />); |
136 | | - break; |
137 | | - case "silver": |
138 | | - silverSponsors.append(<SponsorCard {...sponsor} />); |
139 | | - break; |
140 | | - case "bronze": |
141 | | - bronzeSponsors.append(<SponsorCard {...sponsor} />); |
142 | | - break; |
143 | | - case "crystal": |
144 | | - crystalSponsors.append(<SponsorCard {...sponsor} />); |
145 | | - break; |
146 | | - } |
147 | | - } |
| 121 | + sponsors = res; |
| 122 | + localStorage.setItem("cached_sponsors", JSON.stringify(sponsors)); |
148 | 123 | } |
149 | 124 | } catch (error) { |
150 | | - helpers.error(error); |
| 125 | + toast("Unable to load sponsors..."); |
| 126 | + console.error("Error loading sponsors:", error); |
| 127 | + } |
| 128 | + |
| 129 | + if (!sponsors.length && "cached_sponsors" in localStorage) { |
| 130 | + try { |
| 131 | + sponsors = JSON.parse(localStorage.getItem("cached_sponsors")) || []; |
| 132 | + } catch (error) { |
| 133 | + console.error("Failed to parse cached sponsors", error); |
| 134 | + } |
| 135 | + } |
| 136 | + |
| 137 | + titaniumSponsors.content = ""; |
| 138 | + platinumSponsors.content = ""; |
| 139 | + goldSponsors.content = ""; |
| 140 | + silverSponsors.content = ""; |
| 141 | + bronzeSponsors.content = ""; |
| 142 | + crystalSponsors.content = ""; |
| 143 | + |
| 144 | + for (const sponsor of sponsors) { |
| 145 | + // Append each sponsor to the corresponding tier |
| 146 | + switch (sponsor.tier) { |
| 147 | + case "titanium": |
| 148 | + titaniumSponsors.append(<SponsorCard {...sponsor} />); |
| 149 | + break; |
| 150 | + case "platinum": |
| 151 | + platinumSponsors.append(<SponsorCard {...sponsor} />); |
| 152 | + break; |
| 153 | + case "gold": |
| 154 | + goldSponsors.append(<SponsorCard {...sponsor} />); |
| 155 | + break; |
| 156 | + case "silver": |
| 157 | + silverSponsors.append(<SponsorCard {...sponsor} />); |
| 158 | + break; |
| 159 | + case "bronze": |
| 160 | + bronzeSponsors.append(<SponsorCard {...sponsor} />); |
| 161 | + break; |
| 162 | + case "crystal": |
| 163 | + crystalSponsors.append(<SponsorCard {...sponsor} />); |
| 164 | + break; |
| 165 | + } |
151 | 166 | } |
152 | 167 | } |
153 | 168 | } |
154 | 169 |
|
| 170 | +/** |
| 171 | + * Sponsor Card Component |
| 172 | + * @param {object} props |
| 173 | + * @param {string} props.name - The name of the sponsor |
| 174 | + * @param {string} props.image - The image URL of the sponsor |
| 175 | + * @param {string} props.website - The website URL of the sponsor |
| 176 | + * @param {string} props.tier - The tier of the sponsor |
| 177 | + * @param {string} props.tagline - The tagline of the sponsor |
| 178 | + * @returns {JSX.Element} |
| 179 | + */ |
155 | 180 | function SponsorCard({ name, image, website, tier, tagline }) { |
156 | 181 | // for crystal tier only text, for bronze slightly bigger text, for silver bigger clickable text, |
157 | 182 | // for gold text with image, for platinum and titanium text with big image |
|
0 commit comments