Skip to content

Commit 12672c5

Browse files
committed
opfs auto-cleanup
1 parent 5f34cd9 commit 12672c5

File tree

6 files changed

+64
-11
lines changed

6 files changed

+64
-11
lines changed

ghcjs/delivery-calculator/delivery-calculator.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 2.2
22
name: delivery-calculator
3-
version: 0.1.0.14
3+
version: 0.1.0.15
44
synopsis: Delivery Calculator
55
category: Web
66
build-type: Simple

ghcjs/delivery-calculator/src/App/Types.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ newAsset = do
174174
either throw pure . decodeUtf8Strict . unTagged . htmlUid =<< newUid
175175
let opts =
176176
BlobOpts
177-
{ blobOptsOpfsDir = Just $ "delivery-calculator-" <> vsn,
177+
{ blobOptsOpfsDir = Just $ "delivery-calculator-images",
178178
blobOptsOpfsFile = Just opfs,
179179
blobOptsMaxSizeKb = Just 400000
180180
}

ghcjs/delivery-calculator/src/Main.hs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import App.Widgets.Main
2020
import App.Widgets.Templates
2121
import qualified Data.Generics as Syb
2222
import qualified Data.Map as Map
23+
import qualified Data.Set as Set
2324
import qualified Functora.Miso.Jsm as Jsm
2425
import Functora.Miso.Prelude
2526
import qualified Functora.Money as Money
@@ -131,7 +132,7 @@ updateModel (InitUpdate ext) prevSt = do
131132
. PureUpdate
132133
$ #modelLoading
133134
.~ False
134-
opfsRead sink nextSt
135+
opfsSync sink nextSt
135136
else Jsm.selectStorage ("current-" <> vsn) $ \case
136137
Nothing -> do
137138
liftIO
@@ -140,7 +141,7 @@ updateModel (InitUpdate ext) prevSt = do
140141
. PureUpdate
141142
$ #modelLoading
142143
.~ False
143-
opfsRead sink nextSt
144+
opfsSync sink nextSt
144145
Just uri -> do
145146
finSt <- newModel (nextSt ^. #modelWebOpts) mvSink (Just nextSt) uri
146147
liftIO
@@ -152,7 +153,7 @@ updateModel (InitUpdate ext) prevSt = do
152153
& #modelLoading
153154
.~ False
154155
)
155-
opfsRead sink finSt
156+
opfsSync sink finSt
156157
liftIO
157158
. sink
158159
. PushUpdate
@@ -443,6 +444,11 @@ syncUri uri = do
443444
$ URI.renderStr nextUri
444445
)
445446

447+
opfsSync :: (Action -> IO ()) -> Model -> JSM ()
448+
opfsSync sink st = do
449+
opfsRead sink st
450+
opfsFree st
451+
446452
opfsRead :: (Action -> IO ()) -> Model -> JSM ()
447453
opfsRead sink st =
448454
forM_ (zip [0 ..] assets) . uncurry $ \assetIdx asset -> do
@@ -478,3 +484,39 @@ opfsRead sink st =
478484
)
479485
where
480486
assets = st ^. #modelState . #stAssets
487+
488+
--
489+
-- NOTE : test with
490+
--
491+
-- const root = await navigator.storage.getDirectory(); for await (let name of root.keys()) {console.log(name);} const dir = await root.getDirectoryHandle("delivery-calculator-images"); for await (let name of dir.keys()) {console.log(name);}
492+
--
493+
opfsFree :: Model -> JSM ()
494+
opfsFree st =
495+
forM_ groups $ \case
496+
items@((dir, _) : _) ->
497+
Jsm.opfsList dir $ \case
498+
Nothing -> pure ()
499+
Just opfsFiles -> do
500+
let modelFiles = fromList $ fmap snd items
501+
forM_ opfsFiles $ \file ->
502+
when (Set.notMember file modelFiles)
503+
$ Jsm.opfsRemove
504+
defBlobOpts
505+
{ blobOptsOpfsDir = Just dir,
506+
blobOptsOpfsFile = Just file
507+
}
508+
_ ->
509+
pure ()
510+
where
511+
groups :: [[(Unicode, Unicode)]]
512+
groups =
513+
groupAllOn fst
514+
. catMaybes
515+
. map
516+
( \x ->
517+
(,)
518+
<$> (x ^. #fieldBlobOpts . #blobOptsOpfsDir)
519+
<*> (x ^. #fieldBlobOpts . #blobOptsOpfsFile)
520+
)
521+
. Syb.listify (\(_ :: Field DynamicField Unique) -> True)
522+
$ modelState st

ghcjs/delivery-calculator/trapeze.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
platforms:
22
android:
33
appName: Delivery Calculator
4-
versionCode: 14
5-
versionName: 0.1.0.14
4+
versionCode: 15
5+
versionName: 0.1.0.15
66
packageName: com.functora.delivery_calculator
77
manifest:
88
- file: AndroidManifest.xml

ghcjs/miso-functora/js/main.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ export async function insertStorage(key, value) {
3131
}
3232

3333
export async function compressImage(prevImage, maxSizeKb) {
34-
let opts = { quality: 1 };
34+
//
35+
// TODO : default quality option
36+
//
37+
let opts = { quality: 0.2 };
3538
if (maxSizeKb) {
3639
opts = {
37-
quality: Math.min(1, maxSizeKb / prevImage.size),
40+
quality: Math.min(0.2, maxSizeKb / prevImage.size),
3841
maxWidth: 768,
3942
maxHeight: 768,
4043
};
@@ -79,7 +82,15 @@ export async function resolveDataUrl(value, opts = {}) {
7982
blob = await compressImage(blob, maxSizeKb);
8083
}
8184
if (opts.opfsDir && opts.opfsFile) {
82-
await opfsWrite(value, opts);
85+
const rfc2397 = await new Promise((resolve, reject) => {
86+
var fr = new FileReader();
87+
fr.onload = () => {
88+
resolve(fr.result);
89+
};
90+
fr.onerror = reject;
91+
fr.readAsDataURL(blob);
92+
});
93+
await opfsWrite(rfc2397, opts);
8394
}
8495
return URL.createObjectURL(blob);
8596
} catch (e) {

ghcjs/miso-functora/js/main.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)