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 } 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 => { // TODO: make the limit configurable and show a warning var trunced = got_photos.slice(0, 300); setPhotos(trunced); }); } 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) { 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(','), }, palette: { type: 'light', }, }); export function MainPage() { return ( {({ db_error, db }) => ( <> {(db == null && !db_error) && } {db_error && } {db != null && } )} ); }