import React, { useEffect } from 'react'; import { makeStyles } from '@material-ui/core/styles'; import Box from '@material-ui/core/Box'; import { createMuiTheme, ThemeProvider } from '@material-ui/core/styles'; import { SearchBar } from './searchbar.js'; import { InternalErrorPage } from './error.js'; import { LoadingPage } from './loading.js'; import { ProvideDB, DBTypeEnum, DBSourceEnum } from './database.js'; import { UserQuery, user_query_from_search_string, maybe_image_query, do_image_query, maybe_album_query, do_album_query, maybe_tag_query, do_tag_query, ConstFilter, ResultTypeEnum } from './queries.js'; import { Browser } from './browser.js'; import { UserQueryWidget } from './userquerywidget.js'; import { ResultsView } from './resultsview.js'; const useStyles = makeStyles(theme => ({ root: { display: "table", "border-spacing": "6px", width: "100%", }, navigator: { display: "table-cell", "width": "300px", border: "1px solid black", "border-radius": "3px", "vertical-align": "top", }, searchandview: { display: "table-cell", width: "auto", border: "1px solid black", "border-radius": "3px", "vertical-align": "top", }, margined: { margin: "6px", }, })); export function LoadedMainPage(props) { const classes = useStyles(); const [gallery_user_query, setGalleryUserQuery] = React.useState(new UserQuery()); const [photos, setPhotos] = React.useState([]); const [allAlbums, setAllAlbums] = React.useState([]); const [allTags, setAllTags] = React.useState([]); const [albums, setAlbums] = React.useState([]); const [tags, setTags] = React.useState([]); const { database, photos_dir, thumbs_dir } = props; var _ = require('lodash'); useEffect(() => { // Single-fire effect to start retrieving the albums and tags lists. var blank_user_query = new UserQuery(); blank_user_query.album_filter = new ConstFilter(ResultTypeEnum.ALBUM, true); blank_user_query.tag_filter = new ConstFilter(ResultTypeEnum.TAG, true); var sql_album_query = maybe_album_query(blank_user_query); var sql_tag_query = maybe_tag_query(blank_user_query); do_album_query(sql_album_query, database) .then(albums => { setAllAlbums(albums); }); do_tag_query(sql_tag_query, database) .then(tags => { setAllTags(tags); }); }, [database]); useEffect(() => { updateAllResults(gallery_user_query); }, [database, photos_dir, thumbs_dir]); function updateAllResults(q) { updateTags(q); updateAlbums(q); updatePhotos(q); } function updatePhotos(q) { var sql_image_query = maybe_image_query(q, database); setPhotos(false); do_image_query(sql_image_query, database, photos_dir, thumbs_dir) .then(got_photos => { setPhotos(got_photos); }); } function updateTags(q) { var sql_tag_query = maybe_tag_query(q, database); setTags(false); do_tag_query(sql_tag_query, database) .then(tags => { setTags(tags); }); } function updateAlbums(q) { var sql_album_query = maybe_album_query(q, database); setAlbums(false); do_album_query(sql_album_query, database) .then(albums => { setAlbums(albums); }); } function onNewQuery(q) { console.log(q.image_filter, " ?= ", gallery_user_query.image_filter); var do_update_photos = !_.isEqual(q.image_filter, gallery_user_query.image_filter); var do_update_albums = !_.isEqual(q.album_filter, gallery_user_query.album_filter); var do_update_tags = !_.isEqual(q.tag_filter, gallery_user_query.tag_filter); setGalleryUserQuery(q); if (do_update_photos) { updatePhotos(q); } if (do_update_albums) { updateAlbums(q); } if (do_update_tags) { updateTags(q); } } function onSearch(q) { var query = user_query_from_search_string(q); onNewQuery(query); } return ( <> {albums && } {photos && } ); } const theme = createMuiTheme({ typography: { fontFamily: ['Roboto', 'sans-serif'].join(','), }, }); export function MainPage() { return ( {({ loading, error, done, db }) => ( <> {loading && } {error && } {done && } )} ); }