Time Zones Are Hard - https://tz.rita.moe

Move to Rita; Fix Share button not visible

And some fixes reported by local SonarQube

+1 -1
Dockerfile
···
COPY . /app
EXPOSE 8080
-
CMD [ "php", "-S", "0.0.0.0:8080", "routing.php" ]
+
CMD [ "php", "-S", "0.0.0.0:8080", "routing.php" ]
+1 -1
LICENSE
···
MIT License
-
Copyright (c) 2023 André "Kody" Fernandes
+
Copyright (c) 2023-2025, Kody (rita.moe)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+2 -2
README.md
···
```bash
# Build it locally if you want, or skip this step to pull from my packages
-
docker build . -t git.rita.moe/kody/tz:latest
+
docker build . -t git.rita.moe/Rita/tz:latest
# Change the first "8080" with the port you want to have on your host
# Or omit "-p 8080:8080" if you're using a reverse-proxy within the docker network
-
docker run -d -p 8080:8080 --name tz git.rita.moe/kody/tz:latest
+
docker run -d -p 8080:8080 --name tz git.rita.moe/Rita/tz:latest
```
+1 -1
css/styles.css
···
-
body{background-color:#efefef;color:#000;font-family:"Trebuchet MS","Lucida Sans Unicode","Lucida Grande","Lucida Sans",Arial,sans-serif;margin:0 auto;max-width:900px}header{background-color:#fff;border-radius:10px;margin:1rem .5rem 0;padding:1rem 1.5rem}header h1{font-size:1.5rem;margin:0}@media screen and (min-width: 500px){header h1{font-size:2rem}}header a{color:inherit;text-decoration:none}header svg{height:1.7rem;vertical-align:-0.3rem;width:1.7rem}@media screen and (min-width: 500px){header svg{height:2rem;width:2rem}}main{padding:1rem 2rem}main h2{font-size:1.5rem;margin:1rem 0;text-align:center}main h2 span{font-size:1.2rem}main form{line-height:2rem}main form label{cursor:pointer;margin-right:.2rem}@media screen and (max-width: 499px){main form label{display:block}main form input,main form select{width:100%}}main button{cursor:pointer;margin-top:1rem}main .tz-table{display:flex;flex-wrap:wrap;justify-content:center;text-align:center}main .tz-table .tz-table-element{flex:0 0 calc(100% - 1rem);margin:.5rem}@media screen and (min-width: 440px){main .tz-table .tz-table-element{flex:0 0 calc(50% - 1rem)}}@media screen and (min-width: 630px){main .tz-table .tz-table-element{flex:0 0 calc(33% - 1rem)}}@media screen and (min-width: 820px){main .tz-table .tz-table-element{flex:0 0 calc(25% - 1rem)}}main .share{display:none;margin-top:1rem;text-align:center}footer{color:#444;font-size:.7rem;margin-top:1rem;padding:1rem;text-align:center}footer a{color:inherit}@media screen and (prefers-color-scheme: dark){body{background-color:#111;color:#fff}header{background-color:#000}footer{color:#b5b5b5}}/*# sourceMappingURL=styles.css.map */
+
body{background-color:#efefef;color:#000;font-family:"Trebuchet MS","Lucida Sans Unicode","Lucida Grande","Lucida Sans",Arial,sans-serif;margin:0 auto;max-width:900px}header{background-color:#fff;border-radius:10px;margin:1rem .5rem 0;padding:1rem 1.5rem}header h1{font-size:1.5rem;margin:0}@media screen and (min-width: 500px){header h1{font-size:2rem}}header a{color:inherit;text-decoration:none}header svg{height:1.7rem;vertical-align:-0.3rem;width:1.7rem}@media screen and (min-width: 500px){header svg{height:2rem;width:2rem}}main{padding:1rem 2rem}main h2{font-size:1.5rem;margin:1rem 0;text-align:center}main h2 span{font-size:1.2rem}main form{line-height:2rem}main form label{cursor:pointer;margin-right:.2rem}@media screen and (max-width: 499px){main form label{display:block}main form input,main form select{width:100%}}main button{cursor:pointer;margin-top:1rem}main .tz-table{display:flex;flex-wrap:wrap;justify-content:center;text-align:center}main .tz-table .tz-table-element{flex:0 0 calc(100% - 1rem);margin:.5rem}@media screen and (min-width: 440px){main .tz-table .tz-table-element{flex:0 0 calc(50% - 1rem)}}@media screen and (min-width: 630px){main .tz-table .tz-table-element{flex:0 0 calc(33% - 1rem)}}@media screen and (min-width: 820px){main .tz-table .tz-table-element{flex:0 0 calc(25% - 1rem)}}main .share{margin-top:1rem;text-align:center}footer{color:#444;font-size:.7rem;margin-top:1rem;padding:1rem;text-align:center}footer a{color:inherit}@media screen and (prefers-color-scheme: dark){body{background-color:#111;color:#fff}header{background-color:#000}footer{color:#b5b5b5}}/*# sourceMappingURL=styles.css.map */
+1 -1
css/styles.css.map
···
-
{"version":3,"sourceRoot":"","sources":["styles.scss"],"names":[],"mappings":"AAAA,KACE,yBACA,WACA,gGACA,cACA,gBAGF,OACE,sBACA,mBACA,oBACA,oBAEA,UACE,iBACA,SAEA,qCAJF,UAKI,gBAIJ,SACE,cACA,qBAGF,WACE,cACA,uBACA,aAEA,qCALF,WAMI,YACA,YAKN,KACE,kBAEA,QACE,iBACA,cACA,kBAEA,aACE,iBAIJ,UACE,iBAEA,gBACE,eACA,mBAGF,qCACE,gBACE,cAGF,iCAEE,YAKN,YACE,eACA,gBAGF,eACE,aACA,eACA,uBACA,kBAIA,iCACE,2BACA,OAJQ,MAMR,qCAJF,iCAKI,2BAGF,qCARF,iCASI,2BAGF,qCAZF,iCAaI,2BAKN,YACE,aACA,gBACA,kBAIJ,OACE,WACA,gBACA,gBACA,aACA,kBAEA,SACE,cAIJ,+CACE,KACE,sBACA,WAGF,OACE,sBAGF,OACE","file":"styles.css"}
+
{"version":3,"sourceRoot":"","sources":["styles.scss"],"names":[],"mappings":"AAAA,KACE,yBACA,WACA,gGACA,cACA,gBAGF,OACE,sBACA,mBACA,oBACA,oBAEA,UACE,iBACA,SAEA,qCAJF,UAKI,gBAIJ,SACE,cACA,qBAGF,WACE,cACA,uBACA,aAEA,qCALF,WAMI,YACA,YAKN,KACE,kBAEA,QACE,iBACA,cACA,kBAEA,aACE,iBAIJ,UACE,iBAEA,gBACE,eACA,mBAGF,qCACE,gBACE,cAGF,iCAEE,YAKN,YACE,eACA,gBAGF,eACE,aACA,eACA,uBACA,kBAIA,iCACE,2BACA,OAJQ,MAMR,qCAJF,iCAKI,2BAGF,qCARF,iCASI,2BAGF,qCAZF,iCAaI,2BAKN,YACE,gBACA,kBAIJ,OACE,WACA,gBACA,gBACA,aACA,kBAEA,SACE,cAIJ,+CACE,KACE,sBACA,WAGF,OACE,sBAGF,OACE","file":"styles.css"}
-1
css/styles.scss
···
}
.share {
-
display: none;
margin-top: 1rem;
text-align: center;
}
+13 -15
index.php
···
];
// User sets timezone cookie
-
if (isset($_POST['user-tz'])) {
-
// Just check it's valid
-
if (in_array($_POST['user-tz'], timezone_identifiers_list(DateTimeZone::ALL))) {
-
setcookie('user-tz', $_POST['user-tz'], time() + 60 * 60 * 24 * 365);
-
$_COOKIE['user-tz'] = $_POST['user-tz'];
-
}
+
if (isset($_POST['user-tz']) &&
+
in_array($_POST['user-tz'], timezone_identifiers_list(DateTimeZone::ALL))) {
+
setcookie('user-tz', $_POST['user-tz'], time() + 60 * 60 * 24 * 365);
+
$_COOKIE['user-tz'] = $_POST['user-tz'];
}
// User sets 24 hours
···
// Redirect, with the "+" replaced by "_"
header('Location: /' . str_replace('+', '_', $dateObj->format('c')));
exit;
-
} else if ($_SERVER['REQUEST_URI'] !== '/') {
+
} elseif ($_SERVER['REQUEST_URI'] !== '/') {
// Remove leading "/"
$req = substr($_SERVER['REQUEST_URI'], 1);
···
?>
<!DOCTYPE html>
<!--
-
Source code: https://git.rita.moe/kody/tz
+
Source code: https://git.rita.moe/Rita/tz
License: MIT
-->
<html lang="en">
···
<form action="/" method="post">
<button type="submit">Go back home</button>
</form>
-
<?php } else if (isset($dt)) { ?>
+
<?php } elseif (isset($dt)) { ?>
<h2 class="local">
<noscript>
<?php
···
$hm = $_COOKIE['user-24'] === '1' ? 'H:i' : 'h:i a';
// I put spaces just so it looks nice in the source code
echo ' ' . toTZ($dt, $_COOKIE['user-tz'], 'l \t\h\e jS \o\f F, Y \a\t ' . $hm) . PHP_EOL;
-
} else if ($_COOKIE['has-js'] !== '1') {
+
} elseif ($_COOKIE['has-js'] !== '1') {
?>
Please select your local time zone <small>(or enable JavaScript)</small>:<br/>
<form method="post">
···
</div>
<div class="share">
-
<input type="hidden" id="url" value="https://tz.kdy.ch<?= $_SERVER['REQUEST_URI'] ?>"/>
+
<input type="hidden" id="url" value="https://tz.rita.moe<?= $_SERVER['REQUEST_URI'] ?>"/>
</div>
<script>
···
if (navigator.canShare) {
// Use native navigator share
navigator.share({
-
url: 'https://tz.kdy.ch<?= $_SERVER['REQUEST_URI'] ?>'
+
url: 'https://tz.rita.moe<?= $_SERVER['REQUEST_URI'] ?>'
})
} else if (navigator.clipboard) {
// Use Clipboard API
-
navigator.clipboard.writeText('https://tz.kdy.ch<?= $_SERVER['REQUEST_URI'] ?>')
+
navigator.clipboard.writeText('https://tz.rita.moe<?= $_SERVER['REQUEST_URI'] ?>')
.then(() => {
alert('URL copied to clipboard!')
})
···
</main>
<footer>
-
&copy; <?= date('Y') ?> Kody - Made with 🍮<br/>
+
&copy; <?= date('Y') ?> rita.moe - Made with 🍮<br/>
<a href="https://thenounproject.com/icon/wall-clock-5456766/" target="_blank" title="Wall Clock Icon" rel="noopener">Wall Clock by Basicon</a> from Noun Project (CC BY 3.0)
</footer>
<?php if ($_COOKIE['has-js'] !== '1') { ?>
···
</script>
<?php } ?>
</body>
-
</html>
+
</html>
+1 -1
routing.php
···
// Or load our script
$_SERVER['SCRIPT_NAME'] = '/index.php';
-
require 'index.php';
+
require_once 'index.php';